스프링 프레임워크는 빈(Bean)의 생명 주기와 범위를 세밀하게 조절할 수 있는 다양한 스코프를 제공한다.
특히 웹 애플리케이션에서만 사용 가능한 웹 스코프는
사용자의 요청, 세션, 애플리케이션 수준에 따라 빈을 다르게 생성하고 관리할 수 있어 매우 유용하다.
이번 글에서는 요청 스코프, 세션 스코프, 애플리케이션 스코프에 대해 설명하고,
각각이 어떤 상황에서 유용한지, 어떤 점을 주의해야 하는지를 정리해보려 한다.
스프링의 빈 스코프
스프링 앱에서 빈은 기본적으로 싱글톤(singleton)으로 관리된다.
즉, 애플리케이션 컨텍스트에서 하나의 인스턴스만 생성하여 재사용한다.
그러나 웹 환경에서는 다양한 사용자의 요청을 처리해야 하므로 요청 단위, 세션 단위, 애플리케이션 단위로 나눠 빈의 생성과 관리가 필요하다. 이를 위해 스프링은 다음과 같은 웹 스코프를 지원한다.
- request: HTTP 요청마다 새로운 빈 생성
- session: 사용자 세션마다 하나의 빈 생성
- application: 웹 애플리케이션 전체에서 하나의 빈 공유
요청 스코프 (@Scope("request"))
요청 스코프는 HTTP 요청이 들어올 때마다 빈 인스턴스를 새로 생성한다.
요청이 끝나면 해당 빈은 폐기된다.
사용 예
- 로그인 자격 검증
- 요청 파라미터 처리
- 파일 업로드 처리 중간 상태 보관
특징
- 수명이 짧고, 매 요청마다 새로 생성되어 동시성 문제가 없다.
- 요청이 종료되면 가비지 컬렉션 대상이 되어 자동 제거된다.
- 생성 비용이 큰 로직(DB 호출, 파일 처리 등)은 생성자나 @PostConstruct에서 실행하지 않도록 주의해야 한다.
세션 스코프 (@Scope("session"))
세션 스코프는 사용자마다 하나의 빈 인스턴스를 생성하고 HTTP 세션 전체에서 이를 유지한다.
로그인한 사용자가 여러 요청을 보낼 경우 하나의 인스턴스를 계속 공유하게 된다.
사용 예
- 로그인 사용자 정보 보관
- 쇼핑몰 장바구니 저장
- 브라우저를 닫기 전까지 사용자 상태 유지
특징
- 여러 요청 사이에서도 데이터가 유지된다.
- 같은 사용자가 동시에 여러 요청을 보낼 경우, 경쟁 상태 문제가 발생할 수 있다.
- 동기화 처리 또는 구조 개선이 필요하다.
- 서버 메모리에 오래 보관되므로, 민감한 정보 저장을 피해야 한다.
애플리케이션 스코프 (@Scope("application"))
애플리케이션 스코프는 서버 전체에서 단 하나의 빈 인스턴스를 생성해 모든 사용자 요청이 이를 공유한다.
일종의 전역 변수처럼 사용된다.
사용 예
- 앱 전체 공통 설정
- 전체 요청 수 집계
- 캐싱된 설정 정보 제공
특징
- 모든 요청이 공유하므로 병목 현상이 발생할 수 있다.
- 읽기 전용(불변) 속성으로 사용하면 안전하다.
- 빈의 상태가 변하는 경우 동기화 및 쓰레드 안전성 확보가 필요하다,=.
- 데이터베이스나 외부 캐시(Redis)로 대체하는 것이 일반적이다.
로그인 예시로 이해하는 웹 스코프
역할 | 사용 | 스코프 이유 |
로그인 검증 처리 | 요청 스코프 | 사용자마다 매 요청마다 자격 정보 처리 필요 |
로그인 유지 | 세션 스코프 | 로그인된 사용자 상태를 세션 간 유지 |
전체 로그인 요청 수 계산 | 애플리케이션 스코프 | 모든 사용자 요청을 앱 전체에서 누적 집계 |
웹 스코프 사용 시 주의사항
요청 스코프
- 생성자가 무겁지 않아야 한다.
- 생성 시 외부 I/O 호출을 지양해야 한다.
세션 스코프
- 동시 요청 시 경쟁상태 발생할 수 있다.
- 너무 많은 데이터 저장은 메모리 이슈를 발생시킨다.
애플리케이션 스코프
- 모든 요청이 공유하므로 불변 상태로만 사용하는 것을 권장한다.
- 동기화 처리하지 않으면 쓰레드 문제가 발생한다.
스코프별 생명주기 요약
스코프 | 생성 시점 | 종료 시점 | 스코프 대상 |
Request | HTTP 요청 시작 시 | 요청 처리 완료 시 | 한 번의 요청 동안 |
Session | HTTP 세션 시작 시 | 세션 만료 또는 로그아웃 | 한 사용자의 로그인 기간 동안 |
Application | 앱 시작 시 | 앱 종료 시 | 모든 사용자, 모든 요청 동안 |
상태 관리의 정석?
웹 애플리케이션에서 상태를 어떻게 관리하느냐는 매우 중요하다. 따라서 추천 가이드를 알려주겠다.
- 되도록 상태를 갖지 않는(Stateless) 방식으로 개발한다.
- 사용자 상태가 필요한 경우에는 세션 스코프를 사용하되, 저장 데이터를 최소화한다.
- 공통 설정 정보 등은 불변 객체로 만들어 애플리케이션 스코프에 넣어도 안전하게 사용할 수 있다.
- 민감한 정보(비밀번호, 토큰 등)는 웹 스코프 빈에 저장하지 않고, 다른 보안 저장소(JWT, DB, Redis 등)를 활용하자.
마무리
스프링 웹 스코프는 요청의 특성에 맞게 메모리 자원을 관리하고,
상태를 분리하여 더욱 유지보수가 용이하고 안전한 웹 애플리케이션을 만드는 데 필수적인 도구이다.
상황에 맞는 적절한 스코프 설계를 통해 안정성과 확장성을 모두 잡을 수 있을 것이다.
최종적으로 요약하자면,
웹 스코프는 잘 활용하면 편리하지만, 남용하면 유지보수 악몽이 될 수 있다.
항상 최소한의 상태, 짧은 수명, 동기화 없는 설계를 목표로 해야 한다.
'스프링' 카테고리의 다른 글
스프링 REST 서비스 (0) | 2025.04.07 |
---|---|
스프링에서 데이터베이스 다루기 4 - 스프링 데이터 JPA (0) | 2025.04.06 |
스프링에서 데이터베이스 다루기 3 - 스프링 데이터로 간결한 영속성 계층 개발 (0) | 2025.04.05 |
스프링 부트와 스프링 MVC 이해 (0) | 2025.04.05 |
스프링 애스펙트 (0) | 2025.04.04 |