인스턴스(빈)의 생명 주기에 따라 어떤 애너테이션을 사용하는가?
- 초기화 시점 (객체 생성 및 준비 완료 후):
@PostConstruct
- 소멸 시점 (객체 사라지기 직전):
@PreDestroy
이 두 가지가 인스턴스의 '탄생'과 '죽음' 시점에 직접 관여하는 핵심 애노테이션이다.
📜 1단계 : "이 클래스를 스프링이 관리해줘!" - 빈 등록
가장 먼저 스프링에게 "이 클래스는 평범한 클래스가 아니야. 네가 직접 관리하고 책임져야 할 소중한 '빈(Bean)'이야!"라고 알려줘야 한다.
- 주요 애너테이션
@Component
: 가장 기본적인 빈 등록 애노테이션.@Service
: 비즈니스 로직을 담당하는 서비스 계층에 사용. (@Component
포함)@Repository
: 데이터 접근(DB 등)을 담당하는 영속 계층에 사용. (@Component
포함)@Controller
,@RestController
: 웹 요청을 처리하는 표현 계층에 사용. (@Component
포함)
이 애노테이션이 붙은 클래스를 스프링이 찾아서 "아하, 이 클래스로는 내가 직접 객체를 만들어야겠구나!"라고 인식한다.
🏗️ 2단계 : "객체를 만들어줘!" - 인스턴스 생성
스프링이 @Component
등을 보고 해당 클래스의 객체(인스턴스)를 생성한다. (내부적으로 new MyClass()
와 유사한 작업이 일어난다.)
- 관련 애노테이션:
@Scope(...)
- 이 애노테이션은 "객체를 언제, 몇 개나 만들지"를 결정한다.
@Scope("singleton")
: (기본값) 딱 1개만 만들어서 계속 재사용.@Scope("prototype")
: 요청할 때마다 매번 새로 생성.
이 단계에서는 객체의 뼈대만 만들어진 상태다.
🔗 3단계 : "필요한 부품들을 조립해줘!" - 의존성 주입
객체가 혼자 일할 수는 없다. 다른 협력 객체(부품)들이 필요하다. 이 부품들을 "주입"해달라고 스프링에 요청한다.
- 주요 애노테이션:
@Autowired
: "이 필드(또는 생성자)에 맞는 타입의 빈을 찾아서 자동으로 넣어줘!"@Resource
:@Autowired
와 비슷하지만, 이름으로 빈을 찾을 수도 있는 등 약간의 차이가 있다. (자바 표준)
이 단계가 끝나면, 인스턴스는 필요한 모든 협력 객체들을 장착한 상태가 된다.
✨ 4단계: "최종 조립 완료 후, 자체 점검!" - 초기화 콜백
바로 이 시점에서 객체가 생성되고, 필요한 모든 부품(@Autowired
필드 등)까지 조립이 완료된다. 이제 본격적으로 일을 시작하기 전에 마지막으로 해야 할 준비 작업이 있을 수 있다. (예: DB 커넥션 풀 설정, 외부 설정 파일 로딩 등)
- 핵심 애너테이션:
@PostConstruct
- 이 애너테이션이 붙은 메서드는 위 3단계(의존성 주입)까지 모두 끝난 직후, 딱 한 번 호출된다.
- 생성되는 인스턴스마다 1회씩 호출되지만 싱글톤이기 때문에 1번 호출
- "모든 준비가 끝났으니, 이제 마지막으로 자체 점검 및 준비를 시작해라!"라는 신호다.
- 이 애너테이션이 붙은 메서드는 위 3단계(의존성 주입)까지 모두 끝난 직후, 딱 한 번 호출된다.
🏃 5단계: "이제 일하자!" - 빈 사용
모든 준비를 마친 빈은 이제 스프링 컨테이너 안에서 대기하다가, 다른 곳에서 필요로 할 때마다 자신의 역할을 수행한다.
🔌 6단계: "마무리 정리!" - 소멸 콜백
애플리케이션이 종료되는 등, 더 이상 빈이 필요 없어져서 메모리에서 사라지기 직전이다. 마지막으로 자원을 정리할 기회가 주어진다. (예: 사용하던 네트워크 연결 해제, 임시 파일 삭제 등)
- 핵심 애노테이션:
@PreDestroy
- 이 애노테이션이 붙은 메소드는 빈이 소멸되기 직전에 딱 한 번 호출된다.
- "곧 사라질 테니, 마지막으로 주변을 정리하고 가라!"는 신호다.
최종 요약
단계 | 역할 | 주요 애노테이션 | 설명 |
---|---|---|---|
1. 빈 등록 | "이 클래스를 관리해줘" | @Component , @Service 등 |
클래스를 스캔해서 스프링 빈으로 등록하도록 표시 |
2. 의존성 주입 | "필요한 부품을 넣어줘" | @Autowired , @Resource |
필드나 생성자에 다른 빈을 자동으로 주입 |
3. 초기화 콜백 | "준비 완료 후 실행" | @PostConstruct |
의존성 주입까지 끝난 직후, 인스턴스당 딱 한 번 실행할 로직 |
4. 소멸 콜백 | "사라지기 직전 실행" | @PreDestroy |
빈이 소멸되기 직전, 인스턴스당 딱 한 번 실행할 정리 로직 |
(기타) | "생성 방식을 정해줘" | @Scope |
빈의 생성 방식(스코프)을 지정 |
실제 개발에서는 주로 @Service
나 @Component
로 빈을 등록하고, @Autowired
로 의존성을 주입받은 다음, 특별한 초기화 작업이 필요할 때 @PostConstruct
를 사용하게 된다.
'Spring' 카테고리의 다른 글
스프링에서 받을 데이터는 '명시적'이어야 한다. (0) | 2025.06.13 |
---|---|
스프링 빈의 종류 : 스코프 (1) | 2025.06.10 |
스프링 프레임워크의 동작 방식 (2) | 2025.06.09 |
[3편] 좋은 DI 설계: 스프링의 빈 탐색 원리와 OCP (0) | 2025.06.03 |
[2편] 스프링 DI의 3가지 방식 : 생성자 주입을 써야만 하는 이유 (0) | 2025.06.03 |