스코프(Scope)와 생명주기(Lifecycle)
>
스코프와 생명주기를 잘못 사용하면 다양한 동시성 문제를 야기할 수 있다.
(참고 : 객체 주기와 의존성 삽입 프레임워크)
1. SqlSessionFactoryBuilder
이 클래스는 인스턴스화 되어 사용되고 던져질수 있다. SqlSessionFactory를 생성한 후 유지할 필요는 없다. 그러므로 SqlSessionFactory인스턴스를 빌드하기 위해 SqlSessionFactoryBuilder를 재사용할 수도 있지만 유지하지 않는것이 가장 좋다.
2.SqlSessionFactory
한번 만든뒤 SqlSessionFactory는 애플리케이션을 실행하는 동안 존재해야만 한다. 그래서 삭제하거나 재생성할 필요가없다. 애플리케이션이 실행되는동시에 여러 차례 SqlSessionFactroy를 다시 빌드하지 않는 것이 가장 좋은 형태다.
프레임워크는 SqlSessionFactory의 생명주기를 싱글턴으로 관리할 것이다.
3. Sqlsession
각각의 쓰레드는 자체적으로 SqlSession인스턴스를 가져야 한다. SqlSession인스턴스는 공유되지않고 쓰레드에 안전하지도 않다. 그러므로 가장 좋은 스코프는 요청 또는 메소드 스코프이다. SqlSession을 static필드나 클래스의 인스턴스 필드로 지정해서는 안된다. 그리고 서블릿 프레임워크의 HttpSession과 같은 관리 스코프에 둬서도 안된다. HTTP요청을 받을때마다 만들고 응답을 리턴할때 마다 SqlSession을 닫을수 있다. SqlSession을 닫는 것은 중요하다. 언제나 finally블록 안에서 닫아야하며, 다음은 SqlSession을 닫는것을 확인하는 표준적인 형태다.
try (SqlSession session = sqlSessionFactory.openSession()) {
// do work
}
4.Mapper 인스턴스
Mapper는 매팅된 구문을 바인딩 하기 위해 만들어야 할 인터페이스이다. mapper 인터페이스의 인스턴스는 SqlSession에서 생성한다. 그래서 mapper 인스턴스의 가장 좋은 스코프는 SqlSession과 동일하다. mapper인스턴스의 가장 좋은 스코프는 메소드 스코프다. 사용할 메소드가 호출되면 생성되고 끝난다. 명시적으로 닫을 필요는 없다.
try (SqlSession session = sqlSessionFactory.openSession()) {
BlogMapper mapper = session.getMapper(BlogMapper.class);
// do work
}
* 스프링 컨테이너 생명주기 *
생성 -> 설정 -> 사용 -> 종료
생성 : GenericXmlApplicationContext ctx= new GenericXmlApplicationContext(); // 생성과 동시에 설정파일을 넣을수 있음.xml파일
설정 : ctx.load("classpath:applicationCTX.xml") , 생성후 로드했을경우에는 ctx.refresh(); 를 통해 리프레쉬 해주어야함
사용 : Student student= ctx.getBean("student", Student.class)
Sysout(student.getName())
종료 : ctx.close();
참고한 페이지.
[출처]mybatis.org/mybatis-3/ko/getting-started.html
*용어 정리
인스턴스 : 인스턴스(instance)는 같은 클래스에 속하는 개개의 객체로, 하나의 클래스에서 생성된 객체를 말한다. 즉 클래스가 구체화되어, 클래스에서 정의된 속성과 성질을 가진 실제적인 객체로 표현된 것을 의미한다. 이때 추상적인 개념인 클래스에서 실제 객체를 생성하는 것을 인스턴스화(instantiation)라고 한다.
스코프(scope) : 유효범위를 의미하며, 어떤 범위에 있는 변수들에 접근 가능한 범위 (전역 스코프, 함수레벨 스코프, 블록레벨 스코프 크게 3가지로 유효머위로 구분한다.)
'개발공부 > Spring' 카테고리의 다른 글
[스프링] Mybatis Mapper 관련 링크 공유 (0) | 2021.02.26 |
---|---|
[스프링] 어노테이션 @RequestMapping @ReqeustBody @ResponseBody (0) | 2021.02.22 |
의존성 주입(Dependency Injection, DI) (0) | 2021.01.03 |
Mybatis (1) (0) | 2021.01.01 |
Mybatis 동적 쿼리(1) (0) | 2020.12.31 |
댓글