MyBatis가 뭐냐면 jdbcTemplate의 기능들도 포함하며 동적쿼리 등에서 더 편리하게 작성할 수 있는 SQL Mapper이다. 가장 매력적인건 sql을 xml에 편리하게 작성할 수 있고 동적쿼리도 편리하게 작성할 수 있다 함.



작성은 편리하지만 jdbcTemplate는 기본적으로 들어있어 그냥 사용할 수 있는 반면 MyBatis는 사용하려면 약간의 설정이 필요하다.
사실 왠만하면 JPA같은 ORM도 왠만큼 복잡한 동적쿼리 같은것도 지원해서 가끔 sql을 쌩으로 작성해야 될 때 jdbcTemplate로 대부분 처리가 가능하다고 한다. 하지만 MyBatis를 사용해도 좋고 둘다 써도 상관없다. 그냥 좋을대로 쓰면 된다.
MyBatis – 마이바티스 3 | 소개
마이바티스는 무엇인가? 마이바티스는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다. 마이바티스는 JDBC로 처리하는 상당부분의 코드와
mybatis.org
설정 방법은 스프링에서 기본으로 지원해주는게 아니니 버전명을 명시하며 설치하고, 프로퍼티에서 설정해주면 된다.



테스트용 프로퍼티도 만들었으니 테스트용에도 만드는걸 잊지말자.
map-underscore-to-camel-case는 기본이 false인데 true로 바꿔준다. 이유는 db의 snake를 자바 객체의 camel로 바꿔주는 db의 as 로 불러오는거 자동으로 해주는거다.

적용하는 방법을 보자.


원하는 패키지에 이름 정하고 mybatis패키지의 @Mapper를 쓰면 된다. 특이한건 인터페이스로 정의한다. 그 다음 xml를 작성해야 하는데 java파일 외의 것들은 resources 밑에 넣도록 되어있으며, 폴더 명이 정확히 같아야 한다. 그러므로 resources 밑에 정확히 같은 경로에 확장자만 다르게 같은 이름으로 작성한다.
이 xml 파일이 인터페이스에서 정의한 것과 매칭이 되서 id는 함수명이고 resultType은 반환객체고 등이 있다. 이름으로 파라미터를 정의하는것이 named template와 비슷하다. 주목할건 where절인데, 만약 where 안에 있는 if문들 중 하나도 만족하는게 없으면 그냥 where 자체가 생략되어서 문법 오류가 안난다. 꺽쇠 특수문자는 예외용 특수문자 해주고 싫으면 CDATA라는걸 사용해도 되는데 원하는거 쓰자.


이제 한번 써보자. repository를 mybatis껄로 바꾸기 위해 새로 정의한다. 안의 함수도 이미 xml로 해놨기 때문에 간단하다.


config의 경우 dataSource대신 itemMapper를 주입받는다. 그럼 dataSource를 어떻게 알고 하냐?? mybatis가 알아서 dataSource를 찾는다.

위에서 작성한 mybatis용 config를 등록한다.
이제 테스트 해보면 잘 됨을 볼 수 있다.


trace를 true로 했기 때문에 로그가 보이는데, mybatis로 등록 및 xml로 작성한 mapper가 알아서 다 한다.
근데 난 인터페이스로 작성했을 뿐이고 구현체는 없는데 왜 실행이 되나? 그건 스프링이 구현체 프록시를 만들어서 그걸 사용하기 때문이다. 그래서 class 출력해보면 뒤에 proxy 어쩌구가 나옴.


물론 문법 틀렸을 때도 스프링이 통합한 badgrammarexception 가 나온다.
이제 나머지는 mybatis에서 가능한 문법 등을 소개한다. 자세한건 공식 사이트를 참고하자.
MyBatis – 마이바티스 3 | 소개
마이바티스는 무엇인가? 마이바티스는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다. 마이바티스는 JDBC로 처리하는 상당부분의 코드와
mybatis.org
mybatis-spring –
소개 MyBatis-Spring 은 무엇일까? 마이바티스 스프링 연동모듈은 마이바티스와 스프링을 편하고 간단하게 연동한다. 이 모듈은 마이바티스로 하여금 스프링 트랜잭션에 쉽게 연동되도록 처리한다.
mybatis.org
가능한건 if, choose, when, otherwise, trim, where, set, <where>, foreach 등이 있음. 내부의 문법은 OGNL이라는게 있는데 자세한 내용은 검색해보라고 한다.
<select id="findActiveBlogWithTitleLike"
resultType="Blog">
SELECT * FROM BLOG
WHERE state = ‘ACTIVE’
<if test="title != null">
AND title like #{title}
</if>
</select>
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG WHERE state = ‘ACTIVE’
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null and author.name != null">
AND author_name like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>
</select>
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG
WHERE // 조건이 없으면 에러가 발생하므로 <where>를 사용하자
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</select>
<select id="findActiveBlogLike"
resultType="Blog">
SELECT * FROM BLOG
<where>
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</where>
</select>
trim으로 where를 사용해도 된다
<trim prefix="WHERE" prefixOverrides="AND |OR ">
...
</trim>
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
<where>
<foreach item="item" index="index" collection="list"
open="ID in (" separator="," close=")" nullable="true">
#{item}
</foreach>
</where>
</select>
기타 기능들도 있는데 @Select, @Insert, ...를 함수 앞에 적어서 xml말고 java안에서 적는다던가. 근데 xml쓰려고 mybatis쓰는거라 잘 안쓴다.

#{}문법은 ?를 넣고 파라미터를 바인딩하는 PreparedStatement를 사용하는데 문자 그대로 넣고싶으면 ${}를 사용할 수 있다. 다만 ${}를 사용하면 SQL 인젝션 공격을 당할 수 있기때문에 걍 안쓰던가 정말정말 주의해서 사용하자.





MyBatis – 마이바티스 3 | 매퍼 XML 파일
Mapper XML 파일 마이바티스의 가장 큰 장점은 매핑구문이다. 이건 간혹 마법을 부리는 것처럼 보일 수 있다. SQL Map XML 파일은 상대적으로 간단하다. 더군다나 동일한 기능의 JDBC 코드와 비교하면
mybatis.org
'CS > 김영한 스프링 강의' 카테고리의 다른 글
스프링 DB 2편 - 데이터 접근 핵심 원리 - 섹션6. 데이터 접근 기술 - 스프링 데이터 JPA (0) | 2023.08.23 |
---|---|
스프링 DB 2편 - 데이터 접근 핵심 원리 - 섹션5. 데이터 접근 기술 - JPA (0) | 2023.08.22 |
스프링 DB 2편 - 데이터 접근 핵심 원리 - 섹션3. 데이터 접근 기술 - 테스트 (0) | 2023.08.20 |
스프링 DB 2편 - 데이터 접근 핵심 원리 - 섹션2. 데이터 접근 기술 - 스프링 JdbcTemplate (0) | 2023.08.19 |
스프링 DB 2편 - 데이터 접근 핵심 원리 - 섹션1. 데이터 접근 기술 - 시작 (0) | 2023.08.19 |