| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 |
- DLQ
- 쿠버네티스
- @ComponentScan
- docker compose
- docker
- 페이징
- 지연 로딩
- JWT
- Routing Key
- redis
- JdbcTemplate
- AWS
- CORS
- mybatis
- Spring Container
- 컨테이너
- dockerhub
- 스프링 부트
- Web
- @Transactional
- 서블릿 컨테이너
- MSA
- Dead Letter Queue
- JPQL
- JPA
- Spring Data JPA
- Spring
- securitycontextholderfilter
- kafka
- DI
- Today
- Total
look-forest
MyBatis 본문
MyBatis 소개
MyBatis는 앞서 설명한 JdbcTemplate보다 더 많은 기능을 제공하는 SQL Mapper 이다. 기본적으로 JdbcTemplate이 제공하는 대부분의 기능을 제공한다. JdbcTemplate과 비교해서 MyBatis의 가장 매력적인 점은 SQL을 XML에 편리하게 작성할 수 있고 또 동적 쿼리를 매우 편리하게 작성할 수 있다는 점이다.
JdbcTemplate은 스프링에 내장된 기능이고, 별도의 설정없이 사용할 수 있다는 장점이 있다. 반면에 MyBatis는 약간의 설정이 필요하다.
MyBatis는 XML에 작성하기 때문에 라인이 길어져도 문자 더하기에 대한 불편함이 없다.

MyBatis는 동적 쿼리를 매우 편리하게 작성 할 수 있는 다양한 기능들을 제공해준다.

MyBatis는 기능도 단순하고 또 공식 사이트가 한글로 잘 번역되어 있어서 원하는 기능을 편리하게 찾아볼 수 있다.
공식 사이트
https://mybatis.org/mybatis-3/ko/index.html
application.properties 설정
- mybatis.type-aliases-package : 마이바티스에서 타입 정보를 사용할 때는 패키지 이름을 적어주어야 하는데, 여기에 명시하면 패키지 이름을 생략할 수 있다. 지정한 패키지와 그 하위 패키지가 자동으로 인식된다. 여러 위치를 지정하려면 , ; 로 구분하면 된다.
- mybatis.configuration.map-underscore-to-camel-case : JdbcTemplate의 BeanPropertyRowMapper 에서 처럼 언더바를 카멜로 자동 변경해주는 기능을 활성화 한다. 바로 다음에 설명하는 관례의 불일치 내용을 참고하자.
- logging.level.hello.itemservice.repository.mybatis=trace : MyBatis에서 실행되는 쿼리 로그를 확인할 수 있다
- mybatis.mapper-locations=classpath:mapper/**/*.xml : XML 파일을 원하는 위치에 두고 싶을 경우
MyBatis 사용법
- 마이바티스 매핑 XML을 호출해주는 매퍼 인터페이스 추가 (@Mapper 애노테이션을 붙여주어야 인식)
이 인터페이스의 메서드를 호출하면 xml 의 해당 SQL을 실행하고 결과를 돌려준다. - resoureces의 같은 위치에 실행할 SQL이 있는 XML 매핑 파일을 만듦(namespace에 앞서 만든 매퍼 인터페이스 지정)
- 리포지토리 생성

xml 문법- id 에는 매퍼 인터페이스에 설정한 메서드 이름을 지정
- 파라미터는 #{} 문법을 사용하면 된다. 그리고 매퍼에서 넘긴 객체의 프로퍼티 이름을 적어주면 된다
- useGeneratedKeys 는 데이터베이스가 키를 생성해 주는 IDENTITY 전략일 때 사용한다.
keyProperty 는 생성되는 키의 속성 이름을 지정한다. Insert가 끝나면 item 객체의 id 속성에 생성된 값이 입력됨. - 파라미터가 1개만 있으면 @Param 을 지정하지 않아도 되지만, 파라미터가 2개 이상이면 @Param 으로 이름을 지정해서 파라미터를 구분
- resultType 은 반환 타입을 명시.
BeanPropertyRowMapper 처럼 SELECT SQL의 결과를 편리하게 객체로 바로 변환해준다. - 자바 코드에서 반환 객체가 하나이면 Item , Optional 과 같이 사용하면 되고, 반환 객체가 하나 이상이면 컬렉션을 사용하면 된다. 주로 List 를 사용한다.
- <if>는 해당 조건이 만족하면 구문을 추가한다.
- <where>은 적절하게 where 문장을 만들어준다.
<if>가 하나라도 성공하면 처음 나타나는 and를 where로 변환, 모두 실패하면 where을 만들지 않는다. - 특수문자 : < : < >: > & : &
CDATA에서는 특수문자 가능하나 태그 불가. <![CDATA[ and price <= #{maxPrice} ]]>


@Mapper 인터페이스의 구현체
ItemMapper 매퍼 인터페이스의 구현체가 없는데 어떻게 동작한 것일까?
MyBatis 스프링 연동 모듈에서 다음과 같이 자동으로 처리해준다.

- 애플리케이션 로딩 시점에 MyBatis 스프링 연동 모듈은 @Mapper 가 붙어있는 인터페이스를 조사한다.
- 해당 인터페이스가 발견되면 동적 프록시 기술을 사용해서 ItemMapper 인터페이스의 구현체를 만든다.
- 생성된 구현체를 스프링 빈으로 등록한다.
매퍼 구현체
- 매퍼 구현체 덕분에 마이바티스를 스프링에 편리하게 통합해서 사용할 수 있다.
- 매퍼 구현체를 사용하면 스프링 예외 추상화도 함께 적용된다.
- 마이바티스 스프링 연동 모듈이 많은 부분을 자동으로 설정해주는데, 데이터베이스 커넥션, 트랜잭션과 관련된 기능도 마이바티스와 함께 연동하고, 동기화해준다.
MyBatis 기능 정리1 - 동적 쿼리
동적 쿼리를 위해 제공되는 기능은 다음과 같다.




MyBatis 기능 정리2 - 기타 기능
재사용 가능한 SQL 조각
<sql>을 사용하면 SQL 코드를 재사용 할 수 있다. <include>를 통해서 <sql> 조각을 찾아서 사용할 수 있다.

Result Maps
컬럼명과 객체의 프로퍼티 명이 다를때, 별칭이 아니라 resultMap을 선언해서 사용할 수도 있다.

참고 자료 & 이미지 출처
스프링 DB 2편 - 데이터 접근 기술 (김영한 님)
'Spring > Spring 데이터 접근 - 활용 기술' 카테고리의 다른 글
| 데이터 접근 기술 - 활용 방안 (2) | 2024.09.02 |
|---|---|
| QueryDSL : type-safe Query (0) | 2024.08.31 |
| 스프링 데이터 JPA (0) | 2024.08.18 |
| JPA (0) | 2024.08.17 |
| 데이터 접근 기술 - 스프링 JdbcTemplate (0) | 2024.08.17 |