MyBatis
- 마이바티스는 개발자가 지정한 SQL, 저장 프로시저 그리고 몇 가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다.
- 마이바티스는 JDBC로 처리하는 상당부분의 코드와 파라미터 설정 및 결과 매핑을 대신해준다.
- 마이바티스는 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO를 설정해서 매핑하기 위해 XML과 어노테이션을 사용할 수 있다.
MyBatis SqlSessionFactory 생성
- 모든 마이바티스 애플리케이션은 SqlSessionFactory 인스턴스를 사용한다.
- SqlSessionFactory 인스턴스는 SqlSessionFactoryBuilder를 사용하여 만들 수 있다.
- SqlSessionFactoryBuilder는 XML 설정파일에서 SqlSessionFactory 인스턴스를 빌드할 수 있다.
- 마이바티스는 클래스 패스와 다른 위치에서 자원을 로드하는 것으로 좀 더 쉽게 해주는 Resources라는 유틸성 클래스를 제공한다.
MyBatis SqlSession 생성
- SqlSessionFactory를 이용해서 SqlSession 인스턴스를 만들 수 있다.
- SqlSession은 데이터베이스에 대해 SQL 명령어를 실행하기 위해 필요한 모든 메서드를 가지고 있다.
- SqlSession 인스턴스를 통해 직접 SQL 구문을 실행할 수 있다.
OLD
try (SqlSession session = sqlSessionFactory.openSession()) {
Student student = session.selectOne("com.edu.jdbc.mybatis.StudentMapper.selectStudent", 1);
}
NEW - mapper interface를 사용하는 방식
try (SqlSession session = sqlSessionFactory.openSession()) {
StudentMapper mapper = session.getMapper(StudentMapper.class);
Student student = mapper.selectStudent(1);
}
Scope와 생명주기
SqlSessionFactory
- SqlSessionFactory는 애플리케이션을 실행하는 동안 존재해야만 합니다.
- 애플리케이션이 실행되는 동안 여러 차례 SqlSessionFactory를 다시 빌드하지 않는 것이 가장 좋은 구성이다.
- SqlSessionFactory의 가장 좋은 스코프는 애플리케이션(싱글턴) 스코프이다.
SqlSession
- 각 쓰레드는 자체적으로 SqlSession 인스턴스를 가져야 한다.
- SqlSession 인스턴스는 공유되지 않고 쓰레드에 안전하지도 않기 때문에 가장 좋은 스코프는 요청 또는 메서드 스코프이다.
- SqlSession을 static 필드나 클래스의 인스턴스 필드로 지정해서는 안된다.
- 서블릿 프레임워크의 HttpSession과 같은 관리 스코프에 둬서도 안된다.
- 웹 프레임워크를 사용한다면 HTTP 요청과 유사한 스코프에 두는 것으로 고려해야 한다.
- 달리 말해서 HTTP 요청을 받을 때마다 만들고 응답을 리턴할 때마다 SqlSession을 닫을 수 있다.
- SqlSession을 닫는 것은 중요하다. 언제나 finally 블록에서 닫아야만 한다.
Mapper 인스턴스
- Mapper는 매핑된 구문을 바인딩 하기 위해 만들어야 할 인터페이스이다.
- mapper 인스턴스의 가장 좋은 스코프는 SqlSession과 동일하다.
- mapper 인스턴스의 가장 좋은 스코프는 메서드 스코프이다.
try (SqlSession session = sqlSessionFactory.openSession()) {
BlogMapper mapper = session.getMapper(BlogMapper.class);
}