backend
  • README
  • DOCS
    • Java Docs
    • Servlet Docs
    • JSP Docs
    • DB & SQL Docs
    • Spring Boot Docs
    • Spring Security Docs
    • AWS Docs
  • 설치하기
    • Intellij 설정
  • 자바
    • 01 Java란?
    • 02 자바 시작하기
    • 03 자료형과 연산자
    • 04 제어문
    • 05 메소드
    • 06 클래스 기초
      • Static 보충자료
      • 패키지 보충자료
    • 07 객체지향 프로그래밍
    • 08 클래스 더 알아보기
      • 열거형 ENUM 보충자료
    • 09 클래스와 자료형
      • 다형성 보충자료
      • 제네릭 보충자료
    • 10 컬렉션 프레임워크
      • 컬렉션 프레임워크 보충자료
    • 11 람다식과 함수형 프로그래밍
      • 람다식 보충자료
    • 12 오류 대비하기
      • 오류 보충자료
    • 13 멀티태스킹
      • 멀티태스킹 보충자료
    • 교재보충
      • java.lang
  • 스프링
    • 서블릿, JSP
      • 05 Servlet(서블릿)
        • 서블릿 보충자료
        • 서블릿 추가코드
        • XML, YAML, JSON
      • 06 JSP(자바 서버 페이지)
        • JSP 보충자료
      • 07 JSTL(JSP 스탠다드 태그 라이브러리)
        • JSTL 보충자료
      • 08 Cookie(쿠키), Session(세션)
      • 09 서블릿,필터,리스너
        • 서블릿,필터,리스너 보충자료
      • 11 도서관리 프로젝트 실습
    • Spring Boot
      • 01 스프링 등장 배경, 객체지향
        • 스프링 등장 배경, 객체지향 보충자료
      • 02 IOC(제어의 역전), DI(의존성 주입)
        • IOC 보충자료
        • DI 보충자료
      • 03 스프링 구조
        • 스프링 구조 보충설명
      • 04 테스트코드 실습
      • 05 스프링 빈 설정
        • 스프링 빈 설정 보충자료
      • 06 싱글톤
        • 싱글톤 보충 자료
      • 07 스프링 빈 자동설정
        • 스프링 빈 자동설정 보충자료
      • 08 빈 생명주기
        • 빈 생명주기 보충자료
      • 09 빈 스코프
        • 빈 스코프 보충자료
      • 10 스프링 MVC
        • 스프링 MVC 보충자료
        • 데이터베이스 연동에 필요한 부분
      • 11 Validation(검증)
        • Validation(검증) 보충자료
      • 12 Bean Validation(빈검증)
        • Bean Validation(빈검증) 보충자료
      • 13 예외처리
        • 예외처리 보충자료
      • 14 타입변환
      • 15 JDBC(Java Database Connectivity)
      • 16 커넥션풀
      • 17 트랜잭션
        • 트랜잭션 보충자료
      • 18 JDBC 템플릿 활용
      • 19 MyBatis
      • 20 JPA(Java Persistence API)
      • 22 게시판 프로젝트 실습
    • Spring Security
      • 보안(Security)
      • Spring Security
      • 2. Spring Security 알아보기
        • 보안 위협 실제 사례와 방어 전략
      • 3. Spring Security 기본 동작 흐름
      • 4. Spring Security로 인증 권한 추가하기
        • Spring Security의 인증 및 인가
      • 5. Spring Security에서 세션 관리하기
        • 세션(Session)과 쿠키(Cookie) 비교, 토큰(Token)과의 관계
        • 해싱 및 해싱알고리즘
        • base64
      • 6. Spring Security 악용 보호
        • SameSite
      • 7. Spring Security로 인가 권한 추가하기
      • 8. Bcrypt(비크립트) 암호화
      • OAuth2 적용하기
  • 네트워크
    • HTTP
    • OSI 7계층
  • DB&SQL
    • 01 Database(데이터베이스)와 SQL 개요
    • 02 관계형 모델
    • 03 집합
    • 04 JOIN 연산
    • 05 MySQL
      • 세이브포인트
      • DBeaver, Mysql 오토커밋 설정 관련
    • 06 SQL 기초
      • 예시데이터 쿼리문
    • 07 SQL 실습
      • 실습 스키마
    • 08 Join 활용
      • 실습스키마
    • 09 SQL 활용
      • 실습스키마
    • 10 정규화
      • 실습 스키마
    • 데이터타입
    • 예시 프로젝트 스키마 구성
  • AWS
    • SSL 연결하기
    • 보충설명
Powered by GitBook
On this page
  • 스프링 빈 스코프
  • 1. 주요 빈 스코프
  • 2. 프로토타입과 싱글톤의 혼용 문제
  • 3. 테스트 코드
  1. 스프링
  2. Spring Boot
  3. 09 빈 스코프

