당니의 개발자 스토리
Spring Bean 생명주기 본문
객체는 언제 생성되고 언제 사라질까
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) → 명시적 방식
둘 다 동일한 역할을 한다.
단지 작성 방식이 다를 뿐이다.
'Java, Spring' 카테고리의 다른 글
| @Autowired와 @Qualifier (0) | 2026.05.06 |
|---|---|
| @Component vs @Bean (0) | 2026.05.06 |
| DI는 왜 필요할까? 객체 생성 책임과 Spring Container (0) | 2026.05.06 |
| Maven, 빌드 자동화 도구에 대해서 (0) | 2026.05.06 |
| JUnit과 Assertion으로 테스트 코드 작성하기 (0) | 2026.05.06 |