728x90

1. Application Context와 Servlet Context 설정과 Transaction
출처: https://hoonmaro.tistory.com/31 [훈마로의 보물창고]

Application Context

  • 전체 계층구조에서 최상단에 위치한 컨텍스트
  • 서로 다른 서블릿 컨텍스트에서 공유해야하는 Bean들을 등록해놓고 사용할 수 있다.
  • 웹 애플리케이션 전체에 적용 가능한 프로퍼티, DB 연결, 로깅 기능 등에 이용한다.
  • Servlet Context에 등록된 Bean은 이용할 수 없다.
  • Servlet Context에 동일한 Bean이 있을 경우 Servlet Context Bean이 우선된다.
  • 하나의 컨텍스트에 정의된 AOP 설정은 다른 컨텍스트의 Bean에는 영향을 미치지 않는다.

Servlet Context

  • 서블릿에서만 이용되는 컨텍스트
  • 다른 서블릿과 공유하기 위한 Bean들은 Application Context에 등록해놓고 사용해야 한다.
  • DispatcherServlet은 자신만의 컨텍스트를 생성, 초기화하고 동시에 Application Context를 찾아서 자신의 부모 컨텍스트로 사용한다.

 

IoC 컨테이너 구성방법

  1. Application Context만 이용
  2. Servlet Context만 이용
  3. Application Context와 Servlet Context 하나씩 이용
  4. Application Context와 Servlet Context여러 개 이용
  5. 여러 Application Context와 Servlet Context 하나 이용
    •  Application Context 설정을 목적에 맞게 분류 (Property, Validation, sqlMap, datasource, aop 등)

Component Scan 사용시 컨텍스트 설정 방법

  • Application Context에 Service, Repository, Servlet Context에 Controller만 등록해야한다.
  • Application Context 설정

    • Service와 Repository는 Include 하고 Controller는 Exclude 한다.
  • Servlet Context 설정
    • Service와 Repository는 Exclude 하고 Controller는 Include 한다.

 

  • 이렇게 설정하는 이유는 스프링이 Transaction을 적용하기 위해서이다.
  • 스프링 트랜잭션은 AOP를 이용해서 해당 빈의 proxy를 만들어서 tx가 적용되는 bean을 바꿔치기 한다. 그러면 원래 @Service(또는 @Transactional) 어노테이션이 붙은 빈은 뒤로 숨고 tx가 적용된 proxy bean이 @Service가 붙은 bean으로 대치된다.
  • 만약 Application Context와 Servlet Context가 모든 stereotype의 컴포넌트를 풀 스캔 할 경우, tx 설정은 Application Context에만 적용되어 있기 때문에 Application Context의 @Service는 트랜잭션이 적용이 되지만 Servlet Context의 @Service는 트랜잭션이 적용이 안된다.
  • Bean 객체는 Servlet Context가 우선되므로 @Controller가 동작하여 같은 context(Servlet Context)안에서 검색을 하고, @Service가 지정된 bean이 있으므로 이 bean을 사용한다. 이 @Service가 지정된 bean은 트랜잭션 적용이 안 되어 있어 트랜잭션 처리가 안된다.



 

Reference

https://hoonmaro.tistory.com/31

 

 

 

728x90

+ Recent posts