스코프 (Scope) 란?:
말그대로 범위 다. Bean에다가 스코프를 설정한다면, Bean이 영향을 끼치는 범위를 설정해준다.
스코프의 종류
- Singleton (default)
- ProtoType
- request
- session
- aplication
- websoket ...
등등 존재한다.
싱글톤은 스코프 설정을안했을때 기본적으로 제공되고 범위는
스프링 컨테이너 시작 ~ 스프링 컨테이너 종료 까지 미친다.
프로토타입 스코프는 싱글톤과 반대되는 개념이다.
->싱글톤은 객체가 단 하나 생성되는걸 보장한다면, 프로토타입은 요청이 들어올때마다 새로운 객체를 생성한다.
->프로토타입 객체의 범위(Scope)는 스프링 컨테이너 시작~ 스프링 컨테이너 의존관계주입 까지 미친다.
하지만 이런 프로토타입은 실제론 잘 쓰이지 않는다고 한다.
그다음으로 웹 스코프인 request, session , aplication, websoket은 각각
요청, 세션, 어플, 웹소켓이 호출될때 의존관계주입만 해주고 스프링컨테이너가 관리(싱글톤X) 를 안해준다.
이번 포스팅은 'Request'를 통해 예제를 한번 살펴볼것이다.
요청할때마다 새로운 객체를 생성할 Bean에다가 @Scope ("request")를 붙여준다.
그 다음, @RequestMapping으로 "log_demo"를 요청햇을경우, MyLogger를 호출하는 코드를 짠다.
여기서 생소한게있는데, ObjectProvider<>로 request빈을 감싸준게 보일것이다.
이 작업을 꼭 거쳐야한다.
이유가있는데, 스프링컨테이너가 처음 시작되고
LogDemoController 빈 생성 -> LogDemoService , MyLogger Autowired하기
-> ??? MyLogger가 없잖아
하면서 오류를 뱉는다.
MyLogger는 request스코프를 지정받아, 요청이 들어오기전까지는 생성이 안된다.
또한, 애초에 주입을 받으면 이상해진다.
요청마다 계속 새로운 MyLogger를 생성해야되는데, final변수로 수정을 막아버리면 싱글톤화 된다.
따라서 이를 해결하기위해서 Provider를 쓰는거다.
Provider는 간단하게, 의존관계를 조회하고 찾아주는 역할이다.
Provider를 사용하는 시나리오는 이렇게 진행된다.
LogDemoController 빈 생성 -> LogDemoService , Provider<MyLogger> Autowired하기
-> "log-demo" 호출 -> Provider 동작 -> MyLogger 호출
실행을 시켜보고 log-demo 를 호출하면 호출할때마다 새로운 MyLogger가 생성되며 로그가 찍히는걸 볼수있다.
------------------------------------------------------------------------------------------------------------------
이렇게 Provider를 사용하는것도 좋지만, 더 깔끔한 방법이 존재한다.
바로 Proxy다.
빠르게 코드로 먼저 보겠다.
@Scope 옆에 추가로 프록시 모드를 사용하면된다. Class면 타겟클래스를
인터페이스면 TARGET_INTERFACE를 사용하면된다.
이전 코드보다 훨씬 깔끔해졌다.
Provider로 감싼것과, Provider로 조회하는 코드가 생략된것이다.
이 코드는 이전 코드와 똑같은 기능을 한다.
이 Proxy라는 기능은 해당 클래스의 속이 빈 껍데기를 제공해준다.
즉, 일단 스프링컨테이너가 시작될때 껍데기를 넣어뒀다가, 요청(request)가 들어오면
그때 진짜 기능 다들어있는 MyLogger를 넣어두는것이다.
딱봐도 너무 좋은 기술인데, 좋다고 나 혼자 막쓰면 큰일난다.
왜냐하면 누군가 Controller 클래스를 보면, MyLogger를 까보는게 아니면
-> 어? 이거 싱글톤이구나
하는 오해가 생길수도있다. 꼭 필요한곳에만 사용하고 쓸거면, 충분한 협의가 이뤄져야 한다.
그래야 나중에 유지보수하기 어려움이없다.
'자바 > 스프링(Spring)' 카테고리의 다른 글
스프링에서 로그(log) 찍기 (0) | 2022.04.19 |
---|---|
스프링: 영속 컨텍스트 (Persistence Context) (0) | 2022.01.08 |
스프링 빈 생명주기 (0) | 2021.12.26 |
스프링 : 원하는 타입의 빈 복수 조회하기 (0) | 2021.12.22 |
스프링 빈 중복 조회 해결법 (0) | 2021.12.22 |