@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyLogger {
private String uuid;
private String requestURL;
public void setRequestURL(String requestURL) {
this.requestURL = requestURL;
}
public void log(String message) {
System.out.println("[" + uuid + "]" + "[" + requestURL + "] " + message);
}
@PostConstruct
public void init() {
System.out.println("[" + uuid + "] request scope bean create:" + this);
}
@PreDestroy
public void close() {
System.out.println("[" + uuid + "] request scope bean close:" + this);
}
}
@Controller
public class LogDemoController {
private final LogDemoService logDemoService;
private final MyLogger myLogger;
@Autowired
public LogDemoController(LogDemoService logDemoService, MyLogger myLogger) {
this.logDemoService = logDemoService;
this.myLogger = myLogger;
}
@RequestMapping("log-demo")
@ResponseBody
public String logDemo(HttpServletRequest request) {
String requestURL = request.getRequestURL().toString();
myLogger.setRequestURL(requestURL);
myLogger.log("controller test");
logDemoService.logic("testId");
return "OK";
}
}
@Service
public class LogDemoService {
private final MyLogger myLogger;
@Autowired
public LogDemoService(MyLogger myLogger) {
this.myLogger = myLogger;
}
public void logic(String id) {
myLogger.log("service id = " + id);
}
}
MyLogger 클래스에 @Scope 옵션중 proxyMode = ScopedProxyMode.TARGET_CLASS 라는것이 있다 이것을 하지 않으면 오류가 난다.
그 이유는 MyLogger는 Scope에 request 가 오면 호출이 된다고 된다. 하지만 프로그램이 실행조차 안됐는데 클라이언트들로부터 request가 올 수가 없지 않는가? 그러므로 에러가 난다. 하지만 이를 방지하기 위해
Proxy모드를 만들었다.
말 그대로 아무것도 없는(진짜 아무것도 없다. 정말로) 빈껍데기를 올려놓고 프로그램을 실행 시킨 후 정말 사용자에게 request가 올 때에는 빈껍데기가 진짜MyLogger를 불러온다
'Spring 공부' 카테고리의 다른 글
스프링 기본편 정리 5 (0) | 2023.11.01 |
---|---|
스프링 기본편 정리 4 (0) | 2023.11.01 |
스프링 기본편 정리3 (0) | 2023.11.01 |
스프링 기본편 정리2 (0) | 2023.11.01 |
스프링 기본편 정리1 (0) | 2023.11.01 |