[Spring] 빈 스코프

2025. 2. 21. 06:32코딩 도구/백엔드 개발 (Backend Development)

반응형

스프링 빈 스코프

김영한님의 "스프링 핵심 원리 - 기본편"을 수강하고 정리했습니다.

 

1. 빈 스코프란?

스프링 빈은 기본적으로 싱글톤(Singleton) 스코프를 가진다. 하지만 특정 요구사항에 따라 다양한 스코프를 지정할 수 있으며, 이 기능을 활용하면 애플리케이션의 유연성이 증가한다.

2. 주요 빈 스코프 종류

1) 싱글톤(Singleton) 스코프 (기본값)

  • 스프링 컨테이너가 시작될 때 생성되고, 컨테이너 종료 시까지 유지
  • 모든 요청에서 동일한 인스턴스 공유
  • 대부분의 스프링 빈이 기본적으로 싱글톤으로 동작
@Component
public class SingletonBean {
    public SingletonBean() {
        System.out.println("싱글톤 빈 생성됨");
    }
}

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

  • 빈이 요청될 때마다 새로운 인스턴스가 생성됨
  • 스프링 컨테이너가 관리하는 것이 아니라, 요청한 클라이언트가 직접 관리해야 함
  • 자주 변경되는 데이터를 저장하는 객체에 적합
@Scope("prototype")
@Component
public class PrototypeBean {
    public PrototypeBean() {
        System.out.println("프로토타입 빈 생성됨");
    }
}

사용 예:

@Autowired
private PrototypeBean prototypeBean1;
@Autowired
private PrototypeBean prototypeBean2;

System.out.println(prototypeBean1 == prototypeBean2); // false

3) 웹 관련 스코프

웹 애플리케이션에서 사용되는 스코프

  • Request 스코프: HTTP 요청이 시작될 때 생성되고, 요청이 끝나면 소멸
  • Session 스코프: HTTP 세션이 유지되는 동안 빈이 유지됨

Request 스코프 예제

@Scope("request")
@Component
public class RequestBean {
    public RequestBean() {
        System.out.println("Request 스코프 빈 생성됨");
    }
}

Session 스코프 예제

@Scope("session")
@Component
public class SessionBean {
    public SessionBean() {
        System.out.println("Session 스코프 빈 생성됨");
    }
}

3. 프로토타입 빈과 싱글톤 빈을 함께 사용할 때의 문제

싱글톤 빈이 프로토타입 빈을 의존성으로 가질 경우, 프로토타입 빈이 처음 한 번만 생성되어 계속 재사용되는 문제가 발생할 수 있다.

문제 발생 예제

@Component
@Scope("prototype")
public class PrototypeService {
    public void doSomething() {
        System.out.println("프로토타입 빈 동작");
    }
}

@Component
public class SingletonService {
    private final PrototypeService prototypeService;
    
    @Autowired
    public SingletonService(PrototypeService prototypeService) {
        this.prototypeService = prototypeService;
    }
}

위 코드에서는 SingletonService가 생성될 때 PrototypeService가 주입되므로, 이후에는 같은 인스턴스를 계속 사용하게 된다.

해결 방법: ObjectProvider 사용

@Component
public class SingletonService {
    private final ObjectProvider<PrototypeService> prototypeServiceProvider;
    
    @Autowired
    public SingletonService(ObjectProvider<PrototypeService> prototypeServiceProvider) {
        this.prototypeServiceProvider = prototypeServiceProvider;
    }
    
    public void execute() {
        PrototypeService prototypeService = prototypeServiceProvider.getObject();
        prototypeService.doSomething();
    }
}

이렇게 하면 매번 새로운 프로토타입 빈이 생성되어 사용된다.

4. 실무에서 중요한 내용

1) 웹 애플리케이션에서 request 스코프 활용법 익히기

  • 사용자마다 고유한 데이터를 저장할 때 유용함 (ex. 로그인 정보, 요청별 설정값)
  • 요청이 끝나면 자동으로 소멸되므로 메모리 관리가 효율적

2) 프로토타입 빈과 싱글톤 빈을 함께 사용할 때의 문제 해결법 이해

  • 싱글톤 빈이 프로토타입 빈을 의존할 경우 주의해야 함
  • ObjectProvider, ProxyMode 등을 활용하여 매번 새로운 인스턴스를 주입할 수 있도록 설정

5. 결론

빈 스코프를 적절히 활용하면 애플리케이션의 성능과 유지보수성을 크게 향상시킬 수 있다. 기본적으로는 싱글톤을 사용하지만, 필요에 따라 프로토타입, request, session 스코프를 적절히 적용하는 것이 중요하다.

반응형