스프링/1. 스프링 핵심 원리

50강. request 스코프

sdafdq 2023. 7. 25. 21:47

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