JavaScript

웹 개발의 필수 언어

동적인 웹 페이지 구현을 위한 핵심 프로그래밍 언어.

Java

객체지향 프로그래밍

안정적이고 확장성 있는 백엔드 개발의 대표 언어.

HTML

웹의 기초

웹 페이지의 구조를 정의하는 마크업 언어.

React

현대적 UI 라이브러리

효율적인 사용자 인터페이스 구축을 위한 JavaScript 라이브러리.

CSS

웹 디자인의 핵심

웹 페이지의 시각적 표현을 담당하는 스타일 언어.

Spring

자바 웹 프레임워크

기업급 애플리케이션 개발을 위한 강력한 프레임워크.

Spring

인스턴스 생명 주기와 애너테이션 : 한눈에 보기 - 콜백

lamarcK 2025. 6. 9. 11:29

인스턴스(빈)의 생명 주기에 따라 어떤 애너테이션을 사용하는가?

  • 초기화 시점 (객체 생성 및 준비 완료 후): @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번 호출
    • "모든 준비가 끝났으니, 이제 마지막으로 자체 점검 및 준비를 시작해라!"라는 신호다.

🏃 5단계: "이제 일하자!" - 빈 사용

모든 준비를 마친 빈은 이제 스프링 컨테이너 안에서 대기하다가, 다른 곳에서 필요로 할 때마다 자신의 역할을 수행한다.

🔌 6단계: "마무리 정리!" - 소멸 콜백

애플리케이션이 종료되는 등, 더 이상 빈이 필요 없어져서 메모리에서 사라지기 직전이다. 마지막으로 자원을 정리할 기회가 주어진다. (예: 사용하던 네트워크 연결 해제, 임시 파일 삭제 등)

  • 핵심 애노테이션: @PreDestroy
    • 이 애노테이션이 붙은 메소드는 빈이 소멸되기 직전에 딱 한 번 호출된다.
    • "곧 사라질 테니, 마지막으로 주변을 정리하고 가라!"는 신호다.

최종 요약

단계 역할 주요 애노테이션 설명
1. 빈 등록 "이 클래스를 관리해줘" @Component, @Service 클래스를 스캔해서 스프링 빈으로 등록하도록 표시
2. 의존성 주입 "필요한 부품을 넣어줘" @Autowired, @Resource 필드나 생성자에 다른 빈을 자동으로 주입
3. 초기화 콜백 "준비 완료 후 실행" @PostConstruct 의존성 주입까지 끝난 직후, 인스턴스당 딱 한 번 실행할 로직
4. 소멸 콜백 "사라지기 직전 실행" @PreDestroy 빈이 소멸되기 직전, 인스턴스당 딱 한 번 실행할 정리 로직
(기타) "생성 방식을 정해줘" @Scope 빈의 생성 방식(스코프)을 지정

실제 개발에서는 주로 @Service@Component로 빈을 등록하고, @Autowired로 의존성을 주입받은 다음, 특별한 초기화 작업이 필요할 때 @PostConstruct를 사용하게 된다.