스프링에서 싱글톤이라는 용어를 흔히 사용합니다. 싱글톤 패턴이란 말그대로 하나만 사용한다고 보시면 됩니다. 추상적이라 생각하실 수 있기에 바로 싱글톤에 대해 알아보겠습니다. 그리고 관련된 프로토타입과 스코프까지 설명해보겠습니다.
싱글톤과 빈
기본적으로 스프링의 빈은 싱글톤으로 만들어집니다. 애플리케이션 컨텍스트마다 빈의 오브젝트는 한 개만 만들어진다는 의미와 같습니다. 스프링에서 이와 같이 빈을 사용하는 이유는 사용자의 요청이 있을 때마다 매번 애플리케이션 로직을 담은 오브젝트를 새로 만드는 건 비효율적이기 때문입니다.
그렇기에 하나의 빈 오브젝트에 동시에 여러 스레드가 접근하는 구조가 됩니다. 이러한 구조에서 고려해야 할 점은 동기화입니다. 멀티쓰레드 환경에서 공유 자원에 경우 해당하는 문제점입니다. 그래서 상태 값을 인스턴스 변수에 저장해 두고 사용해서는 안됩니다. 따라서 싱글톤의 필드에는 의존관계에 있는 빈에 대한 레퍼런스나 읽기전용 값만 저장해두고 다른 상태값을 선언해서 두지 않습니다. 스프링이 싱글톤 패턴을 사용하는지 테스트하기 위해 아래와 같이 코드를 작성하고 테스트를 진행해보시기 바랍니다.

결과는 성공일 것입니다. SingletonBean 클래스의 빈을 여러번 추가하고, SingletonClientBean에 자동 주입된 SingletonBean 빈을 Set에 넣어도 집합의 크기는 항상 1이 됩니다. 집합은 중복을 제거하기 때문에 같은 오브젝트라면 크기가 1이 되는 것입니다. 이렇듯 테스트를 통해 스프링이 싱글톤 패턴을 사용하고 있음을 확인해할 수 있었습니다.

프로토타입
하지만 가끔 하나의 빈 설정으로 여러개의 오브젝트를 생성해 사용해야 하는 경우가 있습니다. 이러한 빈은 프로토타입 빈이라고 합니다. 같은 테스트를 프로토타입 스코프를 사용해 진행해보도록 하겠습니다.

프로토타입 스코프를 사용하기 위해 @Scope 어노테이션의 기본값을 prototype으로 변경해주었습니다. 테스트의 결과는 실패로 나오게 됩니다. 각기 다른 오브젝트가 추가되어 집합의 크기가 1이 아니기 때문입니다. 이 테스트를 성공하기 위해서는

