[Spring] Bean 생명주기 (2)

이연우·2025년 8월 20일

TIL

목록 보기
92/100

⚙️ @Bean 속성이란?

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

🎯 설정 정보에서 초기화/소멸 메서드 지정
@Bean(initMethod = "메서드명", destroyMethod = "메서드명")

@Configuration
public class AppConfigV2 {
    @Bean(initMethod = "init", destroyMethod = "close")
    public MyBeanV2 myBeanV2() {
        MyBeanV2 myBeanV2 = new MyBeanV2();
        myBeanV2.setData("Example");
        return myBeanV2;
    }
}

✅ 특징

  • Spring 내부 코드에 의존하지 않음
  • 메서드 이름을 자유롭게 지정 가능
  • 외부 라이브러리에도 적용 가능

💡 destroyMethod는 기본적으로 close · shutdown 이름을 자동 인식 → 생략 가능


🏷️ @PostConstruct, @PreDestroy

  • Java 표준 어노테이션 → Spring이 아니어도 동작
  • 최신 Spring에서 가장 권장되는 방법

✨ 주요 어노테이션

1. @PostConstruct

  • Bean 생성 + 의존성 주입 완료 후 실행
  • 주로 초기화 작업(DB 연결, 캐시 로딩)

2. @PreDestroy

  • Bean 소멸 직전 실행
  • 주로 리소스 정리(DB 해제, 파일 닫기)
public class MyBeanV3 {
    private String data;

    @PostConstruct
    public void init() {
        System.out.println("초기화 메서드 실행");
    }

    @PreDestroy
    public void destroy() {
        System.out.println("소멸 메서드 실행");
    }
}

⚠️ 단점

  • 외부 라이브러리에는 적용할 수 없음
    👉 이 경우엔 @Bean(initMethod, destroyMethod) 사용

📦 Bean Scope (스코프)

  • Bean이 얼마나 오래, 어떤 범위에서 유지되는지를 결정하는 개념

1. 🟢 싱글톤(Singleton)

  • 컨테이너 내에서 단 하나의 Bean 인스턴스만 생성
  • 모든 요청이 같은 객체를 사용
@Scope("singleton") // 생략 가능
@Bean
public SingletonBean singletonBean() { ... }

✅ 특징

  • Application 전역에서 공유
  • 상태를 가지면 안 됨 (동시성 문제 발생 가능)
  • 주로 Service, Repository 계층에서 사용

2. 🟡 프로토타입(Prototype)

  • 요청 시마다 새로운 객체 생성
  • 초기화까지만 Spring이 관리 → 소멸(@PreDestroy)은 관리 안 함
@Scope("prototype")
@Bean
public ProtoTypeBean protoTypeBean() { ... }

✅ 특징

  • 매번 다른 설정값이 필요한 객체
  • 상태를 가지는 임시 객체

❌ 단점: 직접 소멸 관리 필요 (close 호출 X → 리소스 누수 위험)

3. 🌐 웹 스코프(Web Scope)
→ 웹 애플리케이션 전용 스코프

  • request: HTTP 요청마다 새로운 Bean 생성 → 요청 끝나면 소멸
  • session: HTTP 세션 단위로 Bean 유지 → 세션 종료 시 소멸
  • application: 서블릿 컨텍스트 범위에서 Bean 1개 생성

✅ 사용처

  • request: 컨트롤러 요청 처리용 객체
  • session: 사용자 로그인 정보 유지 객체

🧠 요약 정리

  • 생명주기 관리

    • @Bean(initMethod, destroyMethod) → 외부 라이브러리에도 적용 가능
    • @PostConstruct, @PreDestroy → 실무 권장 방식
  • Bean Scope

    • Singleton: 기본, 대부분의 Bean은 이 방식
    • Prototype: 매번 새로운 객체 필요할 때
    • Request/Session: Web Application에서 요청·세션 단위로 사용

⚙️ 초기화 & 소멸 메서드 설정 방법

방법설명장점단점예시
@Bean(initMethod, destroyMethod)설정 클래스에서 메서드 지정- Spring 의존 없음
- 메서드명 자유롭게 설정
- 외부 라이브러리에도 적용 가능
코드와 설정이 분리됨@Bean(initMethod="init", destroyMethod="close")
@PostConstruct / @PreDestroyBean 내부에 어노테이션 붙여 초기화/소멸 지정- 가장 단순
- Spring 권장 방식
- 코드 안에서 바로 확인 가능
외부 라이브러리엔 적용 불가@PostConstruct public void init() {}

📦 Bean Scope 종류

스코프생성 시점소멸 관리사용처특징
Singleton (기본)컨테이너 시작 시 1회 생성Spring이 관리Service, Repository전역 공유 Bean, 상태 없음
PrototypeBean 요청 시마다 생성클라이언트가 직접 관리임시 객체 (상태 있음)@PreDestroy 실행 안 됨
RequestHTTP 요청 시 생성요청 종료 시 소멸웹 요청 처리 Bean요청마다 독립 객체
Session웹 세션 시작 시세션 종료 시 소멸로그인 사용자 정보세션 단위 공유
Application웹 앱 시작 시앱 종료 시 소멸전체 애플리케이션 리소스서블릿 컨텍스트 범위

0개의 댓글