request 스코프 예제 만들기

  1. MyLogger 로그를 출력 @Scope(value = "request") 를 사용해서 request 스코프로 지정했다. 이제 이 빈은 HTTP 요청 당 하나씩 생성되고, HTTP 요청이 끝나는 시점에 소멸된다. =>request 스코프는 의존관계주입시점이 아니라 HTTP 요청이 들어와야 생성된다! 이 빈이 생성되는 시점에 자동으로 @PostConstruct 초기화 메서드를 사용해서 uuid를 생성해서 저장해둔다. 이 빈이 소멸되는 시점에 @PreDestroy 를 사용해서 종료 메시지를 남긴다. requestURL 은 이 빈이 생성되는 시점에는 알 수 없으므로, 외부에서 setter로 입력 받는다.

package hello.core.common;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.UUID;

@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();
        System.out.println("["+uuid+"] request scope bean  close: "+this);

    }
}
  1. LogDemoController 로거가 잘 작동하는지 확인하는 테스트용 컨트롤러 HttpServletRequest를 통해서 요청 URL 받는다! requestURL 값 : http://localhost:8080/log-demo 이렇게 받은 requestURL 값을 myLogger에 저장해둔다. myLogger는 HTTP 요청 당 각각 구분되므로 다른 HTTP 요청 때문에 값이 섞이는 걱정은 하지 않아도 된다. 컨트롤러에서 controller test라는 로그를 남긴다. 참고 : requestURL을 MyLogger에 저장하는 부분 => 공통 처리 가능! 스프링 인터셉 터나 서블릿 필터 같은 곳을 활용하는 것이 좋다!

package hello.core.web;
import hello.core.common.MyLogger;
import hello.core.logdemo.LogDemoService;
import lombok.RequiredArgsConstructor;
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
public class LogDemoController {
    private final LogDemoService logDemoService;
    private final 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";
    } 
}
  1. LogDemoService

package hello.core.logdemo;
    import hello.core.common.MyLogger;
    import lombok.RequiredArgsConstructor;
    import org.springframework.stereotype.Service;
    @Service
    @RequiredArgsConstructor
        
 public class LogDemoService {
      private final MyLogger myLogger;
      public void logic(String id) {
          myLogger.log("service id = " + id);
} }

Last updated