녕의 학습 기록

[Spring 기본] 싱글톤 컨테이너 (2) 본문

Dev/Spring

[Spring 기본] 싱글톤 컨테이너 (2)

kjyyjk 2022. 11. 9. 23:50

 학습 내용 

 

싱글톤 방식의 주의점과 @Configuration - CGLIB


* 싱글톤 주의

 

스프링 컨테이너 같은 싱글톤 컨테이너를 이용하든 뭘 하든 싱글토 방식은 무상태로 설계해야한다

 

클라이언트에(가) 의존적인 필드, 값을 변경할 수 있는 필드 x

가급적 자바에서 공유되지 않는지역변수 파라미터등을 사용

 

무슨 말이냐? 이해하기 위해서 아래 Test를 해봄

 

Service 클래스
StatefulService를 Bean 등록하는 TestConfig를 설정정보로함

웹 애플리케이션 수많은 요청이 동시에 들어오고, 스프링 컨테이너를 통해 싱글톤 유지되는 것을 저번 학습에서 배웠다

 

그렇기 때문에 여기서 statefulService1 과 statefulService2는 같은 객체 인스턴스를 참조한다.

 

A사용자가 10000원을 주문하고 getPrice()를 통해 주문 금액을 반환 받으려고 하는데

 

그 사이에 B사용자가 20000원 주문을 한 상황

 

단순하게 보면 A사용자의 주문 금액인 10000원이 반환되어야 정상 같음

 

테스트 통과

assertThat에서 알 수 있듯이 statefulService1의 price 반환 값이 10000원이 아닌 20000원.

 

앞서 말했듯이 1 2는 같은 인스턴스를 가지기 때문에, B가 주문한 순간 price 필드값이 변경 된 것이다

 

실무에서는 아주 큰 문제가 발생할 수도 있는 그런 상황

ex) 내 아이디로 로그인했는데 다른 사람의 이름이 나오는 등등..

 

그렇기 때문에 공유 필드는 가능한 조심해야한다!!

 

price필드를 사용하지 않고 파라미터로 넘어온 지역 변수 price를 반환 -> 공유 x
실행결과 : 정상적으로 A의 금액 10000원 확인

* @Configuration

 

스프링 컨테이너는 자동으로 싱글톤을 지원해준다고 했다.

 

여태 사용해왔던 AppConfig

만약 getBean으로 memberService / memberRepository / orderService 를 조회하면

 

코드에 따라 memberRepository()가 총 3번 호출 될 거 같다 (싱글톤도 깨지나?)

 

하지만 실제로 실행해보면 orderService나 memberService나

같은 memberRepository 인스턴스를 공유하는 것을 확인할 수 있었다.

 

그리고 실제로 (로그에 call문장 남겨 확인) 한번만 호출되는 것을 확인할 수 있었다.

 

@Configuration을 적용한 AppConfig에 답이 있음

 

Annotation~에 파라미터로 넘긴 값도 스프링 빈으로 등록된다
AppConfig 스프링 빈 조회 결과

그냥 class hello.core.AppConfig가 아닌,

 

뒤에 주저리 주저리 CGLIB이 붙는다

 

그 이유는

 

스프링이 바이트코드 조작 라이브러리를 통해 AppConfig를 상속받은 다른 클래스를 만들고 이를 스프링 빈으로 등록

(CGLIB)

 

이것이 싱글톤을 보장해줌

CGLIB 내부에서는

 

@Bean이 붙어있는 메서드 중 이미 스프링 빈 존재하면 빈 반환

존재하지 않으면 스프링 빈 등록 및 반환

 

 

 

만약 @Configuration을 지우면( = CGLIB기술 사용 x )

 

- @Bean을 이용해 스프링 빈 등록은 가능

 

- memberRepository가 3번 호출됨

 

- 각각 다른 인스턴스를 가진다 => 싱글톤 깨짐

 

그렇기 때문에 웬만하면(무조건) 설정 정보에는 @Configuration을 붙이자

 


 다음 학습 내용 

 

컴포넌트 스캔

 

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com