Bean의 스코프(Scope)

혜얌·2024년 5월 2일
0

Spring

목록 보기
5/5

Spring 프레임워크에서 빈의 스코프(Scope)는 해당 빈(Bean) 인스턴스가 생성되고 유지되는 범위를 나타낸다.

각각의 빈은 특정한 스코프를 갖고 있으며, 이를 통해 빈의 생명주기를 제어하고 의존성 관리를 할 수 있다.

빈 스코프의 종류

  • 싱글톤(Singleton)
  • 프로토타입(Prototype)
  • 세션(Session)
  • 요청(Request)
  • 세션-팩토리(Session-Factory)

빈의 스코프를 설정함으로써 애플리케이션의 성능, 메모리 사용 및 객체의 생명주기를 효과적으로 관리할 수 있다.

싱글톤(Singleton)

public static void main(String[] args){
	AnnotataionConfigApplicationContext ctx = new AnnotataionConfigApplicationContext(AppContext.class);
    
    Greeter g1 = ctx.getBean("greeter", Greeter.class);
    Greeter g2 = ctx.getBean("greeter", Greeter.class);
    System.out.println("g1 == g2" + (g1 == g2));
    ctx.close();
}

이 코드의 결과는 true

별도의 설정을 하지 않을 경우 스프링은 한 개의 빈 객체만을 생성하며, 이때 빈 객체는 싱글톤 범위를 갖는다 라고 표현한다.

싱글톤은 단일 객체를 의미하는 단어로서 스프링은 기본적으로 한 개의 Bean 어노테이션에 대해 한 개의 빈 객체를 생성한다.

싱글톤 스코프의 특징과 장점은 다음과 같다.

  • 유일성
    - 하나의 빈 인스턴스만 존재하기 때문에 애플리케이션 전반에서 해당 빈에 대한 상태가 공유됨
  • 메모리 절약
    - 여러 요청 또는 사용자 세션에서 동일한 빈 인스턴스를 공유하므로 메모리 사용을 최적화할 수 있음
  • 성능 향상
    - 매번 새로운 인스턴스를 생성할 필요가 없으므로 객체 생성 및 초기화에 드는 비용이 줄어들어 성능이 향상
  • 의존성 관리
    - 싱글톤 스코프를 사용하면 의존성 주입(Dependency Injection)을 통해 다른 빈에 쉽게 주입 가능

하지만 주의할 점으로는 싱글톤 빈은 모든 요청 또는 사용자 세션에서 동일한 인스턴스를 공유하므로, 객체 상태 변경 시 주의해야 한다.
또한, 멀티스레드 환경에서 상태가 변경될 경우 동기화 문제가 발생할 수 있으므로 이를 고려해야 한다.
싱글톤 빈 간에 순환 의존성이 있을 경우 빈 생성이 실패할 수 있으므로 이 경우에도 주의가 필요하다.

정리하자면 특징은

  • 기본 스코프이며, Spring 애플리케이션 컨텍스트에서 하나의 빈 인스턴스만 생성된다.
  • 애플리케이션 전반에 걸쳐서 공유되는 객체에 사용된다.
  • 모든 요청에 대해 동일한 인스턴스를 반환한다.

프로토타입(ProtoType)

public static void main(String[] args){
	AnnotataionConfigApplicationContext ctx = new AnnotataionConfigApplicationContext(AppContext.class);
    
    Greeter g1 = ctx.getBean("greeter", Greeter.class);
    Greeter g2 = ctx.getBean("greeter", Greeter.class);
    System.out.println("g1 == g2" + (g1 == g2));
    ctx.close();
}

위와 같은 코드의 결과는 false

프로토타입은 매번 요청할 때마다 새로운 빈 인스턴스를 생성하여 반환한다.
즉, 프로토타입 스코프의 빈은 호출될 때마다 새로운 객체가 생성되고, 각각의 요청에 대해 별도의 인스턴스가 제공된다.

프로토타입 스코프를 사용하는 빈은 Spring 컨테이너에 의해 생성된 후에는 컨테이너에 의해 관리되지 않기에 개발자가 직접 빈의 생명주기를 관리해야 한다.
예를 들어, 빈이 더 이상 필요하지 않을 때 수동으로 빈을 소멸시켜야 한다.

프로토타입 스코프를 사용하는 빈은 주로 다음과 같은 상황에서 유용하다.

  • 매 요청마다 독립적인 객체 인스턴스가 필요한 경우
  • 상태를 공유하지 않고 매번 새로운 인스턴스를 사용해야 하는 경우
  • 메모리 누수를 방지하고자 하는 경우

프로토타입 스코프를 지정하는 방법은 다양하다.

  • XML 기반의 설정 파일에서는 요소의 scope 속성을 "prototype"으로 지정하여 프로토타입 스코프를 설정할 수 있음
  • Java 기반의 설정에서는 @Scope("prototype") 어노테이션을 사용하여 빈을 프로토타입 스코프로 지정할 수 있음

프로토타입 스코프의 주의할 점은 빈의 생명주기를 Spring이 관리하지 않으므로, 프로토타입 빈이 다른 빈에 의존하고 있을 때 해당 의존성이 어떻게 처리되는지 주의해야 한다. 종속성 주입이나 초기화를 위한 콜백 메서드는 프로토타입 빈에서 잘 작동하지 않을 수 있다.

정리하자면 특징은

  • 매번 요청할 때마다 새로운 빈 인스턴스를 생성한다.
  • 매 요청마다 새로운 객체를 생성하여 빈의 상태가 공유되지 않는다.
  • 프로토타입 빈은 생성된 후 Spring 컨테이너에 의해 관리되지 않으므로 메모리 누수에 유의해야 한다.

그외 스코프 타입

세션(Session)

  • 웹 애플리케이션에서 HTTP 세션과 연결된 스코프
  • 하나의 HTTP 세션에 대해 하나의 빈 인스턴스가 생성
  • 각 사용자 세션마다 독립적인 상태를 유지해야 할 때 사용

요청(Request)

  • HTTP 요청마다 새로운 빈 인스턴스를 생성
  • 각각의 HTTP 요청마다 독립적인 상태를 유지해야 할 때 사용
  • 웹 애플리케이션의 각 요청마다 새로운 빈 인스턴스를 생성하여 사용

세션-팩토리(Session-Factory)

  • Hibernate와 같은 ORM(Object-Relational Mapping) 프레임워크에서 사용되는 스코프
  • 각 Hibernate 세션 팩토리에 대해 하나의 빈 인스턴스를 생성
  • 세션 팩토리는 데이터베이스 연결을 관리하고 영속성 컨텍스트를 관리하는 데 사용
profile
얌얌

0개의 댓글