IoC/DI & Spring Bean Life Cycle
해당 내용은 DOM의 발표자료 를 참고하여 재구성하였습니다. 자세한 설명은 해당 사이트를 통해 확인하시길 바랍니다.
Spring Bean LifeCycle
Spring Bean의 생명주기를 간단하게 정리하면 다음과 같습니다.
서버 시작 후 Bean 대상들(xml 설정파일 또는 Annotations)에 대해 기본 생성자 호출하여 Bean 등록합니다.
Bean 등록 객체 초기화합니다.
@Component
의 경우 초기화 할 때@PostConstruct
를 사용하여 초기화할 매서드 위에 Annotation을 달아 놓을 수 있습니다. 반면@Bean
의 경우는 옆에(initMethod = "(메서드명)")
을 명시하여 초기화를 합니다.이제 Bean을 사용할 수 있습니다.
Bean의 소멸
초기화할 때와 마찬가지로
@Component
로 등록된 Bean의 경우@PreDestroy
를 해당 매서드 위에 지정함으로서 사용할 수 있습니다.@Bean
은(destroyMethod = "(메서드명)")
을 명시하여 소멸 메서드를 호출합니다. 재미있는 점은 Bean 등록 초기화된 시점의 역순으로 소멸된다는 점입니다.
참고) Application 클래스 위치 관련 이슈
Spring LifeCycle 테스트를 위해 서버를 구성하는 중 다음과 같은 오류가 발생하였습니다.
문제상황
@SpringBootApplication
이 있는 클래스를 'main > java' 바로 밑에 넣어두었습니다.- 그리고 가동을 하니 서버 작동중 오류가 발생하였습니다.
해결
- 기존 패키지와 Application 클래스를 패키지 안에 한번더 감싸줌으로써 해결할 수 있었습니다.
원인
- 위 오류 메시지에서도 볼 수 있듯이 Application클래스를 default package안에 넣어두어 문제가 발생하였습니다.
- 이렇게 하면 안되는 이유를 추측해보면 만약 제일 상위에 두게되면 Application 클래스는 모든 하위 클래스에 대해서 모두 커버하기 때문에 불필요한 패키지 또한 실행될 수도 있기 때문입니다. 그렇기 때문에 default package에선 Application클래스가 실행이 안되록 설계된 것 같습니다.
Spring LifeCycle에서 의존성이 주입되지 않을 때 생성자, 초기화 메서드, 소멸 메서드을 확인해보면 다음과 같이 확인할 수 있습니다.
반면 의존성이 주입되면 다음과 같습니다(@Autowired
로 Bean에 등록된 객체를 주입시킬 때).
여기서 주목해야할 점은 Controller의 초기화 메서드가 가장 마지막에 호출되었다는 점입니다. 그 이유는 Controller내 멤버변수로 @Autowired
된 Component1
과 Bean1
가 있는데요. 초기화 이전에 멤버변수가 먼저 정의가 되어야 사용될 수 있겠죠! 그렇기 때문에 Controller 생성자는 언제 실행되어도 크게 상관없지만 초기화 메서드는 멤버변수(Component1
, Bean1
)가 모두 정의된 다음에야 실행될 수 있는 것입니다.
Spring Bean의 Scope
마지막으로 Spring Bean의 Scope은 간단하게 어떤 것인지만 알아보도록 하겠습니다. 여기서 Scope가 의미하는 것은 각각의 'Spring Bean의 LifeCycle의 범위'를 말합니다. default로는 Singleton구조로 되어있는데요. Singleton은 하나의 Bean에 대해서 Container내에 단 하나의 객체만 존재한다는 것입니다. 매번 요청때마다 각각의 다른 객체를 만들기 위해선 prototype이라는 구조를 사용할 수도 있습니다. 사용방법은 Bean등록 Annotation밑에 @Scope
를 써 명시하면 됩니다.
@Bean
@Scope("prototype")
이로써 DOM의 발표자료 내용을 모두 살펴보았네요! Spring Bean은 Spring framework를 이해하는 가장 기본적인 개념이기 때문에 정말 유익한 시간이 되었습니다! 이제는 Pobi의 자료도 살펴보면서 부족했던 개념을 좀 더 매꿔 봐야할 것 같습니다.
'Spring' 카테고리의 다른 글
AOP2 (0) | 2018.12.13 |
---|---|
AOP (0) | 2018.12.11 |
devtools 사용법 (0) | 2018.12.08 |
IoC/DI & Spring Bean Life Cycle2 (0) | 2018.12.05 |
IoC/DI & Spring Bean Life Cycle1 (0) | 2018.12.04 |