당니의 개발자 스토리

Spring Bean 생명주기 본문

Java, Spring

Spring Bean 생명주기

clainy 2026. 5. 6. 17:33

객체는 언제 생성되고 언제 사라질까

 

Spring을 사용하다 보면 Bean이라는 개념을 계속 보게 된다.

Bean은 단순하게 Spring이 관리하는 객체 이다.

 

그런데 이 Bean은 그냥 만들어졌다가 끝나는 게 아니다.

생성되는 순간부터 사라질 때까지 일정한 흐름을 가진다.

이걸 Bean의 생명주기라고 한다.

 

생명주기는 아래와 같다.

객체 생성
→ 의존성 주입
→ 초기화 메서드
→ 사용
→ 소멸 메서드

 

이제 하나씩 이해해보자!!!

 

가장 먼저 객체가 생성된다.

new 객체()

Spring이 Container 안에서 Bean 객체를 만든다.

 

그 다음 의존성 주입이 일어난다.

예를 들어 이런 코드가 있다고 하자.

@Component
public class WasherUser {

    private final Washer washer;

    public WasherUser(Washer washer) {
        this.washer = washer;
    }
}

Spring은 WasherUser를 만들 때 필요한 Washer를 찾아서 넣어준다.

이게 DI 단계다.

 

그 다음 초기화 메서드가 실행된다.

이건 "사용하기 전에 준비하는 단계" 라고 보면 된다.

DB 연결 준비
외부 API 연결
파일 열기
캐시 준비

같은 작업을 한다.

 

Spring에서는 이걸 이렇게 작성한다.

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

이 메서드는 의존성 주입이 끝난 뒤에 자동으로 실행된다.

 

그 다음 실제로 Bean을 사용하는 단계다.

이때는 이렇게 꺼내 쓴다.

ApplicationContext ctx = ...;
WasherUser user = ctx.getBean(WasherUser.class);

이 코드는 이렇게 해석하면 된다.

Spring아 WasherUser 하나 줘

이미 만들어진 Bean을 꺼내서 사용하는 것이다.

 

마지막으로 소멸 단계다.

Bean이 더 이상 필요 없어질 때 실행된다.

DB 연결 끊기
파일 닫기
리소스 정리

같은 작업을 한다.

 

Spring에서는 이렇게 작성한다.

@PreDestroy
public void destroy() {
    System.out.println("종료 작업 실행");
}

Spring Container가 종료될 때 자동으로 실행된다.


여기서 한 가지 중요한 조건이 있다.

초기화 / 소멸 메서드는 파라미터가 없어야 한다

Spring이 자동으로 호출하는 구조이기 때문에

값을 넣어줄 수 없다.

 

이제 @Component가 아니라 @Bean 방식도 보자.

@Bean(initMethod = "init", destroyMethod = "destroy")
public SWasher sWasher() {
    return new SWasher();
}

이 방식은 초기화 소멸 메서드를 이름으로 지정하는 방식이다.

initMethod → 초기화 메서드
destroyMethod → 소멸 메서드

Spring이 해당 메서드를 찾아서 실행해준다.

 

그럼 @PostConstruct @Bean 방식은 어떻게 다를까?

@PostConstruct / @PreDestroy → 묵시적 방식
@Bean(initMethod, destroyMethod) → 명시적 방식

둘 다 동일한 역할을 한다.

단지 작성 방식이 다를 뿐이다.