[Spring] Bean 생명주기

말하는 감자·2025년 4월 18일

내일배움캠프

목록 보기
44/73

☕ Bean 생명주기

참고 : https://velog.io/@hosunghan0821/Spring-Spring-bean-life-cycle
강의자료
https://docs.spring.io/spring-framework/reference/core/beans/definition.html
https://dev-coco.tistory.com/170#google_vignette

콜백 메서드Spring Bean의 생명주기에서 특정 시점에 실행되도록 설정된 메서드로 초기화 혹은 종료 시점에 필요한 작업(리소스 초기화, 정리)을 처리할 때 주로 사용된다.





💡 Bean의 Life Cycle이란 해당 객체가 언제, 어떻게 생성되어 소멸되기 전까지 어떤 작업을 수행하고 언제, 어떻게 소멸되는지 일련의 과정을 이르는 말


🔁 Spring Bean Life Cycle 흐름 정리

1. Spring Container 초기화(생성)
2. Bean 인스턴스 생성
4. 초기화 메서드 호출 (@PostConstruct, afterPropertiesSet())
- Bean 생성 및 의존관계 설정이 완료된 후 호출
5. Bean 사용
6. 소멸 메서드 호출 (@PreDestroy, destroy())
- Bean이 소멸되기 직전에 호출
7. Bean 소멸 / 스프링 종료





🛠️객체의 생성과 초기화를 분리하자.

생성자는 파라미터를 받고, 메모리를 할당해서 객체를 생성하는 책임을 가진다.
반면에
초기화는 이렇게 생성된 값들을 활용해서 외부 커넥션을 연결하는 등 무거운 동작을 수행한다.
따라서 생성자 안에서 무거운 초기화 작업을 함께 하는 것보다는 객체를 생성하는 부분과 초기화 하는 부분을 명확하게 나누는 것이 유지보수 관점에서 좋다.

물론, 초기화 작업이 내부 값들만 약간 변경하는 정도로 단순한 경우에는 생성자에서 한번에 처리하는게 나을 수 있다.





🔷 초기화 메서드와 종료 메서드를 지정하는 방법

1. InitializingBean, DisposableBean
Bean이 생성되고 모든 의존성이 주입된 후 InitializingBeanafterPropertiesSet() 메서드가 호출되고 초기화 작업을 수행할 수 있다. 컨테이너가 종료될 때는 DisposableBeandestroy() 메서드가 호출되며, 리소스 해제나 정리 작업을 처리할 수 있다.

‼️참고할 점
인터페이스임.
-> 코드를 고칠 수 없는 외부 라이브러리에 적용 불가능하다!




2. @Bean 속성
Spring에서 생명주기 콜백을 지원하는 방법으로 설정 정보에 초기화 메서드와 종료 메서드를 지정하는 방법을 사용할 수 있다. 이 방법을 선택하면 외부 라이브러리에도 콜백 메서드를 사용할 수 있다.

@Bean(initMethod = "초기화 메서드명", destroyMethod = "소멸 메서드명")이렇게 지정해놓으면
외부의 다른 곳에서도 afterPropertiesSet()destroy() 같이 사용이 가능하다.

public class ExampleBean {
    public void init() throws Exception {
    	//초기화 콜백 
    }
    
    public void close() throws Exception {     
        // 소멸 전 콜백 
    }
}

@Configuration
class LifeCycleConfig {
	 @Bean(initMethod = "init", destroyMethod = "close")
     public ExampleBean exampleBean() {
	
     }
}
  • 설정정보 사용
    1. Bean이 Spring 내부적으로 구현된 코드에 의존하지 않는다.
    2. 메서드 이름을 자유롭게 설정할 수 있다.
    3. 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있다.
    4. 위에 명시한 두 인터페이스를 구현시킬 수 없는 클래스의 객체를 스프링 컨테이너에 등록할 때 유용하다.

‼️참고할 점
@BeandestroyMethod 속성은 종료 메서드 추론 기능으로 대부분의 라이브러리 종료 메서드 이름인 close, shutdown이 기본값으로 등록되어 이름이 둘 중 하나라면 명시하지 않아도 동작하도록 구성되어 있다.



3.@PostConstruct, @PreDestroy

최신 스프링에서 가장 권장하는 방법이다.

  • @PostConstruct

    • 빈이 스프링 컨테이너에 의해 생성된 후, 의존성 주입이 모두 완료된 직후 호출
    • 기본 생성자를 사용하여 빈이 생성된 후 인스턴스가 요청 객체에 반환되기 직전에 해당 어노테이션이 달린 메서드가 호출
    • 주로 초기화 작업을 할 때 사용된다.
  • @PreDestroy

    • 빈이 스프링 컨테이너에서 제거되기 직전, 즉 애플리케이션 종료 직전에 호출됩니다.
    • @PreDestroy어노테이션이 달린 메소드는 bean이 bean 컨테이너 내부 에서 파괴되기 직전에 호출
    • 주로 리소스 정리 작업을 할 때 사용된다.

표준 Annotation 방식의 단점
- 외부 라이브러리에 적용이 불가능하다.





🔭 Bean Scope

  1. Singleton(Default)
    • 대부분의 Sevice, Repository 등 Application 전체에서 공유되는 Bean
    • 상태를 가지면 안된다.


  2. Prototype
  • 매번 새로운 인스턴스가 필요한 경우
  • 요청할 때마다 새로운 인스턴스가 생성된다.
  • 상태를 가지는 객체(특정 설정값이 다른 임시 작업 객체)
  • 클라이언트가 직접 종료 메서드를 호출해야 한다. (컨테이너는 생성/주입/초기화만 해줌)


  1. 웹스코프
  • request
    • 주로 사용된다.
    • HTTP 요청마다 새로운 Bean 이 생성된다.
    • 웹 요청이 들어오면 Bean 생성되고 요청이 완료되면 소멸된다.
    • Spring MVC로 만든 Web Application에서 사용하는 방식
  • session
    • HTTP 세션 동안 하나의 Bean 인스턴스를 유지한다.
    • 웹 세션이 시작되면 생성되고 종료될 때 소멸한다.
  • application
    • 서블릿 컨텍스트 내에서 Bean이 단일 인스턴스로 존재한다.
    • 애플리케이션이 구동되는 동안 동일한 객체가 유지된다.

profile
대충 데굴데굴 굴러가는 개발?자

0개의 댓글