스코프와 프록시
이번에는 프록시 방식을 사용해보자.
@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS) // 값이 두개이상 들어갸야하므로 value 명시해줌
public class MyLogger {
여기가 핵심이다.
proxyMode = ScopedProxyMode.TARGET_CLASS 를 추가해주자.
적용 대상이 인터페이스가 아닌 클래스면 TARGET_CLASS 를 선택
적용 대상이 인터페이스면 INTERFACES 를 선택
이렇게 하면 MyLogger의 가짜 프록시 클래스를 만들어두고 HTTP request와 상관 없이 가짜 프록시 클래스를 다른 빈에 미리 주입해 둘 수 있다.
이제 나머지 코드를 Provider 사용 이전으로 돌려두자.
package hello.core.web;
import hello.core.common.MyLogger;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
@Controller
@RequiredArgsConstructor //생성자에 Autowired 들어가면서 자동주입됨
public class LogDemoContoroller {
private final LogDemoService logDemoService;
private final MyLogger myLogger;
@RequestMapping("log-demo")
@ResponseBody//화면이 없고 문자를 반환하고 싶으므로 . 보통 controller 요청이오면 뷰 템플릿 에서 렌더링 거쳐서 나감
//ResponseBody는 문자를 그대로 보낼 수 있다
public String logDemo(HttpServletRequest request) throws InterruptedException {
String requestURL = request.getRequestURL().toString();
myLogger.setRequestURL(requestURL);
myLogger.log("controller test");
logDemoService.logic("testId");
return "OK";
}
}
@Service
@RequiredArgsConstructor
public class LogDemoService {
private final MyLogger myLogger;
public void logic(String id) {
myLogger.log("service id = " + id);
}
}
실행해보면 잘 동작하는 것을 확인할 수 있다.
코드를 잘 보면 LogDemoController , LogDemoService 는 Provider 사용 전과 완전히 동일하다.
어떻게 된 것일까?
'스프링' 카테고리의 다른 글
given() 과 when()은 무슨 차이가 있을까? (0) | 2023.10.04 |
---|---|
7/9 스프링 핵심원리 - 웹스코프,스코프와 Provider (0) | 2022.07.09 |
7/9 스프링 - 빈스코프,프로토타입 스코프 (0) | 2022.07.09 |
7/6 스프링 핵심원리 - 빈 생명주기 콜백 (0) | 2022.07.09 |
7/6 스프링 핵심원리 - 자동, 수동의 올바른 실무 운영 기준 (0) | 2022.07.09 |