[Spring] 스프링 컨테이너와 빈

2025. 7. 16. 01:39·Spring


스프링 컨테이너 

스프링 컨테이너는 IoC를 실현하는 실제 주체라고 생각하면 된다. 쉽게 말해, 프로그램 시작 시 필요한 객체들을 대신 만들어 보관하고, 필요할 때 꺼내서 의존성까지 연결해주는 공장이자 보관소라고 생각하면 된다. 

✅  스프링 컨테이너의 종류 

스프링 컨테이너는 크게 2가지로 `BeanFactory`와 `ApplicationContext`가 있다. 

1) BeanFactory 

기본적인 의존성 주입을 지원하는 가장 간단한 형태의 컨테이너이다.

 

주요 기능

  • BeanFactory는 빈을 등록하고 생성하고 조회하고 돌려주는 등 빈을 관리하는 역할
  • 기본적인 의존성 주입 지원 

특징 : 필요할 때만 빈을 생성하는 지연 로딩 (lazy loading) 전략을 사용한다.

 

 

2) ApplicationContext

BeanFactory의 모든 기능을 포함하는 상위 개념 

 

추가 제공 기능

  • 국제화 
  • 애플리케이션 이벤트 발행/구독 
  • 환경 변수 관리 
  • AOP, 트랜잭션 등 스프링 핵심 기능과 연계 
  • 웹 애플리케이션과의 통합 

특징 : BeanFactory와 다르게 애플리케이션 시작 시 대부분의 빈을 미리 생성하는 즉시 로딩(eager loading) 전략을 사용한다. 

 

-> 우리가 일반적으로 사용하는 것은 `ApplicationContext` 이다. 


빈 (Bean)

빈은 스프링 컨테이너가 관리하는 객체이다. 일반 자바 객체를 new로 만들면 그냥 객체이지만, 스프링 컨테이너에 의해 관리되면 빈이라고 부른다. 

 

✅ 등록 방법 

자동 등록 (컴포넌트 스캔)

@Component
public class ProductService { ... }

이렇게 클래스 선언 위에 `@Component` 어노테이션을 붙여 설정하면 스프링 서버가 뜰 때 객체가 생성되고 Spring IoC Bean으로 저장된다.  @Service, @Repository, @Controller 어노테이션은 `@Component` 어노테이션을 포함하고 있다. 

 

수동 등록 : `@Configuration` 클래스 안에서 `@Bean` 메서드로 직접 등록한다. 

 

✅ 빈의 생명주기 (Lifecycle) 

스프링 컨테이너에서는 단순히 빈을 만들어 주는 것이 아니라, 빈의 전체 생명주기를 컨테이너 차원에서 관리한다. 

 

 

생명주기 단계 

  1. 생성 (Instantiation) : 컨테이너가 빈 인스턴스를 생성한다. 
  2. 의존성 주입 : 필요한 의존성을 컨테이너가 주입한다. 
  3. 초기화 (Initialization) : 의존성 주입까지 끝난 후, 추가적인 초기화 로직이 실행된다. 
    • `@PostConstruct` : 빈의 초기화 작업을 수행할 때 사용하는 어노테이션으로 이 어노테이션이 붙은 메서드는 해당 빈이 생성되고 모든 의존성이 주입이 완료된 후 자동으로 호출된다. 이를 통해 빈의 초기화 과정에서 추가적인 설정이나 초기화 작업을 수행할 수 있다. 
    • 대표적인 예시가 key 값이다. `@Value` 어노테이션을 통해 처음부터 설정해도 괜찮지만, 해당 key값이 db 나 외부 api 호출을 통해 동적으로 결정되거나 실시간으로 바뀔 수 있는 값이라면 `@Value`만으로는 해결하기 어려워 이럴 경우에는 빈이 완전히 초기화된 직후에 해당 key값을 읽어오도록 하면 안전하다. 
  4. 사용 : 애플리케이션 로직에서 빈이 실제로 사용된다. 
  5. 소멸 (Desctruction) : 컨테이너가 종료될 때 빈도 소멸된다. 
    • `@PreDestroy` : 빈이 소멸되기 직전에 호출되는 메서드를 지정하는 어노테이션이다. 주로 리소스를 정리하거나, 연결을 종료하거나, 애플리케이션 종료 전에 꼭 처리해야하는 작업을 수행할 때 사용한다. 예를 들어, 애플리케이션 종료되기 전에 캐시에 저장된 데이터를 파일이나 데이터베이스에 저장하는 등의 작업을 수행할 수 있다. 

 

✅ 빈의 스코프 (Scope) 

