노트

빈 스코프

Bean Scopes

백엔드#spring · 연결된 개념 5개

쉽게 말하면

빈 스코프는 스프링이 객체를 몇 개 만들어 얼마나 오래 둘지 정하는 규칙이에요. 사무실 정수기처럼 하나를 모두가 같이 쓸지, 종이컵처럼 쓸 때마다 새로 꺼낼지 고르는 거죠.

비유가 깨지는 곳 정수기와 달리 싱글턴 빈에 바뀌는 필드를 두면 여러 요청 스레드가 같은 값을 덮어써요. 또 싱글턴에 프로토타입을 주입하면 처음 한 번만 받아서 계속 같은 걸 쓰니 ObjectProvider로 꺼내 써요.

빈 스코프(bean scope)는 스프링 컨테이너가 빈 인스턴스를 언제 만들고 얼마나 오래 유지하는지를 정한다. 기본값은 싱글턴이다.

스코프인스턴스쓰임
singleton (기본)컨테이너당 하나서비스·리포지터리 대부분
prototype요청(주입·조회)할 때마다 새로상태를 가진 일회성 객체
requestHTTP 요청마다요청 단위 정보
sessionHTTP 세션마다사용자별 장바구니 같은 상태
application서블릿 컨텍스트당 하나앱 전체 공용 값

싱글턴 빈은 상태를 갖지 않는다

싱글턴 빈 하나를 여러 요청 스레드가 동시에 쓴다. 빈에 변경 가능한 필드를 두면 두 요청이 같은 값을 덮어쓰는 경쟁 상태(race condition)가 생긴다(예: 두 사용자가 같은 좌석을 동시에 예약).

@Service
public class ReservationService {
    private int lastSeat;      // 위험: 모든 요청이 공유
    public void reserve(int seat) { /* ... */ }
}
  • 서비스는 불변 필드(주입받은 협력 객체)만 두고, 요청별 값은 메서드 지역 변수나 파라미터로 다룬다
  • 동기화로 막을 수는 있지만 복잡도와 성능 비용이 커서 보통 설계로 피한다

프로토타입을 싱글턴에 주입하면

싱글턴이 생성될 때 프로토타입 빈을 한 번 주입받고 끝이라, 그 뒤로는 계속 같은 인스턴스를 쓴다. 매번 새로 필요하면 ObjectProvider<T>로 꺼내 쓰거나 메서드 주입(method injection)을 쓴다.

웹 스코프

@RequestScope, @SessionScope, @ApplicationScope는 웹 환경에서만 쓸 수 있다. 싱글턴에 주입할 때는 스코프 프록시(scoped proxy)가 대신 들어가 실제 호출 시점의 요청·세션 인스턴스로 연결해 준다(스프링 프록시).

  • request 스코프 빈 생성은 매 요청마다 일어나므로 무거운 초기화를 넣지 않는다
  • session 스코프에 큰 데이터나 민감 정보를 두면 서버 메모리와 보안 부담이 커진다. 서버를 여러 대로 늘리면 세션 공유도 필요하다(세션 인증)

"하나만 둔다"는 결정의 일반론은 싱글턴 패턴을 본다. 주입 방식은 의존성 주입 (DI)에서 다룬다.

출처: Spring Framework 문서: Bean Scopes · 싱글턴 빈과 프로토타입 빈의 상호작용 · 스코프 빈을 의존성으로 주입하기

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 스프링 설정 외부화와 프로파일

    스프링 부트는 설정값을 코드 밖(application.yml·환경변수·명령줄 인자 등)에 두고, 실행 환경에 따라 다른 값을 주입하게 해 준다. 같은 빌드 산출물을 개발·QA·운영에 그대로 쓰고 설정만 바꾸는 것이 목표다.

  • NestJS

    NestJS는 TypeScript를 전제로 모듈·의존성 주입(Dependency Injection, DI)·데코레이터(decorator) 구조를 제공하는 Node.js 서버 프레임워크다. 2017년 Kamil Myśliwiec가 만들었고, 구조를 강제하는 방식 때문에 흔히 "Node.js의 Spring"이라 불린다.

  • 스프링 AOP

    AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)는 로깅·트랜잭션·보안·실행 시간 측정처럼 여러 클래스에 흩어져 반복되는 횡단 관심사(cross-cutting concern)를 한 곳에 모아, 비즈니스 코드를 건드리지 않고 메서드 호출 앞뒤에 끼워 넣는 방법이다. 스프링 AOP는 이를 프록시로 구현한다.

  • 의존성 역전 원칙

    고수준 모듈(업무 규칙)이 저수준 모듈(데이터베이스(DB), HTTP(Hypertext Transfer Protocol) 클라이언트 같은 세부 구현)에 직접 의존하지 않고, 둘 다 추상화에 의존해야 한다는 원칙. 의존 방향이 "업무 → 세부"에서 "세부 → 추상화 ← 업무"로 뒤집힌다.

  • 스프링과 장고 비교

    스프링과 장고는 같은 문제(요청 처리, 의존성 관리, 부가 기능 분리, DB 접근)를 각 언어의 성격에 맞게 다르게 푼다. 스프링은 명시적인 IoC(Inversion of Control) 컨테이너와 프록시 기반 AOP(Aspect-Oriented Programming)를, 장고는 설정 파일·import·데코레이터·미들웨어 같은 파이썬다운 장치를 쓴다.

보기 옵션