request 하면 나머지 비슷비슷함.
web환경을 동작시키기 위해선 web환경 관련 라이브러리 필요.
implementation 'org.springframework.boot:spring-boot-starter-web'
하면 이제 알아서 자동으로 CoreApplication main 실행시켜 보면 tomcat하면서 실행 됨.
웹 라이브러리 추가 시, 기존의 AnnotationConfigApplicationContext에서 추가적으로 웹과 관련된 설정과 환경이 필요하므로 AnnotationConfigServletWebServerApplicationContext를 기반으로 애플리케이션 구동
request는 일단 [UUID][requestURL] {message} 이 포멧으로 출력되도록 만들 계획
UUID로 HTTP 요청 구분
@Controller
@RequiredArgsConstructor
public class LogDemoController {
private final LogDemoService logDemoService;
private final MyLogger myLogger;
@RequestMapping("log-demo")
@ResponseBody
public String logDemo(HttpServletRequest request){
String requstURL = request.getRequestURI();
myLogger.setRequestURL(requstURL);
myLogger.log("controller test");
logDemoService.logic("testId");
return "OK";
}
}
컨트롤러. 컨트롤러가 url 받으면 거기에 대한 거 처리해주는 거 인듯.
localhost:8080/log-demo
@Component
@Scope(value = "request")
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(){
uuid = UUID.randomUUID().toString();
System.out.println("[" +uuid + "] request scope bean create: " + this);
}
@PreDestroy
public void close(){
System.out.println("[" +uuid + "] request scope bean close: " + this);
}
}
request bean으로 처리하는, 그냥 간단하게 웹에서 요청이 오면 init에서 새 UUID 생성하고 requestURL 어떤 URL에서 요청이 왔는지만.. setRequestURL은 bean이 생성되는 그 시점에서는 알 수 없으므로 외부에서 setter로 받음.
잘 모르겠는데 아무래도 웹요청이 오면 Controller에서 어떤 요청인지 찾아주고 -> request
컨트롤러에서 인자로 HttpServletRequest request 받는 부분이 있으니까 여기서 어떤 리퀘스트에 대한 거 받아주는거고, 저 request scope는 우리 스프링이 제공해주는 거인거고, 스프링 계열의 라이브러리로 추가 했으니까, 그러니까 request 요청과 request scope의 관계는 웹에서 request 요청이 들어오면 스프링에서 그 request의 스코프랑 같게 만들어서 그 request에 대한 처리를 용이하게끔, 해준 빈임.
우선은 그러면 위에 코드에서, 당연하게도 오류가 남. 왜냐하면 MyLogger는 request Bean으로 설정해놨는데, 컨트롤러는 컨테이너 시작 시점에서 생성되는거고, 그 때 request Bean인 MyLogger를 자동으로 의존관계주입 받게끔 되어 있는데, 그 시점은 request 요청이 들어오는 시점이 당연히도 아니므로 에러가 남.
이 시점을 실제 request 요청이 오는 단계로 미루게끔 해야 함.
참고로 requestURL을 컨트롤러에서 MyLogger에 저장하는 것 보다, 스프링 인터셉터라고 해서 어떤 request 나 이런 걸 인터셉트 받아서 공통으로 처리하는 그런 게 있는 모양이다.
@Service
@RequiredArgsConstructor
public class LogDemoService {
private final MyLogger myLogger;
public void logic(String id){
myLogger.log("service id = " + id);
}
}
여튼 request 스코프를 이용하기 때문에 용이한 점이 굉장히 많음.
참고로 웹과 관련된 부분은 컨트롤러 까지만 허용 해야 함.. 지금인 저렇게 서비스 계층까지 넘어왔음..
'스프링 > 1. 스프링 핵심 원리' 카테고리의 다른 글
52강. 프록시 (0) | 2023.07.25 |
---|---|
51강. request scope Provider 이용 (0) | 2023.07.25 |
49강. 웹 스코프 (0) | 2023.07.24 |
48강. Provider (0) | 2023.07.24 |
47강. 프로토타입빈을 싱글톤 빈과 사용할 때 문제 (0) | 2023.07.24 |