JPA 를 사용하다보면 정말로 갈아 엎고 싶다는 생각이 많이 드네요.
연관관계가 복잡해지다 보면 간단하게 사용할 수 있는 JPA 가 꼭 필요한지 생각이 들곤 합니다.
그래서 조금 복잡한 쿼리를 진행하기 위해 MyBatis 를 적용해 보겠습니다.
build.gradle 에서 MyBatis 의존성을 추가 합니다.
버전은 조금씩 다를 수 있습니다.
dependencies {
// MyBatis
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.0'
}
application.yml 파일에서 datasource 설정을 해줍니다.
DB를 사용하신다면 무조건 해줘야 하는 부분입니다.
# ===============================
# = DATA SOURCE (MARIADB)
# ===============================
datasource:
# 기본 DB
url: jdbc:mariadb://gigas.synology.me:3306/xxx
username: xxx
password: xxx
기존에 DAO로 사용하던 부분입니다.
Interface에서 메서드를 생성한 후 Mapper를 호출해서 사용하던 방식은 아닙니다.
XML이 아닌 java코드로 간단하게 코드를 작성할 수 있습니다.
@Mapper 어노테이션으로 Mapper등록을 합니다.
@Select 어노테이션처럼 CRUD 를 선언해서 사용할 수 있습니다.
@Mapper
public interface UserMapper {
/**
* userNo 로 User 조회
* @param userNo
* @return
*/
@Select("SELECT * FROM user WHERE user_no = #{user_no}")
User getUser(@Param("user_no") Long userNo);
}
테스트 코드로 데이터를 찍어서 잘 돌아가는지 확인할 수 있습니다.
@RunWith(SpringRunner.class)
@SpringBootTest
public class PersistenceTests {
@Autowired
private UserMapper userMapper;
@Test
public void USER_MAPPER_TEST() {
User user = userMapper.getUser(1L);
System.err.println(user.toString());
}
}
XML 을 사용하시는 분들은 application.yml 에 mybatis 속성을 추가 하여야 합니다.
type-aliases-package 는 result 도메인 패키지 경로를 작성합니다.
mapper-locations 는 mapper 파일 경로인데 resources 경로안에 mapper 폴더를 만들어 주겠습니다.
# ===============================
# = MYBATIS CONFIG
# ===============================
mybatis:
type-aliases-package: com.xxx.xxxx
mapper-locations: mapper/**/*.xml
UserMapper.xml 을 만들어 아래와 같이 select 문을 추가했습니다.
여기서 나오는 id 가 Mapper가 UserMapper 메서드와 매핑이 되어집니다.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTO Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xxx.xxx.persistence.UserMapper">
<!-- userNo로 User조회 -->
<select id="findByUserNo" parameterType="Integer" resultType="UserVO">
SELECT *
FROM user
WHERE user_no = #{userNo}
</select>
</mapper>
@Select 어노테이션을 사용하지 않고 아래와 같이 사용합니다.
테스트는 동일합니다.
@Mapper
public interface UserMapper {
/**
* userNo 로 User 조회
* @param userNo
* @return
*/
UserVO findByUserNo(Long userNo);
}
정말 간단하게 설정부분도 필요없이 의존성을 추가하고 Mapper 를 만들어 보았습니다.
복잡한 코드는 XML로 따로 분리를 해서 사용하는게 좋고 간단한 쿼리는 어노테이션으로 진행하는걸 추천드립니다.