Mybatis란 ?
Mybatis는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다.Mybatis는 JDBC로 처리하는 상당부분의 코드와 파라미터 설정 및 결과 매핑을 대신 해준다. Mybatis는 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO를 설정해서 매핑하기 위해 XML과 애노테이션을 사용할 수 있다.
특징을 살펴보자면
- 간단한 퍼시스턴스 프레임워크
- 코드의 생산성을 높여준다.
- 설계를 향상시킨다.
- 작업의 분배가 수월해지고 팀을 세분화하는 것을 도와준다.
- SQL문이 애플리케이션 소스 코드로부터 완전하게 분리 된다.
- 이식성이 뛰어나 어떤 프로그래밍 언어로도 구현이 가능하다.
- 오픈소스이다.
- SqlSessionFactoryBuilder class : 설정파일을 읽어서 SqlSessionFactory객체를 생성
- SqlSessionFactory class : SqlSession을 만드는 역할
- SqlSession class : sql문을 실제 호출해주는 역할(필요시 open하고 close를 해줘야 한다.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="" /> <property name="url" value=""/> <property name="username" value="" /> <property name="password" value="" /> </dataSource> </environment> </environments> <mappers> <mapper resource="" /> </mappers> </configuration> | cs |
매핑이 된 SQL 구문
1 2 3 4 5 6 7 8 9 | <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="cafe.naver.jjdev.student.service.StudentMapper"> <select id="selectStudentList" resultType="cafe.naver.jjdev.student.service.Student"> SELECT id,name,branch,percentage,phone,email FROM details.student </select> </mapper> | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | public class StudentDao { private SqlSession sqlSession; private final String NS = "cafe.naver.student.service.StudentMapper."; public StudentDao() throws IOException { Reader reader = Resources.getResourceAsReader("config.xml"); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); this.sqlSession = sqlSessionFactory.openSession(); } public List<Student> selectStudent() { return sqlSession.selectList("cafe.naver.student.service.StudentMapper.selectAll"); } } | cs |
위 코드에서 중요한 키워드만 보자면 아래와 같다
SqlSessionFactoryBuilder
이 클래스는 인스턴스회되어 사용되고 던져질 수 있다. SqlSessionFactory 를 생성한 후 유지할 필요는 없다. 그러므로 SqlSessionFactoryBuilder 인스턴스의 가장 좋은 스코프는 메소드 스코프(예를들면 메소드 지역변수)이다. 여러개의 SqlSessionFactory 인스턴스를 빌드하기 위해 SqlSessionFactoryBuilder를 재사용할 수도 있지만 유지하지 않는 것이 가장 좋다.
SqlSessionFactory
한번 만든뒤 SqlSessionFactory는 애플리케이션을 실행하는 동안 존재해야만 한다. 그래서 삭제하거나 재생성할 필요가 없다. 애플리케이션이 실행되는 동안 여러 차례 SqlSessionFactory 를 다시 빌드하지 않는 것이 가장 좋은 형태이다. 재빌드하는 형태는 결과적으로 “나쁜냄새” 가 나도록 한다. 그러므로 SqlSessionFactory 의 가장 좋은 스코프는 애플리케이션 스코프이다. 애플리케이션 스코프로 유지하기 위한 다양한 방법이 존재한다. 가장 간단한 방법은 싱글턴 패턴이나 static 싱글턴 패턴을 사용하는 것이다. 또는 구글 쥬스나 스프링과 같은 의존성 삽입 컨테이너를 선호할 수도 있다. 이러한 프레임워크는 SqlSessionFactory의 생명주기를 싱글턴으로 관리할 것이다.
SqlSession
각각의 쓰레드는 자체적으로 SqlSession인스턴스를 가져야 한다. SqlSession인스턴스는 공유되지 않고 쓰레드에 안전하지도 않다. 그러므로 가장 좋은 스코프는 요청 또는 메소드 스코프이다. SqlSession 을 static 필드나 클래스의 인스턴스 필드로 지정해서는 안된다. 그리고 서블릿 프레임워크의 HttpSession 과 같은 관리 스코프에 둬서도 안된다. 어떠한 종류의 웹 프레임워크를 사용한다면 HTTP 요청과 유사한 스코프에 두는 것으로 고려해야 한다. 달리 말해서 HTTP 요청을 받을때마다 만들고 응답을 리턴할때마다 SqlSession 을 닫을 수 있다. SqlSession 을 닫는 것은 중요하다. 언제나 finally 블록에서 닫아야만 한다. 다음은 SqlSession을 닫는 것을 확인하는 표준적인 형태다.
자료 출처 : mybatis.org
이상으로 Mybatis의 간단한 소개를 마친다.