Spring의 ApplicationContext와 Bean 관리 개념 정리

민준·2025년 3월 5일
post-thumbnail

1. ApplicationContext란?

  • Spring에서 Bean을 생성하고 관리하는 컨테이너
  • 개발자가 직접 객체를 생성(new)하는 대신, Spring이 대신 생성하고 관리

역할

  • Spring Bean(객체) 등록
  • Spring Bean 사용 관리
  • 의존성 주입(DI, Dependency Injection) 제공

2. Spring Bean이란?

  • Spring이 관리하는 객체
  • 개발자가 직접 new 키워드로 생성하는 게 아니라, Spring이 대신 객체를 생성하고 관리

Spring Bean의 특징

  • Spring이 관리하는 객체(Bean)는 기본적으로 싱글톤(Singleton)으로 관리
  • 싱글톤이란?
    • 하나의 객체만 생성하여 애플리케이션 전역에서 공유하는 방식
    • 동일한 Bean을 여러 번 요청해도, 같은 객체를 반환함
    • 반복적인 객체 생성을 막아 성능을 향상시키는 효과

3. 싱글톤(Singleton) 패턴과 Spring Bean 관리

Spring에서 Bean을 싱글톤으로 관리하는 이유

  1. 대규모 시스템의 성능 최적화

    • 서버는 초당 수십 ~ 수백 번의 요청을 처리해야 함
    • 요청마다 객체를 새로 만들면 메모리 낭비 + 성능 저하
    • 싱글톤 객체로 공유하면 메모리 사용량 절약 가능
  2. Spring MVC 구조 특성상 계층 구조를 가짐

    • 데이터 액세스, 서비스, 컨트롤러 등 다양한 계층에서 동일한 객체 사용
    • 매 요청마다 객체를 새로 만들지 않고, 하나의 객체를 공유하면 성능 향상
  3. Spring 컨테이너(ApplicationContext)가 싱글톤을 직접 관리

    • 기존의 Java 싱글톤 패턴의 한계를 보완
    • Spring이 직접 객체 생성을 관리하여 테스트 용이, 확장성 증가

4. Spring에서 싱글톤 관리 방식

Java 싱글톤 패턴의 문제점

  1. private 생성자로 인해 상속 불가능, 불편한 테스트
  2. 클래스 로더에 따라 싱글톤 유지가 어려움
    • 예: 하나의 애플리케이션에 여러 개의 클래스 로더가 있을 경우, 싱글톤이 깨질 수 있음

Spring이 해결한 방식

  1. Spring 컨테이너(ApplicationContext)가 직접 싱글톤 관리
  2. DI(Dependency Injection)를 사용하여 싱글톤 객체를 주입
  3. 필요할 때 객체를 생성하고, 이후 같은 객체를 재사용

5. Spring Bean Scope (라이프사이클)

Scope란?

  • Spring Bean이 생성되고 사용되는 범위를 설정하는 개념
  • 기본적으로 Spring Bean은 싱글톤(Singleton)으로 관리됨
  • 하지만 특정한 상황에서는 다른 Scope를 설정할 수도 있음

주요 스코프 5가지

Scope설명사용 예시
Singleton (기본)애플리케이션 시작 시 한 번만 생성되어 모든 요청에서 공유@Service, @Repository 등의 기본 Bean
Prototype매번 새로운 객체 생성특정 서비스 로직에서 Bean을 매번 새로 만들어야 할 때
RequestHTTP 요청마다 새로운 객체 생성 (요청 끝나면 소멸)웹 요청마다 다른 객체를 유지할 때
SessionHTTP 세션마다 하나의 객체 유지사용자 로그인 세션 유지
Application애플리케이션 전역에서 하나만 유지설정 정보 저장

Spring Bean 주요 스코프 5가지 코드 예제

Singleton (기본값)

@Component
public class SingletonBean {
}

Spring이 자동으로 싱글톤으로 관리
모든 요청에서 같은 객체 사용


Prototype (매번 새 객체 생성)

@Component
@Scope("prototype")
public class PrototypeBean {
}
  • 객체를 요청할 때마다 새로 생성됨

  • 객체 소멸은 GC(Garbage Collector)가 담당

  • 예제:

     @Autowired
     private PrototypeBean prototypeBean1;
    
     @Autowired
     private PrototypeBean prototypeBean2;
    
     System.out.println(prototypeBean1 == prototypeBean2); // false (다른 객체)

Request (HTTP 요청마다 새로운 객체 생성)

@Component
@RequestScope
public class RequestBean {
}
  • HTTP 요청이 들어오면 새 객체 생성, 응답이 끝나면 소멸
  • 사용 예시: 사용자마다 다른 데이터를 유지해야 할 때

Session (사용자 세션마다 하나의 객체 유지)

@Component
@SessionScope
public class SessionBean {
}
  • 같은 사용자 세션에서는 같은 객체 사용
  • 사용 예시: 로그인한 사용자 정보 유지

0개의 댓글