728x90
생성자 안에서 무거운 초기화 작업을 하는 것보다는 객체를 생성하는 부분, 초기화 부분을 명확하게 나누는 것이 유지보수 관점에서 좋다. 초기화 작업이 내부 값들만 약간 변경하는 정도의 단순한 경우라면 생성자에서 한 번에 처리하는 게 더 나을 수 있다.
스프링 컨테이너가 생성되고 빈의 생성과 의존관계 주입이 완료료되면 콜백을 통해 초기화 시점을 알려주고, 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 준다.
스프링의 초기화, 소멸 작업 방법
- 스프링의 인터페이스 구현
- 빈을 등록할 때 초기화, 소멸 메소드 지정
- @PostConstruct, @PreDestroy 애노테이션 사용(권장되는 방법)
인터페이스 구현
- InitializingBean, DisposableBean 인터페이스를 구현한다.
- afterPropertiesSet() : 빈의 생성과 의존관계 주입 완료 후 호출된다.
- destroy() : 스프링 컨테이너가 종료되기 직전에 호출된다.
- 스프링 초창기에 나온 방법으로, 지금은 거의 사용하지 않는 방법이다.
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
public class Hello implements InitializingBean, DisposableBean {
//빈의 생성과 의존관계 주입 완료 후 호출
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("초기화 메소드 호출");
}
//스프링 컨테이너가 종료되기 직전에 호출
@Override
public void destroy() throws Exception {
System.out.println("소멸 메소드 호출");
}
}
빈을 등록할 때 초기화, 소멸 메소드 지정
- @Bean 애노테이션의 initMethod, destroyMethod 속성을 사용하여 각각 초기화, 소멸 메소드를 지정해 줄 수 있다.
- 초기화, 소멸 메소드 이름을 자유롭게 줄 수 있다.
public class Hello {
public Hello() {
System.out.println("생성자 호출");
}
public void init() {
System.out.println("초기화 메소드 호출");
}
public void close() {
System.out.println("소멸 메소드 호출");
}
}
@Configuration
public class AppConfig {
@Bean(initMethod = "init", destroyMethod = "close")
public Hello hello() {
return new Hello();
}
}
destroyMethod 속성은 따로 값을 지정해주지 않아도 종료 메소드를 추론해서 호출해주는 기능을 가지고 있는데 close, shutdown 이름을 가진 메소드를 자동으로 호출해준다.
위 예제의 경우 소멸 메소드로 사용할 메소드 이름이 close이기 때문에 destroyMethod 속성 값을 입력하지 않아도 자동으로 호출이 된다.
이 기능을 사용하고 싶지않다면 destroyMethod 속성 값에 빈 공백("")을 전달해주면 된다.
@PostConstruct, @PreDestroy 애노테이션 사용
- 스프링에서 권장하는 방법으로 애노테이션 하나만 붙여주면 되기 때문에 편리하다.
- @PostConstruct : 초기화 메소드에 붙혀준다.
- @PreDestroy : 소멸 메소드에 붙혀준다.
public class Hello {
public Hello() {
System.out.println("생성자 호출");
}
@PostConstruct
public void init() {
System.out.println("초기화 메소드 호출");
}
@PreDestroy
public void destroy() {
System.out.println("소멸 메소드 호출");
}
}
참고
'Spring' 카테고리의 다른 글
[스프링 MVC] 요청 파라미터 조회하기 - @RequestParam, @ModelAttribute (0) | 2021.07.07 |
---|---|
[스프링] 프록시(Proxy) (0) | 2021.03.08 |
[스프링] 의존관계 조회(Dependency Lookup) : ObjectFactory, ObjectProvider, JSR-330 Provider (0) | 2021.03.08 |
스프링 @Autowired : 같은 타입의 빈이 여러개라면?(@Qualifier, @Primary) (0) | 2021.02.26 |
[스프링] Cookie 사용하기(@CookieValue, HttpServletResponse) (0) | 2020.12.01 |
댓글