이렇게 변경해줘야 합니다. 그리고 이렇게 만들어진 빈은 기존처럼 컨테이너가 생명주기, 생성, 소멸, 리소스 반환 등을 관리하는 것이 아니게 됩니다. 그렇기 때문에 프로토타입 빈은 매번 새로운 오브젝트를 만들면서 DI도 함께 적용하려고 할때 많이 사용합니다.
스코프
이제 다른 종류의 스코프를 알아보도록 하겠습니다.
- 요청 스코프 :
하나의 웹 요청안에서 만들어지고 해당 요청이 끝날 때 제거된다. 요청별로 독립적인 빈이 만들어지기 때문에 빈 오브젝트 내에 상태 값을 저장해둬도 안전하다. 하나의 웹 요청을 처리하는 동안에 참조하는 요청 스코프 빈은 항상 동일한 오브젝트임이 보장된다. 동시에 웹 요청이 달라지면 별도의 요청 스코프 빈이 만들어지기 때문에 여러 사용자가 많은 요청을 보내도 안전하다. 하지만 DTO나 도메인 오브젝트로 대체할 수 있기 때문에 사용할 이유가 많지는 않다. - 세션 스코프 :
HTTP 세션과 같은 존재 범위를 갖는 빈으로 만들어주는 스코프다. HTTP 세션은 사용자별로 만들어지고 브라우저를 닫거나 세션 타임이 종료될 때까지 유지되기 때문에 로그인 정보나 사용자별 선택옵션 등을 저장해두기에 유용하다. 하지만 HTTP 세션을 직접 이용하는 건 매우 번거롭고 귀찮은 일이고, 웹 환경 정보에 접근할 수 있는 계층에서만 가능한 작업이라 서비스 계층이나 데이터 액세스 계층에서 HTTP 세션에 접근하려 한다면 문제가 된다.세션 스코프는 이런 문제없이 모든 계층에서 HTTP 세션에 저장되는 정보를 이용할 수 있다. 웹 페이지가 바뀌고 여러 요청을 거치는 동안에도 세션 스코프 빈은 계속 유지된다. - 애플리케이션 스코프 :
서블릿 컨텍스트에 저장되는 빈 오브젝트다. 서블릿 컨텍스트는 웹 애플리케이션마다 만들어진다. 웹 애플리케이션마다 스프링의 애플리케이션 컨텍스트도 만들어진다. 따라서 애플리케이션 스코프는 컨텍스트가 존재하는 동안 유지되는 싱글톤 스코프와 비슷한 존재 범위를 갖는다. 사용할 경우는 웹 애플케이션과 애플리케이션 컴텍스트의 존재 범위가 다른 경우에만 사용한다. 위 두개와는 다르게 독립적인 상태를 저장하는 데에는 적절치 않다.
이렇게 스코프와 스코프의 종류인 싱글톤, 프로토타입에 대해서 알아보았습니다. 빈과 관련된 중요한 내용으로 생각이 들어 더 학습할 필요가 있다고 생각이 드는 계기가 되었습니다!!
'Spring' 카테고리의 다른 글
@RestControllerAdivce vs @Around("within(@org.springframework.web.bind.annotation.RestController *)") (0) | 2025.03.01 |
---|---|
연관관계 (단방향과 양방향) 정리 (0) | 2024.10.17 |
IoC 컨테이너란 무엇인가 (0) | 2024.04.16 |
어노테이션이란? (0) | 2024.04.02 |
트랜잭션 어노테이션 (@Transactional, 속성, 정책, 방법) (0) | 2024.03.28 |
스프링에서 싱글톤이라는 용어를 흔히 사용합니다. 싱글톤 패턴이란 말그대로 하나만 사용한다고 보시면 됩니다. 추상적이라 생각하실 수 있기에 바로 싱글톤에 대해 알아보겠습니다. 그리고 관련된 프로토타입과 스코프까지 설명해보겠습니다.
싱글톤과 빈
기본적으로 스프링의 빈은 싱글톤으로 만들어집니다. 애플리케이션 컨텍스트마다 빈의 오브젝트는 한 개만 만들어진다는 의미와 같습니다. 스프링에서 이와 같이 빈을 사용하는 이유는 사용자의 요청이 있을 때마다 매번 애플리케이션 로직을 담은 오브젝트를 새로 만드는 건 비효율적이기 때문입니다.
그렇기에 하나의 빈 오브젝트에 동시에 여러 스레드가 접근하는 구조가 됩니다. 이러한 구조에서 고려해야 할 점은 동기화입니다. 멀티쓰레드 환경에서 공유 자원에 경우 해당하는 문제점입니다. 그래서 상태 값을 인스턴스 변수에 저장해 두고 사용해서는 안됩니다. 따라서 싱글톤의 필드에는 의존관계에 있는 빈에 대한 레퍼런스나 읽기전용 값만 저장해두고 다른 상태값을 선언해서 두지 않습니다. 스프링이 싱글톤 패턴을 사용하는지 테스트하기 위해 아래와 같이 코드를 작성하고 테스트를 진행해보시기 바랍니다.

결과는 성공일 것입니다. SingletonBean 클래스의 빈을 여러번 추가하고, SingletonClientBean에 자동 주입된 SingletonBean 빈을 Set에 넣어도 집합의 크기는 항상 1이 됩니다. 집합은 중복을 제거하기 때문에 같은 오브젝트라면 크기가 1이 되는 것입니다. 이렇듯 테스트를 통해 스프링이 싱글톤 패턴을 사용하고 있음을 확인해할 수 있었습니다.

