- Bean 스코프2024년 12월 26일
- imaginaring
- 작성자
- 2024.12.26.:53
빈의 생명주기와 생성 방식을 정의하는 설정
- 싱글톤 (기본값)
- 싱글톤임 / 동일한 빈 이름 요청시 동일 객체 반환
- 상태를 가지지 않는 객체(서비스, DAO 등)에서 주로 사용
- 멀티스레드 환경에서 안전하게 동작 (상태 없는 설계)
- 상태 저장 안함 : 특정 요청이나 스레드와 관련된 데이터를 저장하지 않도록 설계해야함
- 인스턴스 변수를 사용하여 데이터를 저장시, 여러 스레드 동시 접근으로 데이터 불일치 혹은 충돌 발생 가능
- 필요한 데이터는 매개변수로 전달, 동기화 블록 혹은 쓰레드 로컬, 요청 스코프(@Scopre("request")) 빈을 사용해야함
- 공 유데이터 대신 지역 변수 사용 (스레드 독립적)
- 상태 저장 안함 : 특정 요청이나 스레드와 관련된 데이터를 저장하지 않도록 설계해야함
@Component public class StatelessService { public int processOrder(int quantity, int price) { // 지역 변수로 처리 int total = quantity * price; return total; } }
// 안전하지 않은 설계 @Component public class StatefulService { private int totalPrice; // 상태를 저장하는 필드 public void order(String user, int price) { this.totalPrice = price; // 상태를 변경 } public int getTotalPrice() { return totalPrice; } }
public class Test { public static void main(String[] args) { ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); StatefulService service = context.getBean(StatefulService.class); // 스레드1: 사용자 A 주문 new Thread(() -> service.order("UserA", 100)).start(); // 스레드2: 사용자 B 주문 new Thread(() -> service.order("UserB", 200)).start(); // 사용자 A의 주문 가격을 조회 (값이 예상치 못하게 변경됨) System.out.println(service.getTotalPrice()); } }
// 스레드 로컬 예시 @Component public class ThreadSafeService { private ThreadLocal<Integer> totalPrice = ThreadLocal.withInitial(() -> 0); public void setTotalPrice(int price) { totalPrice.set(price); } public int getTotalPrice() { return totalPrice.get(); } }
- Prototype (@Scope("prototype"))
- 요청할 때마다 새로운 객체를 생성
- 컨테이너는 빈을 생성한 후 더 이상 관리하지 않음
- 상태를 가진는 객체나 각 요청마다 새로운 인스턴스가 필요한 경우 사용
- 생성 후 컨테이너가 관리하지 않으므로 소멸 (@PreDestroy)가 호출되지 않음
- Request (@Scope("request"))
- HTTP 요청당 하나의 빈 인스턴스 생성 / 요청 종료시 빈도 소멸
- HTTP 요청 범위에서 동작하는 빈이 필요할 경우
- 주로 Spring MVC 환경에서 사용
- Session (@scope("session"))
- HTTP 세션당 하나의 빈 인스턴스 생성 / 세션 종료시 빈도 소멸
- 사용자 세션 범위에서 필요한 빈이 있을 때
- Global Session (@Scope("globalSession")
- 글로벌 세션당 하나의 빈 인스턴스를 생성
- 주로 포털 어플리케이션 같은 글로벌 세션 개념이 있는 환경에서 사용
- Application (@Scope("application"))
- 서블릿 컨텍스트 범위에서 하나의 빈 생성 / 서블릿 컨텍스트 종료시 빈도 소멸
- 어플리케이션 전체에서 공유해야하는 빈이 필요 할 때
사용시 주의사항
- 싱글톤(Singleton):
- 멀티스레드 환경에서 상태를 가지는 경우 동기화 문제 발생 가능.
- 상태 없는 빈(Stateless Bean)으로 설계하는 것이 권장.
- 프로토타입(Prototype):
- 생성된 객체를 컨테이너가 더 이상 관리하지 않으므로 소멸 처리 필요.
- 싱글톤 빈에서 프로토타입 빈을 의존할 경우 적절한 관리가 필요.
- ObjectProvider나 @Lookup 사용 권장.
- Request/Session/Global Session:
- Spring MVC 및 웹 애플리케이션 환경에서만 유효.
- 일반 자바 애플리케이션에서는 사용할 수 없음.
'프로그래밍 > 스프링' 카테고리의 다른 글
MyBatis vs JPA (2) 2024.12.26 스프링 MVC (0) 2024.12.26 Mock (0) 2024.12.24 AOP 관계지향 (0) 2024.12.24 @ Annotation 어노테이션 (1) 2024.12.24 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)