1. 개요
실습하고 있는 회사에서 ORM으로 JPA가 아닌 MyBatis를 사용한다고 합니다. 따라서 이번 포스팅에서는 MyBatis에 대한 기초적인 내용을 알아보도록 하겠습니다.
2. Spring Boot 에서 MyBatis 환경 구축
필요한 의존성은 다음과 같습니다.
•
spring-core
•
spring-jdbc
•
mybatis
•
mybatis-spring
build.gradle
implementation 'org.springframework:spring-core:5.3.10'
implementation 'org.springframework:spring-jdbc:5.3.10'
implementation 'org.mybatis:mybatis:3.5.7'
implementation 'org.mybatis:mybatis-spring:2.0.6'
Java
복사
application.yml 에는 동일하게 데이터 베이스를 연결해줍니다.
// Database Information
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/mydatabase
username: username
password: password
mybatis:
// Mapper XML Location
mapper-locations = classpath:mappers
// myBatis 패키지 명 생략
// xml 파일에 resultType에 패키지 명 생략 가능
type-aliases-package = com.example.domain ...
// 프로퍼티 camel case 설정
configuration:
map-underscore-to-camel-case = true
Java
복사
2-1. Mapper Interface
그 다음 Mapper 인터페이스를 작성합니다.
Mapper Interface란 mapping 파일에 기재된 SQL을 호출하기 위한 Interface 입니다. 즉, mapping 파일에 있는 SQL을 Java Interface를 통해 호출할 수 있게 만듭니다.
JPA를 사용할 때 Repository 인터페이스가 JpaRepository를 상속하여 커스텀 된 메소드를 호출할 수 있는 것과 유사합니다.
JPA와 MyBatis의 차이점
예제 코드는 다음과 같습니다.
import org.apache.ibatis.annotations.Mapper;
import com.example.demo.entity.Fruit;
@Mapper
public interface FruitMapper {
Fruit selectById(String fruitId);
}
Java
복사
이제 XML 파일을 생성하는데 이 때 경로는 src/main/resources/mappers 에 위치합니다.
<?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.example.demo.repository.FruitMapper">
<select id="selectById" resultType="com.example.demo.entity.Fruit">
SELECT * FROM tbl_fruit WHERE fruitId = #{fruitId}
</select>
</mapper>
Java
복사
조금 더 자세히 볼까요
그렇다면 Mapper Interface를 사용하지 않는다면 어떤 일이 벌어질까요?
우선 궁극적인 목표는 XML 파일 내에 있는 SQL 문과 연동을 하는 것입니다. 만약 Mapper Interface가 없다고 가정했을 때, selectById() 라는 메소드가 XML 파일 내에 있는 SQL과 매치되려면 다음과 같은 메소드가 필요합니다.
SqlSession.selectOne("com.example.demo.repository.FriutMapper.selectById", fruitId);
Java
복사
즉, 코드의 경로를 직접 문자열로 지정해야 합니다.
반면 Mapper Interface를 사용하면 손쉽게 작성 가능합니다.
<mapper namespace="com.example.demo.repository.FruitMapper">
<select id="selectById" resultType="com.example.demo.entity.Fruit">
...
Java
복사
참고로 namespace에는 패키지를 포함한 Mapper Interface 명을 입력하고, SQL id 에는 mapping 하는 method 명을 입력합니다.
2-2. Service Layer
Service 단에서의 사용은 기존 Repository를 사용하는 것과 유사하게 의존성을 주입해서 사용합니다.
@Service
public class MyService {
@Autowired
FruitMapper fruitMapper;
public Fruit getFruit(String no) {
return fruitMapper.selectById(no);
}
}
Java
복사
3. MyBatis 동적 쿼리 문법
동적 SQL란 상황에 따라 분기 처리를 통해 SQL문을 동적으로 만드는 것을 의미한다