빈 스코프 보충자료

스프링 빈 스코프

스프링 빈의 스코프는 빈이 존재할 수 있는 범위를 정의합니다. 애플리케이션의 요구사항에 따라 적절한 스코프를 설정하여 빈의 생명주기를 효율적으로 관리할 수 있습니다.


1. 주요 빈 스코프

1.1 싱글톤 스코프

  • 스프링 컨테이너 내에서 하나의 인스턴스만 생성됩니다.

  • 애플리케이션의 시작부터 종료까지 유지되며, 가장 넓은 범위를 가집니다.

  • 기본 스코프로, 특별히 설정하지 않으면 싱글톤 스코프로 설정됩니다.

특징

  • 메모리 효율적.

  • 모든 요청에서 동일한 객체를 사용.

  • 상태를 공유하면 문제를 발생시킬 수 있으므로 무상태 설계가 중요.


1.2 프로토타입 스코프

  • 요청 시마다 새로운 인스턴스를 생성합니다.

  • 스프링 컨테이너는 빈의 생성과 의존관계 주입까지만 관리하고, 이후에는 더 이상 관리하지 않습니다.

  • 매우 짧은 생명주기를 가집니다.

특징

  • 매 요청마다 독립된 인스턴스를 제공.

  • @PreDestroy와 같은 소멸 콜백 메서드가 호출되지 않음.

예시

@Component
@Scope("prototype")
public class PrototypeBean {
    public PrototypeBean() {
        System.out.println("PrototypeBean 생성됨");
    }
}

1.3 웹 스코프

  • 웹 환경에서 사용되는 빈의 스코프입니다.

종류

  1. Request 스코프

    • HTTP 요청이 시작될 때 생성되고, 요청이 완료되면 소멸됩니다.

  2. Session 스코프

    • HTTP 세션이 생성될 때 생성되고, 세션이 종료될 때 소멸됩니다.

  3. Application 스코프

    • 서블릿 컨텍스트와 동일한 생명주기를 가집니다.

예시

@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RequestScopedBean {
    public RequestScopedBean() {
        System.out.println("RequestScopedBean 생성됨");
    }
}

2. 프로토타입과 싱글톤의 혼용 문제

문제 상황

싱글톤 빈이 프로토타입 빈을 주입받아 사용할 경우, 싱글톤 빈의 생명주기에 따라 프로토타입 빈이 관리되지 않습니다. 이로 인해 프로토타입 빈이 의도와 달리 재사용되는 문제가 발생합니다.

예시 코드

@Component
public class SingletonBean {
    private final PrototypeBean prototypeBean;

    @Autowired
    public SingletonBean(PrototypeBean prototypeBean) {
        this.prototypeBean = prototypeBean;
    }

    public void printPrototype() {
        System.out.println(prototypeBean);
    }
}

@Component
@Scope("prototype")
public class PrototypeBean {
    public PrototypeBean() {
        System.out.println("PrototypeBean 생성됨");
    }
}
  • 위 코드에서 SingletonBean은 생성 시점에 주입받은 PrototypeBean을 계속 사용하게 됩니다.

  • 새로운 프로토타입 빈을 사용하려면 직접 요청해야 합니다.

해결 방법: ObjectProvider 또는 ApplicationContext 사용

@Component
public class SingletonBean {
    private final ObjectProvider<PrototypeBean> prototypeBeanProvider;

    @Autowired
    public SingletonBean(ObjectProvider<PrototypeBean> prototypeBeanProvider) {
        this.prototypeBeanProvider = prototypeBeanProvider;
    }

    public void printPrototype() {
        PrototypeBean prototypeBean = prototypeBeanProvider.getObject();
        System.out.println(prototypeBean);
    }
}
  • ObjectProvider를 사용하여 매번 새로운 프로토타입 빈을 요청합니다.


3. 테스트 코드

3.1 싱글톤 빈 테스트

@SpringBootTest
class SingletonScopeTest {

    @Autowired
    private SingletonBean singletonBean1;

    @Autowired
    private SingletonBean singletonBean2;

    @Test
    void testSingletonScope() {
        Assertions.assertSame(singletonBean1, singletonBean2);
    }
}

3.2 프로토타입 빈 테스트

@SpringBootTest
class PrototypeScopeTest {

    @Autowired
    private PrototypeBean prototypeBean1;

    @Autowired
    private PrototypeBean prototypeBean2;

    @Test
    void testPrototypeScope() {
        Assertions.assertNotSame(prototypeBean1, prototypeBean2);
    }
}
Previous09 빈 스코프Next10 스프링 MVC

Last updated 4 months ago