5장: Bean의 범위와 생명주기
싱글톤 bean이란?
싱글톤이란 스프링에서 가장 기본적인 빈 범위를 말한다. 애플리케이션 생애 내내 하나의 이름당 하나의 빈이 존재하며 이를 재사용한다. 싱글톤 bean은 공유되기 때문에 immutable해야 한다. mutable하면 prototype scope가 또다른 옵션.
Eager/Lazy 초기화
스프링은 컨텍스트를 초기화할 때 모든 싱글톤 빈을 생성하고 이를 Eager 초기화라고 한다. 반면 Lazy 초기화는 인스턴스를 참조할 때 생성하는 방식을 말한다. Eager 초기화는 스프링의 기본동작이고 Lazy 초기화는 @Lazy를 통해서 가능하다.
Eager 초기화는
성능면에서 우수
인스턴스가 이미 존재하므로 해당 인스턴스에 의한 에러 감지가 즉시 이뤄짐
Lazy 초기화는
쓸데없는 인스턴스의 생성을 막으므로 메모리상에서 이점
보통 lazy 초기화 방식이 필요하다면 클래스 설계에 문제가 있을 수 있다. 모듈화나 마이크로 서비스등으로 해결할 수 있는지 검토해볼것.
프로토타입 빈이란? 스프링은 객체의 타입을 관리하면서 빈을 참조할 때마다 새로운 인스턴스를 생성한다. 따라서 각 스레드가 프로토타입 빈을 요청할 때 마다 다른 인스턴스를 받게 되므로 동시성 문제가 발생하지 않는다.
@Bean이나 stereotype annotation밑에 @Scope를 이용하면 된다. @Scope(BeanDefinition.SCOPE_PROTOTYPE)
프로토타입 빈은 싱글턴 빈 만큼 자주 쓰이지 않지만, 변경 가능한 객체를 처리할 때 용이하다. 예를 들어서 게시판의 댓글을 처리하는 객체라고 하면 댓글의 속성은 일반적으로 계속 달라지므로 적합하다.
질문의 흐름 스프링 컨텍스트에 등록돼야 하나? = 프레임워크에서 제공해서 프레임워크가 관리해야 하는가? -> 싱글톤 타입이어야 하나? = 멀티스레드에서 접근할 때의 문제가 있나?
아무리 프로토타입 빈이라도 메소드 내부에서 컨텍스트로부터 꺼내 쓰지 않고 바로 싱글톤 타입의 클래스안에서 선언해서 쓴다면 싱글톤 클래스 생성과 함께 단 한번만 생성되므로 문제가 생긴다.
싱글톤
bean을 참조할 때마다 동일한 인스턴스를 얻는다.
컨텍스트가 로드될 때 인스턴스를 만들도록 스프링을 구성가능
싱글톤은 디폴트 빈이다.
변경가능한 특성을 가지지 않는게 좋다.
프로토타입
bean을 참조할 때마다 새로운 인스턴스를 얻는다.
Spring 프레임워크는 프로토타입 스코프를 가진 빈에 접근할 때마다 항상 새로운 객체 인스턴스를 생성한다.
명시적으로 프로토타입이라고 마킹해야 한다.
변경가능한 특성을 가질 수 있다.
Last updated