Notice
Recent Posts
Recent Comments
Link
관리 메뉴

look-forest

MyBatis 본문

Spring/Spring 데이터 접근 - 활용 기술

MyBatis

studyHub 2024. 8. 17. 14:52

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 사용법

  1. 마이바티스 매핑 XML을 호출해주는 매퍼 인터페이스 추가 (@Mapper 애노테이션을 붙여주어야 인식)
    이 인터페이스의 메서드를 호출하면  xml 의 해당 SQL을 실행하고 결과를 돌려준다.
  2. resoureces의 같은 위치에 실행할 SQL이 있는 XML 매핑 파일을 만듦(namespace에 앞서 만든 매퍼 인터페이스 지정)

  3. 리포지토리 생성

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

 


 

@Mapper 인터페이스의 구현체

ItemMapper 매퍼 인터페이스의 구현체가 없는데 어떻게 동작한 것일까?

MyBatis 스프링 연동 모듈에서 다음과 같이 자동으로 처리해준다.

  1. 애플리케이션 로딩 시점에 MyBatis 스프링 연동 모듈은 @Mapper 가 붙어있는 인터페이스를 조사한다.
  2. 해당 인터페이스가 발견되면 동적 프록시 기술을 사용해서 ItemMapper 인터페이스의 구현체를 만든다.
  3. 생성된 구현체를 스프링 빈으로 등록한다.

매퍼 구현체

  • 매퍼 구현체 덕분에 마이바티스를 스프링에 편리하게 통합해서 사용할 수 있다.
  • 매퍼 구현체를 사용하면 스프링 예외 추상화도 함께 적용된다.
  • 마이바티스 스프링 연동 모듈이 많은 부분을 자동으로 설정해주는데, 데이터베이스 커넥션, 트랜잭션과 관련된 기능도 마이바티스와 함께 연동하고, 동기화해준다.

 


MyBatis 기능 정리1 - 동적 쿼리

동적 쿼리를 위해 제공되는 기능은 다음과 같다.

if
choose (when, otherwise)
trim (where, set)

 

foreach (파라미터로 리스트를 전달)

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