스프링 컨테이너, 빈 생명주기
스프링 컨테이너의 생명주기
스프링 컨테이너 생성 => 스프링 빈 생성 => 사용 => 소멸
빈의 생명주기
스프링 컨테이너 생성 => 스프링 빈 생성 => 의존관계 주입 => 초기화 콜백 => 사용 => 소멸전 콜백 => 스프링 컨테이너 종료
지금까지 스프링 컨테이너 생성, 빈 생성, 의존관계 주입, 사용, 스프링 컨테이너 종료에 대해서는 알아보았는데 초기화 콜백과 소멸전 콜백 즉, 콜백에 대해서는 알아본 적이 없다.
실제로 우리가 콜백을 사용해야할 때 콜백을 어떻게 사용해야하는지 알아보자.
콜백을 이용할 수 있는 방법은 총 3가지인데 각각에 대해 알아보자
1. 인터페이스 (InitializingBean, DisposalBean)
첫번째는 InitializingBean 인터페이스와 DisposalBean 인터페이스를 상속받아 이를 구현하는 것이다.
다음 예시를 통해 살펴보자.
@Getter
@Setter
public class Employee implements InitializingBean, DisposableBean {
private Long id;
private String name;
private String department;
private String position;
public Employee() {
}
public Employee(String name, String department, String position) {
this.name = name;
this.department = department;
this.position = position;
}
@Override
public void destroy() throws Exception {
System.out.println("(인터페이스)소멸!");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("(인터페이스)초기화!");
}
}
public class callback {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(cb.class);
@Test
public void callback() throws Exception {
ac.close();
}
@Configuration
static class cb {
@Bean
public Employee employee() {
return new Employee();
}
}
}
다음과 같이 초기화 콜백과 소멸전 콜백이 잘 불리는 것을 확인할 수 있다.
2. 메소드 (init(), destory())
다음은 메소드를 이용하는 것이다.
이는 클래스 내에 초기화 메소드와 소멸 메소드를 정의해준뒤에 빈 파라미터 initMethod에 정의한 초기화 메소드의 이름을 넣고 destroyMethod에 정의한 소멸 메소드의 이름을 정의해주면 된다.
@Getter
@Setter
public class Employee{
private Long id;
private String name;
private String department;
private String position;
public Employee() {
}
public Employee(String name, String department, String position) {
this.name = name;
this.department = department;
this.position = position;
}
public void destroy_bean() throws Exception {
System.out.println("(메소드)소멸!");
}
public void init_bean() throws Exception {
System.out.println("(메소드)초기화!");
}
}
public class callback {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(cb.class);
@Test
public void callback() throws Exception {
ac.close();
}
@Configuration
static class cb {
@Bean(initMethod = "init_bean", destroyMethod = "destroy_bean")
public Employee employee() {
return new Employee();
}
}
}
다음과 같이 초기화 콜백과 소멸전 콜백이 잘 불리는 것을 확인할 수 있다.
3. 어노테이션 (@PostConstruct, @PreDestroy)
다음은 어노테이션을 활용하는 것이다.
초기화 메소드를 정의하고 이에 @PostConstruct 어노테이션을 적용해주면 되고, 소멸 메소드를 정의하고 이에 @PreDestroy를 적용하면 된다.
@Getter
@Setter
public class Employee{
private Long id;
private String name;
private String department;
private String position;
public Employee() {
}
public Employee(String name, String department, String position) {
this.name = name;
this.department = department;
this.position = position;
}
@PreDestroy
public void destroy_bean() throws Exception {
System.out.println("(어노테이션) 소멸!");
}
@PostConstruct
public void init_bean() throws Exception {
System.out.println("(어노테이션) 초기화!");
}
}
public class callback {
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(cb.class);
@Test
public void callback() throws Exception {
ac.close();
}
@Configuration
static class cb {
@Bean
public Employee employee() {
return new Employee();
}
}
}
다음과 같이 초기화 콜백과 소멸전 콜백이 잘 불리는 것을 확인할 수 있다.
이렇게 3가지 생명주기 콜백 방법에 대해서 알아보았다.
인터페이스를 활용하는 방법은 잘 사용하지 않고 주로 어노테이션을 활용한 방법을 자주 사용한다.
하지만, 코드를 고칠 수 없는 외부 라이브러리를 초기화 혹은 소멸해야한다면 추가적으로 메소드를 정의하고 이를 빈 설정으로 초기화 혹은 소멸을 적용해주는 메소드 방법을 사용하면 된다.
'스프링' 카테고리의 다른 글
RequestMapping (0) | 2021.09.20 |
---|---|
MVC, Spring MVC (0) | 2021.09.18 |
같은 타입의 빈 등록(중복) (0) | 2021.09.16 |
수동 빈 등록, 자동 빈 등록 (2) | 2021.09.15 |
스프링 컨테이너, 빈 (0) | 2021.09.15 |