2012. 4. 18. 09:31ㆍ공부/MYBATIS
지금까지 다룬 클래스의 다양한 범위와 생명주기를 이해하는 것이 정말 중요해. 이것들을 잘못 사용하게 되면 일관성에 심각한 문제를 야기할거야.
SQLSessionFactoryBuilder
이 클래스는 인스턴스화될 수 있고, 사용될 수 있고, 던져질 수 있어. 한 번 SqlSessionFactory를 생성하면 계속해서 그것을 유지할 필요는 없지. 그러므로 가장 좋은 SqlSessionFactoryBuilder의 범위는 메소드범위(예를 들면, 지역 메소드 변수)지. SqlSessionFactory 인스턴스를 여러개 만들기 위해서 SqlSessionFactoryBuilder를 사용할 수 있지만, 모든 XML 파싱 자원들이 다른 중요한 일들을 위해 쓰일 수 있음을 확신할 수 있도록, 이걸 유지하지 않는게 여전히 제일 좋아.
SQLSessionFactory
일단 생성되면, 어플리케이션이 실행되는 동안 유지되어야 해. 재배치하거나 재생성할 어떤 이유도 없지. 어플리케이션이 실행되는 동안 다시만들어지지 않는게 최선이야. 다시 만든다는 것은 "나쁜냄새"로 간주되어야 해. 그러므로 SqlSessionFactory의 가장 좋은 범위는 어플리케이션 범위야. 다양한 방법으로 가능하지만, 가장 간단한 방법은 싱글턴 패턴이난 스태틱 싱글턴 패턴임.
SqlSession
각각의 쓰레드는 각자의 SqlSession 인스턴스를 소유해. SqlSession의 인스턴스들은 쓰레드에 안전하지 않고, 공유되지 않아. 그러므로 가장 좋은 범위는 request나 메소드 범위지. 스태틱 필드나 클래스의 인스턴스 필드에조차도 SqlSession 인스턴스에 대한 참조를 유지하지 마라. 서블릿 프레임워크의 httpSession 같은 종류의 관리범위 안에 SqlSession에 대한 참조를 유지하지 마. 만약 어떠한 종류의 웹 프레임워크를 사용한다면 SqlSession은 HTTP request와 비슷한 범위를 따라가야해. 다시말하면, Http request를 받았을 때 SqleSession을 오픈할 수 있고, response가 되돌려진다면, SqlSession을 닫아야해. SqlSession을 닫는 것은 무척 중요해. 항상 final block에서 SqlSession을 닫았는지 꼭 확인해. 다음은 SqlSession을 닫는 표준 패턴이야.
SqlSession session = sqlSessionFactory.openSession(); try { // do work } finally { session.close(); }
이 패턴을 니가 만든 코드에 잘 집어넣는다는 것은 데이터베이스 자원을 잘 닫았다는 것을 확신시켜주지.
Mapper Instances
매퍼 인스턴스는 니가 만든 매핑 구문을 바인드하기 위해 생성하는 인터페이스야. 매퍼 인터페이스의 인스턴스는 SqlSession으로부터 획득할 수 있지. 그래서 기술적으로 봤을때, 어떠한 매퍼 인스턴스의 가장 넓은 범위는 요청받은 SqlSession의 범위와 같아. 그렇지만, 가장 좋은 매퍼 인스턴스의 범위는 메스드범위야. 즉, 메소드 내에서 요청되어지고,사용되어지고 버려져야지. 명시적으로 닫을 필요는 없겠지. SqlSession과 비슷하게 request 전체 기간동안 유지된다 해도 문제는 아니지만, 이 단계에서 너무 많은 자원들을 관리하는 것이 곧 손댈 수 없다는 것을 알게 될겨. 단순하게 유지하고, 매퍼의 범위는 메소드범위로 유지해. 다음 예제가 이것을 보여주고 있어.
SqlSession session = sqlSessionFactory.openSession(); try { BlogMapper mapper = session.getMapper(BlogMapper.class); // do work } finally { session.close(); }
NOTE 객체 생명주기와 의존성 주입 프레임웍
의존성 주입 프레임웍은 쓰레드에 안전하고, 트랜잭션 가능한 SqlSession 과 매퍼를 생성 가능하고, bean에 바로 주입할 수 있어. 그래서 그것들의 생명주기에 대한 것들은 잊어도 돼. 더 많은 DI 프레임웍과 mybatis를 사용하는 방법을 알려면 mybatis-spring 이나 mybatis-guice 서브 프로젝트를 살펴봐