별 개수: 50
속도: 2

JavaScript

웹 개발의 필수 언어

동적인 웹 페이지 구현을 위한 핵심 프로그래밍 언어.

Java

객체지향 프로그래밍

안정적이고 확장성 있는 백엔드 개발의 대표 언어.

HTML

웹의 기초

웹 페이지의 구조를 정의하는 마크업 언어.

React

현대적 UI 라이브러리

효율적인 사용자 인터페이스 구축을 위한 JavaScript 라이브러리.

CSS

웹 디자인의 핵심

웹 페이지의 시각적 표현을 담당하는 스타일 언어.

Spring

자바 웹 프레임워크

기업급 애플리케이션 개발을 위한 강력한 프레임워크.

JavaScript

웹 개발의 필수 언어

동적인 웹 페이지 구현을 위한 핵심 프로그래밍 언어.

Java

객체지향 프로그래밍

안정적이고 확장성 있는 백엔드 개발의 대표 언어.

HTML

웹의 기초

웹 페이지의 구조를 정의하는 마크업 언어.

React

현대적 UI 라이브러리

효율적인 사용자 인터페이스 구축을 위한 JavaScript 라이브러리.

CSS

웹 디자인의 핵심

웹 페이지의 시각적 표현을 담당하는 스타일 언어.

Spring

자바 웹 프레임워크

기업급 애플리케이션 개발을 위한 강력한 프레임워크.

JavaScript

웹 개발의 필수 언어

동적인 웹 페이지 구현을 위한 핵심 프로그래밍 언어.

Java

객체지향 프로그래밍

안정적이고 확장성 있는 백엔드 개발의 대표 언어.

HTML

웹의 기초

웹 페이지의 구조를 정의하는 마크업 언어.

React

현대적 UI 라이브러리

효율적인 사용자 인터페이스 구축을 위한 JavaScript 라이브러리.

CSS

웹 디자인의 핵심

웹 페이지의 시각적 표현을 담당하는 스타일 언어.

Spring

자바 웹 프레임워크

기업급 애플리케이션 개발을 위한 강력한 프레임워크.

Spring

스프링 빈의 종류 : 스코프

lamarcK 2025. 6. 10. 12:27

스프링에서 빈의 종류는 스코프(Scope)로 결정된다. 빈의 스코프는 "하나의 빈(객체)이 언제 생성되어 어디까지 공유되고, 언제 사라지는가"를 정의하는 규칙이다.

 

크게 두 그룹으로 나눌 수 있다.

  • 핵심 스코프
  • 웹 환경 전용 스코프

I. 핵심 스코프 (Core Scopes)

웹 환경이 아니어도 스프링을 사용하는 곳이라면 어디서든 사용할 수 있는 기본적인 스코프다.

1. 싱글톤 (Singleton)

  • 설명: 스프링 컨테이너(IoC Container) 안에서 단 하나의 인스턴스만 생성되어 애플리케이션 전반에 걸쳐 공유된다.
  • 특징: 기본값(Default)으로 설정된 스코프다. 별도로 스코프를 지정하지 않으면 모든 빈은 싱글톤으로 만들어진다. 메모리 효율이 좋고 상태를 공유하지 않는(Stateless) 서비스나 DAO(Data Access Object)에 주로 사용된다.
  • 생명주기: 스프링 컨테이너의 시작과 함께 생성되어, 컨테이너가 종료될 때 함께 소멸한다.
  • 비유: 공공기관의 민원 담당 직원. 어떤 민원인(다른 객체)이 찾아와도 항상 그 직원이 업무를 처리한다.

2. 프로토타입 (Prototype)

  • 설명: 빈을 주입받거나 컨테이너에 요청할 때마다 매번 새로운 인스턴스를 생성한다.
  • 특징: 모든 요청에 대해 독립적인 객체가 필요할 때 사용된다. 즉, 상태를 가져야 하는(Stateful) 객체에 적합하다. 중요한 점은 스프링 컨테이너가 생성과 의존성 주입까지만 관여하고, 그 이후의 소멸은 관리하지 않는다는 것이다.
  • 생명주기: 요청 시에 생성되며, 스프링 컨테이너가 소멸을 관리하지 않으므로 GC(가비지 컬렉터)에 의해 처리되거나 사용자가 직접 소멸 처리를 해야 한다.
  • 비유: 자판기의 종이컵. 버튼을 누를 때마다(요청할 때마다) 새 컵이 나오고, 사용 후에는 사용자가 직접 버려야 한다.

II. 웹 환경 전용 스코프 (Web-Aware Scopes)

웹 애플리케이션 환경에서만 의미를 가지며, DispatcherServlet과 같은 웹 관련 컨텍스트가 구성되어 있어야 동작한다.

1. 리퀘스트 (Request)

  • 설명: 하나의 HTTP 요청(Request)이 시작되고 끝날 때까지 단 하나의 인스턴스만 유지된다.
  • 특징: 각각의 HTTP 요청은 자신만의 빈 인스턴스를 가진다. 따라서 다른 요청과 데이터가 섞일 염려가 없다. 요청과 관련된 정보를 처리할 때 유용하다.
  • 비유: 식당의 주문서. 한 손님(HTTP 요청)이 주문하고 식사를 마칠 때까지만 유효한 주문서다. 다른 손님은 다른 주문서를 받는다.

2. 세션 (Session)

  • 설명: 하나의 HTTP 세션(Session)이 유지되는 동안 단 하나의 인스턴스만 유지된다.
  • 특징: 사용자가 웹 사이트에 접속해서 로그아웃하거나 브라우저를 닫을 때까지(세션이 만료될 때까지) 동일한 빈을 계속 사용할 수 있다. 사용자의 로그인 정보, 장바구니 기능 등에 주로 사용된다.
  • 비유: 대형마트의 쇼핑 카트. 한 명의 고객(세션)이 쇼핑을 시작해서 마칠 때까지 계속 사용하는 카트다.

3. 애플리케이션 (Application)

  • 설명: 웹 애플리케이션 전체(ServletContext)의 생명주기와 동일하게 단 하나의 인스턴스만 유지된다.
  • 특징: 싱글톤과 매우 유사하지만, 웹 애플리케이션 단위로만 생성된다는 점에서 차이가 있다. 애플리케이션 전반에서 사용되는 설정 정보나 공용 데이터를 관리할 때 사용된다.
  • 비유: 애플리케이션 전체 공지사항 게시판. 앱이 실행되는 동안 모든 사용자가 동일한 게시판을 본다.

III. 설정 방법

빈의 스코프는 @Scope 어노테이션을 사용하여 직접 지정할 수 있다.

kotlin
클릭하여 코드 펼치기
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope("prototype") // 이 빈은 프로토타입 스코프로 동작한다.
public class MyPrototypeBean {
    // ...
}

@Component // 스코프를 지정하지 않았으므로 기본값인 'singleton'으로 동작한다.
public class MySingletonService {
    // ...
}
클릭하여 코드 복사

IV. 요약 표

스코프 (종류) 핵심 개념 인스턴스 개수 주요 사용처
싱글톤 컨테이너 당 하나 1개 (컨테이너 전체) 서비스, DAO, 설정 클래스
프로토타입 요청 시마다 새로 생성 N개 (요청 횟수만큼) 상태를 가지는 객체
리퀘스트 HTTP 요청 당 하나 N개 (요청 횟수만큼) 요청별 데이터 처리
세션 HTTP 세션 당 하나 N개 (세션 수만큼) 로그인 정보, 장바구니
애플리케이션 웹 앱 당 하나 1개 (웹 앱 전체) 앱 전역 공용 데이터

 

이동