1.MyBatis란?
MyBatis는 'SQL Mapping Framework'로 자바 코드로부터 SQL문을 분리한다. 또한 매개변수 설정(setString(), setInt() ...)과 쿼리 결과를 읽어오는 코드(getString(), getInt() ...)를 제거하여 생산성을 향상시키고 유지보수를 편리하게 한다.
2.SqlSessionFactoryBean과 SqlSessionTemplate
- SqlSessionFactory - SqlSession을 생성
- SqlSession - SQL명령을 수행하는데 필요한 메서드 제공
SqlSessionFactory와 SqlSession은 MyBatis가 제공하는 인터페이스다. 인터페이스의 구현체는 SqlSessionFactoryBean과 SqlSessionTemplate이다.
- SqlSessionFactoryBean - SqlSessionFactory를 Spring에서 사용하기 위한 빈
- SqlSessionTemplate - SQL명령을 수행하는데 필요한 메서드 제공, thread-safe
구현체는 다음 그림과 같이 root-context.xml파일에 등록할 수 있다. Mapper XML은 자바 코드에서 떼어낸 SQL문이 XML파일로 작업된 문서다.
DAO는 SqlSessionTemplate을 이용해 작성한다. 동시에 사용하는 것도 가능하다. 만약 DAO를 동시에 사용 못하면 충돌문제가 발생할텐데, SqlSessionTemplate은 thread-safe하기 때문에 여러 DAO를 동시에 사용 가능하게한다.
3.SqlSession의 주요 메서드
메서드 | 설명 |
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에 사용 parameter로 SQL에 binding될 값 제공 |
List<E> selectList(String statement) List<E> selectList(String statement, Object parameter) |
여러 행을 반환하는 select에 사용 parameter로 SQL에 binding될 값 제공 |
Map<K,V> selectMap(String statement, String keyCol) Map<K,V> selectMap(String statement, String keyCol, Object parameter) |
여러 행을 반환하는 select에 사용 keyCol에 Map의 Key로 사용할 컬럼 지정 |
4.Mapper XML의 작성
Mapper XML과 자바코드는 위와 같이 상응된다. 다른 코드들은 이해하기 쉬울텐데 parameterType과 resultType이 뭔지 파악이 안된다. 쉽게 parameterType은 입력되는 타입이고 resultType은 출력되는 타입이다. 위의 예시에서 'delete' 메서드가 출력된다고 가정해보자. 그러면 Mapper XML파일에서 id가 delete인 파일이 적용될거다.
parameterType 값을 살펴보니 'map'으로 나와있다. 그렇다면 입력되는 타입은 'map'이 된다. resultType의 예시를 살펴보기 위해 자바코드에서 select메서드를 호출해보자. 앞에서와 마찬가지로 메서드를 출력함에 따라 Mapper XML파일이 작동한다. parameterType은 int, resultType은 'BoardDto'로 정의되어있다. 그렇다면 이 메서드는 int의 타입의 값이 입력되고 결과값의 타입은 BoardDto(Aliases로 이름이 정의됨)로 출력된다.
*resultMap: 사용자가 지정한 규칙에 맞게 변환
*resultType: 지정된 클래스에 맞게 반환
5.<typeAliases>
Aliases는 '별명'을 뜻하는 영단어다. typeAliases는 타입에 별명을 지어준다는 의민데 Mapper파일의 긴 타입의 이름을 간편하게 이용가능하게 해준다.
예시에서 Aliases를 통해 'com.fastcampus.ch4.domain.BoardDto' 타입값을 간단히 'BoardDto'로 바꿔주는 걸 확인할 수 있다.
6.MyBatis로 DAO작성하기
MyBatis로 DAO를 작성할 때는 1.DB테이블 생성 -> 2.Mapper XML과 DTO작성 ->3.DAO인터페이스 작성 ->4.DAO인터페이스 구현과 테스트의 순서로 진행된다. 구현하는 코드와 매퍼는 서로 상응되고 상응되는 코드는 그림에서 화살표로 표시해두었다.
7.DTO(Data Transfer Object)
DTO는 계층간의 데이터를 주고 받기 위해 사용되는 객체다. 쉽게 설명하면 자료를 담는 바구니라고 말할 수 있고, Spring의 MVC패턴에서 자료값을 담는 Model과 기능이 유사하다. 브라우저에서 값을 꺼낼 때 ①의 과정을 거쳐 DB의 값이 DTO에 저장된다. 만약 값을 꺼내는 것이 아니라 브라우저에서 요청된 값을 DB에 저장한다면, ②의 과정을 거쳐 브라우저를 통해 DTO에 입력된 값이 DB에 저장된다.
7-1 DTO의 필요성
프로젝트는 @Controller, @Service, @Repository 3계층으로 나뉜다. 3계층으로 나눠 작업을 진행하면 데이터 값이 충돌되거나 생략이 되는 경우가 있다. 하지만 DTO를 활용하여 값을 담으면 이러한 문제를 해결 할 수 있다.
8.#{}와 ${}
#{}
- PreparedStatement 사용
- '?'에 SQL문의 값에 대해서만 쓰임
- ''표를 붙일 필요없음
- SQL Injection 방지
${}
- Statement 사용
- 쓰일 수 있는 곳의 제한이 없어 유연함
9.XML의 특수 문자 처리
XML 내의 특수 문자(<>, &, ...)는 < >로 변환 해야한다. 그런데 일일이 특수문자 대체하는 문자를 써준다면, 헷갈리고 효율적이지 못하다. 그래서 <![CDATA[와 ]]>로 감싼다. 그러면 위의 그림 오른쪽 이미지와 같이 CDATA로 감싸서 특수문자를 써준다면 효율적이다.
참조
https://www.youtube.com/watch?v=eMuFWW6-8i0&ab_channel=%EC%B0%A8%ED%83%9C%EC%A7%84
https://mybatis.org/mybatis-3/getting-started.html
mybatis – MyBatis 3 | Getting started
It's very important to understand the various scopes and lifecycles classes we've discussed so far. Using them incorrectly can cause severe concurrency problems. Dependency Injection frameworks can create thread safe, transactional SqlSessions and mappers
mybatis.org
'MyBatis' 카테고리의 다른 글
[MyBatis] 엘리먼트와 동적 SQL (0) | 2022.02.21 |
---|