1. MyBatis란?
MyBatis란 SQL Mapping Framework로, 자바 코드로부터 SQL문을 분리해서 관리할 수 있다. 매개변수 설정과 쿼리 결과를 읽어오는 코드를 제거해줘서 생산성 향상 & 유지 보수 편리의 장점이 있다.
원래 왼쪽과 같이 작성했던 코드를 오른쪽과 같이 분리해서 쓸 수 있다.

2. SqlSession
1) SqlSessionFactoryBean, SqlSessionTemplate
SqlSessionFactory가 SqlSession을 생성해서 제공하고, SqlSession이 SQL명령을 수행하는 데 필요한 메서드를 제공한다.
앞 선 두 개는 인터페이스이고, 이를 각각 구현한 게 SqlSessionFactoryBean, SqlSessionTemplate이다.
SqlSessionTemplate은 thread-safe로, 멀티쓰레드에서 안전하다. 즉 여러 DAO에서 동시에 접근해서 공유할 수 있다.
이를 사용하기 위해서는 root-context.xml 파일에 아래처럼 빈으로 등록 해줘야 한다.
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!-- SqlSessionFactoryBean 등록할 때 Mapper XML 위치도 지정해 줘야함 -->
<property name="mapperLocations" value="classpath:mapper/*Mapper.xml"/>
</bean>
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactory"/>
</bean>
2) 주요 메서드
메서드 | 설명 |
int insert(String statement) int insert(String statement, Object Parameter) |
insert문을 실행하고, insert된 행의 개수를 반환 |
int delete(String statement) int delete(String statement, Object Parameter) |
delete문을 실행하고, delete된 행의 개수를 반환 |
int update(String statement) int update(String statement, Object Parameter) |
update문을 실행하고, update된 행의 개수를 반환 |
T selectOne(String statement) T selectOne(String statement, Object Parameter) |
하나의 행을 반환하는 select에 사용 parater로 SQL에 binding될 값 제공 |
List<E> selectList(String statement) List<E> selectList(String statement, Object Parameter) |
여러 행을 반환하는 select에 사용 parater로 SQL에 binding될 값 제공 |
Map<K,V> selectMap(String statement, String keyCol) Map<K,V> selectMap(String statement, String keyCol, Object parameter) |
여러 행을 반환하는 select에 사용 keyCol에 Map의 Key로 사용할 컬럼 지정 |
3) <typeAliases>로 이름 짧게 하기
Mapper XML에서 parameterType에 보면 DTO파일의 경로를 다 적어줘야 해서 너무 길다.
이는 mybatis-config.xml파일에 <typeAliases>를 이용해 별명을 지정해 줄 수 있다.

3. MyBatis로 DAO 작성
1) DB에 테이블 생성
2) Mapper XML & DTO 작성

3) DAO 인터페이스 구현한 후 -> Extract Interface 해서 인터페이스 생성


4. DTO란?
DTO(Data Transfer Object)란 계층간의 데이터를 주고 받기 위해 사용되는 객체이다. DB 테이블에 맞게 정의해주면 된다.
아래와 같은 테이블이 있다면
create table board (
bno int auto_increment primary key,
title varchar(45) not null,
content text not null,
writer varchar(30) not null,
view_cnt int default 0 null,
comment_cnt int default 0 null,
reg_date datetime null
);
DTO는 이런 식으로 테이블에 맞춰서 생성해주면 된다.
int 타입은 Integer로 작성해주는 게 좋다. 받아오는 값이 null일 경우 int 타입은 에러가 뜨지만 Integer로는 받아올 수 있다.
public class BoardDto {
private Integer bno;
private String title;
private String content;
private String writer;
private int view_cnt;
private int comment_cnt;
private Date reg_date;
// 생성자, getter & setter, toString()
// ...
}
부가 설명
1) #{} 와 ${} 차이
Mapper XML 에 썼던 코드들은 오른쪽과 같이 바뀐다.
#{ }를 사용하면 PreparedStatement로 바뀌고, 값에만 사용할 수 있다. 따옴표를 붙여주지 않아도 타입에 따라 알아서 붙여준다. pstmt를 사용하므로 SQL Injection을 방지할 수 있다.

${ }를 사용하면 Statement로 바뀌고, 따옴표를 직접 붙여주야 하는 번거로움이 있지만 조금 더 유연하게 쓸 수 있다. #{ }와 다르게 테이블 이름, 컬럼명 등에도 ${ }를 사용할 수 있다..

2) XML의 특수 문자 처리
XML내의 특수 문자( <, >, &, ...) 등 은 < > 로 변환이 필요하다.
또는 특수문자가 포함된 쿼리를 <![CDATA[ ]]> 로 감싸줘야 한다. (전부 character data로 인식)

참조
https://fastcampus.co.kr/dev_academy_nks
스프링의 정석 : 남궁성과 끝까지 간다 | 패스트캠퍼스
국비지원 조기 마감 신화, 베스트셀러 'JAVA의 정석'의 저자 남궁성의 Spring 강의입니다! 오픈톡방과 카페에서 평생 AS를 제공하며 완강과 취업까지 도와드립니다. 지금 할인가로 확인하세요!
fastcampus.co.kr
'3. Back-end > 3-2. Spring MVC - 남궁성' 카테고리의 다른 글
SpringMVC - [ SQL문 실행 로그 찍기 ] (0) | 2023.04.16 |
---|---|
SpringMVC - [ MyBatis 동적 쿼리 ] (0) | 2023.04.04 |
Spring MVC - [ 서비스 계층의 분리 / Transactional ] (0) | 2023.03.17 |
Spring MVC - [ AOP ] (0) | 2023.03.09 |
Spring MVC - [ Transaction, commit, Rollback ] (0) | 2023.03.03 |