Replies: 1 comment
|
일찍 시작하셨네용 !! 마지막까지 파이팅~ |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
섹션 9. 빈 스코프
3. 프로토타입 스코프 - 싱글톤 빈과 함께 사용시 문제점
프로토타입 스코프는 항상 새로운 객체 인스턴스를 생성해서 반환한다. 하지만 싱글톤 빈과 함께 사용할 때는 의도한 대로 잘 동작하지 않으므로 주의해야 한다.
실행 결과

싱글톤에서 프로토타입 빈 사용

clientBean
-
❓ 스프링은 일반적으로 싱글톤 빈을 사용하므로, 싱글톤 빈이 프로토타입 빈을 사용하게 된다. 그런데, 싱글톤은 생성 시점에만 의존관계 주입을 받기 떄문에, 프로토타입 빈이 새로 생성되지는 하지만, 싱글톤 빈과 함께 계속 유지되는 문제 발생⇒ 우리가 원하는 것은 프로토타입 빈을 주입 시점에만 새로 생성하는게 아니라, 사용할 때 마다 새로 생성해서 사용하는 것
4. 프로토타입 스코프 - 싱글톤 빈과 함께 사용시 Provider로 문제 해결
싱글톤 빈과 프로토타입 빈을 함께 사용할 때, 어떻게 하면 사용할 때 마다 항상 새로운 프로토타입 빈을 생성할 수 있을까?
=> 가장 간단한 방법 : 싱글톤 빈이 프로토 타입을 사용할 때 마다 스프링 컨테이너에 새로 요청하는 방법
PrototypeBean prototypeBean = ac.getBean(PrototypeBean.class);항상 새로운 프로토타입 빈이 생성된다ObjectFactory,ObjectProvider
지정한 빈을 컨테이너에서 대신 찾아주는 DL 서비스 제공
과거의 ObjectFactory에서 편의 기능을 추가해서 ObjectProvider를 만듦
항상 새로운 프로토타입 빈이 생성된다
ObjectProvider 의 getObject() 를 호출하면, 내부에서 스프링 컨테이너를 통해 해당 빈을 찾아서
반환한다. (DL)
스프링이 제공하는 기능이지만, 기능이 단순하여 단위테스트를 만들거나 mock 코드를 만들기 쉽다
딱 필요한 DL 기능만 제공한다
JSR-330 Provider
자바 표준, gradle에
jakarta.inject:jakarta.inject-api:2.0.1라이브러리 추가 필요특징
정리
사용할 수 있다.
5. 웹 스코프
웹 스코프 특징
웹 스코프 종류
인스턴스가 생성되고, 관리된다.
6. request 스코프 예제 만들기
웹 환경 추가
implementation 'org.springframework.boot:spring-boot-starter-web'추가하기AnnotationConfigApplicationContext을 기반으로 애플리케이션 구동AnnotationConfigServletWebServerApplicationContext를 기반으로 애플리케이션 구동request 스코프 예제 개발
동시에 여러 HTTP 요청이 오면 정확히 어떤 요청이 남긴 로그인지 구분하기 어렵다
이럴 때 사용하면 좋은것이 바로 request 스코프!
MyLogger
@Scope(value = "request")를 사용해서 request 스코프로 지정@PostConstruct메서드를 사용해서 uuid 생성,저장@PreDestroy를 사용해서 종료 메서드를 남긴다requestURL은 빈 생성시점에는 알 수 없으므로, 외부에서 settter로 입력 받는다LogDemoController
LogDemoService
실행
기대와 다르게 애플리케이션 실행 시점에 오류 발생
고객 요청이 아직 들어오지 않았다(http request) 따라서 scope request 생존 범위가 아니라 오류 발생
7. 스코프와 Provider
ObjectProvider 사용
LogDemoController
LogDemoService
실행 성공
ObjectProvider.getObject()를 호출하는 시점까지 request scope 빈의 생성을 지연ObjectProvider.getObject()를 호출하는 시점에는 HTTP 요청이 진행중이므로 request scope 빈이 정상 생성 된다ObjectProvider.getObject()를 LogDemoController , LogDemoService 에서 각각 한번씩 따로 호출해도 같은 HTTP 요청이면 같은 스프링 빈이 반환된다!8. 스코프와 프록시
프록시 방식 사용해보기
MyLogger
proxyMode = ScopedProxyMode.TARGET_CLASS추가나머지 코드는 provider 사용 이전으로 돌리기
성공

**웹 스코프와 프록시 동작 원리**
CGLIB라는 라이브러리로 내 클래스를 상속 받은 가짜 프록시 객체를 만들어서 주입
myLogger = class hello.core.common.MyLogger$$EnhancerBySpringCGLIB$$b68b726dAll reactions