FireDrago

[Spring] MyBatis 사용하기 본문

프로그래밍/Spring

[Spring] MyBatis 사용하기

화이용 2024. 3. 7. 12:47

JDBCTemplate 과 함께 Spring에서 많이 사용되는 SQLMapper 기술로 MyBatis가 있다. 

MyBatis는 JDBCTemplate 보다 동적 쿼리 사용이 편리하다. 대신 설정이 필요하다.

스프링에서 MyBatis를 사용하는 방법을 단계별로 알아보자 

 

1. 의존성 추가

 

build.gradle 에 의존성을 추가한다.  스프링이 알아서 버전 관리 해주지 않기 때문에 버전을 잘 확인해야한다.

3.0.1 버전을 사용하여 버전이 맞지 않을때, 위와같은 오류가 발생하였다.

 

2. application.properties 설정

mybatis.type-aliases-package 마이바티스에서 사용할 타입의 패키지 경로를 설정한다.
타입을 쓸때, 패키지 경로를 생략 할 수 있다. 
도메인의 Item 객체를 사용하기 위한 설정을 해주었다.
mybatis.configuration.map-underscore-to-camel-case
= true / false
자바의 카멜표기법과 DB의 스네이크 표기법 변환을 설정한다.
DB의 item_name 칼럼을 조회해도 객체의 itemName 속성에 저장된다
logging.level.hello.itemservice.repository.mybatis 
= trace
MyBatis에서 실행되는 쿼리 로그를 확인할 수 있다.
mybatis.mapper-locations = classPath:mapper/*/**.xml 쿼리를 설정하는 xml 파일은 Mapper 인터페이스와 같은 경로상에 
위치하는 것이 원칙인데, 다른 경로를 설정할때 사용한다.
예문은 resource/mapper 하위 경로의 모든  xml 파일을 읽는다

 

추가적으로 test 경로에서 application.properties 가 따로 설정되어 있다면

test 경로에도 설정을 해주어야 MyBatis를 사용할 수 있다.

 

3. Mapper 인터페이스 작성

MyBatis 를 사용할때는 Mapper 인터페이스를 사용하는데, @Mapper 애너테이션이 붙은 인터페이스를

MyBatis 스프링 연동 모듈이 조회하고 동적 프록시 기술을 사용하여 구현체를 만들어 스프링 빈으로 등록한다.

Repository 객체에서 주입받아 사용할때는 Mapper 인터페이스 타입으로 주입받으면 프록시 구현체가 주입된다.

 

Mapper 인터페이스 에서는 @Mapper 애너테이션을 붙인다. (MyBatis 스프링 연동모듈이 인식할수 있도록)

각각의 메서드에 파라미터가 두개 이상일때는 @Param("이름") 애너테이션을 붙여주어 파라미터를 구분해준다.

 

4.XML 쿼리 작성

 

insert 문 부터 살펴보자 id 에 Mapper 인터페이스의 메서드 이름을 써준다.

useGeneratedKeys = "true" 로 DB가 생성하는 pk 키가 있음을 알리고

keyProperty = "id" id 속성이 생성되는 키값으로 설정한다 

insert 가 끝나면 Item 객체의 id 속성에 생성된 값이 입력된다.

 

MyBatis 는 파라미터로 "#{}" 문법을 사용한다. save (Item item) 메서드에서 전달된 Item 객체의 

itemName 속성을 꺼낼때 #{itemName} 만 써주면된다. 파라미터가 1개일때는 파라미터명을 쓸 필요가 없지만,

두개 이상일때는 파라미터 값을 써서 객체 파라미터를 구분해줘야 한다.

 

update문 에서는 파라미터가 두개 사용되었으므로 #{updateParam.itemName}으로 파라미터 객체명을 표기했다.

 

select 문에서는 resultType = "Item" 으로 Item 객체를 타입으로 받을것을 선언했는데, 

초기 설정에서 타입의 패키지경로를 설정했기때문에,

(application.propertiesmybatis.type-aliasespackage=hello.itemservice.domain)

Item 객체타입만 표기하면 된다.

 

findById 메서드는 Optional<Item> ,

findAll 메서드는 List<Item> 을 받지만

resultType = "Item" 만 표기해도 된다.

 

findAll 메서드에서는 <where> <if > 문을 통해 동적 쿼리를 사용하고 있다.

<if> 문은 조건이 만족하면 구문을 추가한다.

<where> 문은 <if> 가 모두 실패하면 where 를 만들지 않고,

<if>가 하나라도 성공하면 처음 나타나는 and 를 where 로 변환한다.

 

5. Repository 작성 및 Configuration 설정

Repository  에서는 DataSource 대신 ItemMapper 타입의 인터페이스를 주입받으면 된다.

 

save 메서드에서 item 객체에 id를 설정해주지 않아도 된다. 이미 xml 설정에서 

item 객체에 id 속성에 DB 생성된 값을 입력하도록 설정했기 때문이다. 

 

 

MyBatis 추가기능

<애너테이션으로 SQL 작성>

XML 파일 대신에 Mapper 인터페이스에 애너테이션으로 SQL을 작성할 수 있다. 다만 동적 쿼리는 사용할 수 없다. 

애노테이션으로 SQL 작성에 대한 더 자세한 내용은 다음을 참고하자.
https://mybatis.org/mybatis-3/ko/java-api.html

 

 

<Alias 와 ResultMap>

카멜표기법과 스네이크 표기법은 설정으로 변경할 수 있었다.

그러나 칼럼명과 객체 속성값이 아예 다른 경우는 Alias 표기법을 사용하거나 ResultMap을 사용해야 한다.

 

'프로그래밍 > Spring' 카테고리의 다른 글

[Spring] 스프링 트랜잭션 이해  (0) 2024.03.15
[Spring] 스프링 데이터 JPA  (0) 2024.03.11
[Spring] DB 연결을 테스트 하기  (0) 2024.03.06
[Spring] DB 예외처리  (0) 2024.03.02
[Spring] 트랜잭션과 스프링  (0) 2024.02.28