Spring 프레임워크에서 빈의 스코프(Scope)는 해당 빈(Bean) 인스턴스가 생성되고 유지되는 범위를 나타낸다.
각각의 빈은 특정한 스코프를 갖고 있으며, 이를 통해 빈의 생명주기를 제어하고 의존성 관리를 할 수 있다.
빈의 스코프를 설정함으로써 애플리케이션의 성능, 메모리 사용 및 객체의 생명주기를 효과적으로 관리할 수 있다.
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 어노테이션에 대해 한 개의 빈 객체를 생성한다.
싱글톤 스코프의 특징과 장점은 다음과 같다.
하지만 주의할 점으로는 싱글톤 빈은 모든 요청 또는 사용자 세션에서 동일한 인스턴스를 공유하므로, 객체 상태 변경 시 주의해야 한다.
또한, 멀티스레드 환경에서 상태가 변경될 경우 동기화 문제가 발생할 수 있으므로 이를 고려해야 한다.
싱글톤 빈 간에 순환 의존성이 있을 경우 빈 생성이 실패할 수 있으므로 이 경우에도 주의가 필요하다.
정리하자면 특징은
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 컨테이너에 의해 생성된 후에는 컨테이너에 의해 관리되지 않기에 개발자가 직접 빈의 생명주기를 관리해야 한다.
예를 들어, 빈이 더 이상 필요하지 않을 때 수동으로 빈을 소멸시켜야 한다.
프로토타입 스코프를 사용하는 빈은 주로 다음과 같은 상황에서 유용하다.
프로토타입 스코프를 지정하는 방법은 다양하다.
프로토타입 스코프의 주의할 점은 빈의 생명주기를 Spring이 관리하지 않으므로, 프로토타입 빈이 다른 빈에 의존하고 있을 때 해당 의존성이 어떻게 처리되는지 주의해야 한다. 종속성 주입이나 초기화를 위한 콜백 메서드는 프로토타입 빈에서 잘 작동하지 않을 수 있다.
정리하자면 특징은