티스토리 뷰
Bean의 스코프 알아보기
Bean의 싱글톤 스코프
- Bean은 기본적으로 별다른 설정이 없다면 싱글톤의 스코프를 가진다
- 싱글톤이란 ? 애플리케이션 전반에 걸쳐 Bean의 인스턴스가 오직 1개 뿐이다
- 한번 직접 확인해보자!
- Single 클래스와 Proto 클래스를 만들었다
- Single은 proto를 주입받았고 AppRunner는 Single과 proto를 주입받았다
- AppRunner, Single 각각 Proto를 주입받았지만 싱글톤이기 때문에 둘은 같은 Proto를 참조하고있다!
- 실행시켜서 결과를 확인해보자!
- 위에서 알 수 있듯이 기본적으로 싱글톤이다
- 그럼 매번 인스턴스를 생성하는 프로토타입 스코프는 Bean 에 어떻게 적용할까?!
Bean의 프로토타입 스코프
- Bean을 프로토 타입으로 만들기 위해서는 @Scope 애너테이션을 사용할 수 있다!
- 이번에는 Proto 에 single을 주입해 프로토 타입과 싱글톤 타입의 차이를 비교해보자!
- Proto는 프로토타입 Single은 싱글톤 타입이다
- Proto는 매번 컨테이너에서 Bean을 가져올 때 마다 새로운 인스턴스를 반환한다!
- 결과를 통해 확인해보자
- Proto와 Single의 차이를 바로 확인할 수 있다
- 그럼 Bean을 주입하면서 두가지가 혼합될 때 문제는 없을까?!
프로토 타입 Bean -> 싱글톤 타입 Bean 참조할 때
- 만약 프로토 타입의 Bean이 매번 같은 싱글톤 타입의 Bean을 참조할 때 어떻게 될까?
- 이런 경우 우리가 의도한 대로 프로토 타입의 빈은 매번 같은 타입의 Single 빈을 사용할 수 있다!
- 그래서 의도와 알맞게 흘러가서 문제가 발생하지 않는다!
싱글톤 타입 Bean -> 프로토 타입 Bean 참조할 때
- 그럼 반대일 때는 어떻게 될까 ?
- 싱글톤 타입의 Bean으로 매번 다른 타입의 프로토 타입 Bean을 참조하고 싶다고 가정하자
- 위의 그림처럼 싱글톤 타입의 Single이 프로토타입의 Proto를 주입 받았다
- 그럼 우리가 원하는대로 매번 다른 Proto를 참조할까 ?
- 답은 아니다! 출력결과를 보자
- 우리가 원했던 결과는 매번 다른 Proto를 참조하는 것이였지만 항상 같은 Proto를 사용한다!
- 이유는 싱글톤의 Single에 처음 주입받은 Proto가 변하지 않기 때문이다!
- 그럼 이렇게 쓰고싶을때 의도한대로 하려면 어떻게 해야할까?!
scoped-proxy 사용하기!
- 방법 중 하나는 다이나믹 프록시로 Proto 타입을 감싸는 것이다!
- 말은했지만 어렵다...! 아직 원리에 대해서는 완벽하게 이해하지는 못했다.. 뒤에서 다시 Proxy_pattern를 살펴보자!
- 위와 같이 proxyMode를 ScopedProxyMode로 바꾸고 Proto Class이기 때문에 TARGET_CLASS를 주자
- 그럼 결과는?!
- 우리가 원했던 결과를 얻을 수 있다!
- 위와 같이 사용하며 아래 그림과 같이 매번 바뀔 수 있는 Proxy로 Proto를 감싸고 매번 다른 값을 전달하는 것 같다!
- 다시한번 proxy에 대해 읽어봐야지..! 마지막으로 싱글톤 객체 사용시 주의할 점에 대해 확인해보자!
싱글톤 객체 사용시 주의할 점
- 싱글톤 객체를 사용할 때 생각해야할 부분은 해당 객체의 프로퍼티를 공유한다는 점이다!
- 만약 여러개의 쓰레드가 같은 싱글톤의 특정한 값을 건드리면 원치 않는 값이 나올 수 있다!
- OS에서 동기화 문제에 해당하는 것 같다! 이럴 때는 항상 해당 값을 안전하게 사용할 수 있도록 해야한다!
오늘은 빈의 스코프에 대해 살펴봤다
싱글톤은 한번 들어본적이라도 있어서 괜찮았다.
근데 Proxy에 대해서는 처음들어봐서 어렵다..!
Proxy에 대해 공부하고 나중에 또 한번 스코프를 봐야겠다!!
다들 열공~~~
'Spring > Spring IoC' 카테고리의 다른 글
ApplicationEventPublisher에 대해 알아보자! (0) | 2020.05.19 |
---|---|
Spring Profile에 대해 알아보자! (0) | 2020.05.18 |
@ComponentScan에 대해 알아보자 (0) | 2020.05.17 |
@Autowired 를 알아보자 (0) | 2020.05.16 |
스프링 Bean 설정방법 (2) | 2020.05.15 |
댓글