♪ 학습 내용
싱글톤 방식의 주의점과 @Configuration - CGLIB
* 싱글톤 주의
스프링 컨테이너 같은 싱글톤 컨테이너를 이용하든 뭘 하든 싱글토 방식은 무상태로 설계해야한다
클라이언트에(가) 의존적인 필드, 값을 변경할 수 있는 필드 x
가급적 자바에서 공유되지 않는지역변수 파라미터등을 사용
무슨 말이냐? 이해하기 위해서 아래 Test를 해봄
웹 애플리케이션 수많은 요청이 동시에 들어오고, 스프링 컨테이너를 통해 싱글톤 유지되는 것을 저번 학습에서 배웠다
그렇기 때문에 여기서 statefulService1 과 statefulService2는 같은 객체 인스턴스를 참조한다.
A사용자가 10000원을 주문하고 getPrice()를 통해 주문 금액을 반환 받으려고 하는데
그 사이에 B사용자가 20000원 주문을 한 상황
단순하게 보면 A사용자의 주문 금액인 10000원이 반환되어야 정상 같음
assertThat에서 알 수 있듯이 statefulService1의 price 반환 값이 10000원이 아닌 20000원.
앞서 말했듯이 1 2는 같은 인스턴스를 가지기 때문에, B가 주문한 순간 price 필드값이 변경 된 것이다
실무에서는 아주 큰 문제가 발생할 수도 있는 그런 상황
ex) 내 아이디로 로그인했는데 다른 사람의 이름이 나오는 등등..
그렇기 때문에 공유 필드는 가능한 조심해야한다!!
* @Configuration
스프링 컨테이너는 자동으로 싱글톤을 지원해준다고 했다.
만약 getBean으로 memberService / memberRepository / orderService 를 조회하면
코드에 따라 memberRepository()가 총 3번 호출 될 거 같다 (싱글톤도 깨지나?)
하지만 실제로 실행해보면 orderService나 memberService나
같은 memberRepository 인스턴스를 공유하는 것을 확인할 수 있었다.
그리고 실제로 (로그에 call문장 남겨 확인) 한번만 호출되는 것을 확인할 수 있었다.
@Configuration을 적용한 AppConfig에 답이 있음
그냥 class hello.core.AppConfig가 아닌,
뒤에 주저리 주저리 CGLIB이 붙는다
그 이유는
스프링이 바이트코드 조작 라이브러리를 통해 AppConfig를 상속받은 다른 클래스를 만들고 이를 스프링 빈으로 등록
(CGLIB)
CGLIB 내부에서는
@Bean이 붙어있는 메서드 중 이미 스프링 빈 존재하면 빈 반환
존재하지 않으면 스프링 빈 등록 및 반환
만약 @Configuration을 지우면( = CGLIB기술 사용 x )
- @Bean을 이용해 스프링 빈 등록은 가능
- memberRepository가 3번 호출됨
- 각각 다른 인스턴스를 가진다 => 싱글톤 깨짐
그렇기 때문에 웬만하면(무조건) 설정 정보에는 @Configuration을 붙이자
♪ 다음 학습 내용
컴포넌트 스캔
'Dev > Spring' 카테고리의 다른 글
[Spring 기본] 컴포넌트 스캔 (2) (0) | 2022.11.12 |
---|---|
[Spring 기본] 컴포넌트 스캔 (1) (0) | 2022.11.10 |
[Spring 기본] 싱글톤 컨테이너 (1) (0) | 2022.11.09 |
[Spring 기본] 스프링 컨테이너와 빈 (3) (0) | 2022.11.07 |
[Spring 기본] 스프링 컨테이너와 빈 (2) (0) | 2022.11.06 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!