프로토타입
하지만 가끔 하나의 빈 설정으로 여러개의 오브젝트를 생성해 사용해야 하는 경우가 있습니다. 이러한 빈은 프로토타입 빈이라고 합니다. 같은 테스트를 프로토타입 스코프를 사용해 진행해보도록 하겠습니다.

프로토타입 스코프를 사용하기 위해 @Scope 어노테이션의 기본값을 prototype으로 변경해주었습니다. 테스트의 결과는 실패로 나오게 됩니다. 각기 다른 오브젝트가 추가되어 집합의 크기가 1이 아니기 때문입니다. 이 테스트를 성공하기 위해서는

이렇게 변경해줘야 합니다. 그리고 이렇게 만들어진 빈은 기존처럼 컨테이너가 생명주기, 생성, 소멸, 리소스 반환 등을 관리하는 것이 아니게 됩니다. 그렇기 때문에 프로토타입 빈은 매번 새로운 오브젝트를 만들면서 DI도 함께 적용하려고 할때 많이 사용합니다.
스코프
이제 다른 종류의 스코프를 알아보도록 하겠습니다.
- 요청 스코프 :
하나의 웹 요청안에서 만들어지고 해당 요청이 끝날 때 제거된다. 요청별로 독립적인 빈이 만들어지기 때문에 빈 오브젝트 내에 상태 값을 저장해둬도 안전하다. 하나의 웹 요청을 처리하는 동안에 참조하는 요청 스코프 빈은 항상 동일한 오브젝트임이 보장된다. 동시에 웹 요청이 달라지면 별도의 요청 스코프 빈이 만들어지기 때문에 여러 사용자가 많은 요청을 보내도 안전하다. 하지만 DTO나 도메인 오브젝트로 대체할 수 있기 때문에 사용할 이유가 많지는 않다. - 세션 스코프 :
HTTP 세션과 같은 존재 범위를 갖는 빈으로 만들어주는 스코프다. HTTP 세션은 사용자별로 만들어지고 브라우저를 닫거나 세션 타임이 종료될 때까지 유지되기 때문에 로그인 정보나 사용자별 선택옵션 등을 저장해두기에 유용하다. 하지만 HTTP 세션을 직접 이용하는 건 매우 번거롭고 귀찮은 일이고, 웹 환경 정보에 접근할 수 있는 계층에서만 가능한 작업이라 서비스 계층이나 데이터 액세스 계층에서 HTTP 세션에 접근하려 한다면 문제가 된다.세션 스코프는 이런 문제없이 모든 계층에서 HTTP 세션에 저장되는 정보를 이용할 수 있다. 웹 페이지가 바뀌고 여러 요청을 거치는 동안에도 세션 스코프 빈은 계속 유지된다. - 애플리케이션 스코프 :
서블릿 컨텍스트에 저장되는 빈 오브젝트다. 서블릿 컨텍스트는 웹 애플리케이션마다 만들어진다. 웹 애플리케이션마다 스프링의 애플리케이션 컨텍스트도 만들어진다. 따라서 애플리케이션 스코프는 컨텍스트가 존재하는 동안 유지되는 싱글톤 스코프와 비슷한 존재 범위를 갖는다. 사용할 경우는 웹 애플케이션과 애플리케이션 컴텍스트의 존재 범위가 다른 경우에만 사용한다. 위 두개와는 다르게 독립적인 상태를 저장하는 데에는 적절치 않다.
이렇게 스코프와 스코프의 종류인 싱글톤, 프로토타입에 대해서 알아보았습니다. 빈과 관련된 중요한 내용으로 생각이 들어 더 학습할 필요가 있다고 생각이 드는 계기가 되었습니다!!
'Spring' 카테고리의 다른 글
@RestControllerAdivce vs @Around("within(@org.springframework.web.bind.annotation.RestController *)") (0) | 2025.03.01 |
---|---|
연관관계 (단방향과 양방향) 정리 (0) | 2024.10.17 |
IoC 컨테이너란 무엇인가 (0) | 2024.04.16 |
어노테이션이란? (0) | 2024.04.02 |
트랜잭션 어노테이션 (@Transactional, 속성, 정책, 방법) (0) | 2024.03.28 |