스코프는 이름 그대로 범위라는 뜻으로 빈 스코프는 빈이 존재할 수 있는 범위를 의미한다. 

 

기본적으로 스프링 컨테이너에서는 빈이 싱글톤으로 생성되고 관리되고 스프링 컨테이너와 생명주기를 같이하기 때문에 신경 쓸 필요가 없다. 그러나, 빈 스코프를 어떻게 설정하느냐에 따라 스프링 빈의 생성과 소멸을 클라이언트에서 관리해줘야하는 경우가 생길 수 있고 다양한 요구사항에 맞는 스코프를 지정해서 사용할 수 있다. 

 

싱글톤 스코프 (Singleton Scope)

스프링 컨테이너는 기본적으로 싱글톤 스코프를 사용한다. 스프링 컨테이너가 생성될 때 싱글톤 빈을 생성하여 스프링 컨테이너에서 관리를 한다. 빈으로 등록된 객체를 사용하기 위해 스프링 컨테이너에 요청하면, 스프링 컨테이너가 싱글톤으로 관리하는 빈을 반환한다. 싱글톤으로 관리하기 때문에 같은 요청이 여러번 와도 같은 스프링 빈 객체 인스턴스를 반환한다. 

 

프로토타입 스코프 (Prototype Scope)

프로토타입 스코프로 설정된 빈은 스프링 컨테이너가 빈을 생성하고 의존성 주입까지만 관여하고 더 이상 관리하지 않는다. 따라서 빈 반환 후에 @PreDestory 가 호출되지 않고, 필요 시에 클라이언트가 직접 빈을 종료시켜줘야 한다. 프로토타입 스코프로 설정된 빈을 스프링 컨테이너에 요청하면, 이 시점에서 스프링 컨테이너가 빈을 생성하고 의존성을 주입하여 클라이언트에 반환한다. 이후에는 스프링 컨테이너가 관리하지 않고, 같은 요청이 여러 번 올 경우 그때마다 새로운 객체 인스턴스를 생성하여 반환한다. 

 

 

✅  빈 스코프 설정 방법 

Bean을 등록하는 부분에서 `@Scope` 어노테이션을 사용하여 설정해줄 수 있다. 싱글톤의 경우 `@Scope`를 생략하면 디폴트 싱글톤으로 설정된다. 

@Scope("prototype")
@Component
public class PrototypeBean{
	//...
}

@Configuration
public class AppConfig{
	
    @Scope("prototype")
    @Bean
    public PrototypeBean prototypeBean(){
    	return new PrototypeBean();
    }
   
}

 

'Spring' 카테고리의 다른 글

[Spring] 레이어드 아키텍처(Layered Architecture)와 Spring MVC  (0) 2025.08.05
[Spring] DispatcherServlet과 스프링부트 동작 구조  (3) 2025.07.26
[Spring] Spring Security의 구조와 흐름  (0) 2025.07.17
[Spring] JWT 토큰 인증 & 쿠키, 세션, 토큰  (0) 2025.07.16
[Spring] 서블릿(Servlet)과 서블릿 컨테이너  (0) 2025.07.16
'Spring' 카테고리의 다른 글
  • [Spring] DispatcherServlet과 스프링부트 동작 구조
  • [Spring] Spring Security의 구조와 흐름
  • [Spring] JWT 토큰 인증 & 쿠키, 세션, 토큰
  • [Spring] 서블릿(Servlet)과 서블릿 컨테이너
erika0915
erika0915
백엔드 개발자가 되고 싶어요 .
  • erika0915
    erikoding
    erika0915
  • 전체
    오늘
    어제
    • 분류 전체보기 (78)
      • 프로젝트 (13)
        • 끼니콩 (3)
        • 덕메랑 (3)
        • handDoc (7)
        • Haeil (0)
      • Java (9)
        • 클린코더스 (0)
      • Spring (30)
      • Redis (3)
      • CS (7)
        • 운영체제 (3)
        • 컴퓨터구조 (0)
        • 네트워크 (4)
      • DevOps (2)
      • 코딩테스트 (0)
      • Tech (14)
        • TDD (1)
        • 정리 (5)
        • 우테코 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    깃허브
    STT
    docker
    깃
    coderabbit
    지라
    스프링
    promtail
    java
    git
    AI
    운영체제
    Spring
    springboot
    도커
    자바
    레디스
    스프링부트
    jira
    CoolSMS
    Network
    코드레빗
    몽고디비
    TDD
    OS
    redis
    네트워크
    MongoDB
    파인튜닝
    github
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
erika0915
[Spring] 스프링 컨테이너와 빈

티스토리툴바