Post

Spring[스코프와 Provider]

Provider

Provider는 스프링 프레임워크에서 제공하는 인터페이스 중 하나로,
빈을 동적으로 가져오는 기능을 제공하고 있습니다.
주로 런타임 시에 의존성을 주입하는 상황에서 사용됩니다. 아래는 간단한 예제 코드 입니다.

Service

1
2
3
4
5
6
7
8
9
@Service
@RequiredArgsConstructor
public class LogDemoService {
 private final ObjectProvider<MyLogger> myLoggerProvider;
 public void logic(String id) {
 MyLogger myLogger = myLoggerProvider.getObject();
 myLogger.log("service id = " + id);
 }
}

Controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Controller
@RequiredArgsConstructor
public class LogDemoController {
 private final LogService logService;
 private final ObjectProvider<MyLogger> LoggerProvider;
 @RequestMapping("log-demo")
 @ResponseBody
 public String logDemo(HttpServletRequest request) {
    String requestURL = request.getRequestURL().toString();
    LogerScope logerscope = LoggerProvider.getObject();
    logerscope.setRequestURL(requestURL);
    logerscope.log("controller test");
    logService.logic("testId");
    return "OK";
 }
}
  • 접속은 http://localhost:8080/log-demo의 주소로 접속이 가능합니다.


@RequiredArgsConstructor

  • Lombok의 어노테이션 중 하나로, 자주 사용되는 어노테이션입니다.
  • 주로 생성자를 자동으로 생성하는데 사용됩니다.
    • final로 선언된 필드, @NonNull 어노테이션이 붙은 필드에 사용됩니다.
  • 예시:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    @RequiredArgsConstructor
    public class UserClass {
      private final String userID;
      private final int phonenumber;
        
      // @RequiredArgsConstructor 어노테이션을 사용시
      // 아래의 생성자를 작성 안해도 된다는 편의성이 존재합니다.
      // public UserClass(String userID, String phonenumber) {
      //     this.userID = userID;
      //     this.phonenumber = phonenumber;
      // }
    }
    

실행 결과

1
2
3
4
[d06b992f...] request scope bean create
[d06b992f...][http://localhost:8080/log-demo] controller test
[d06b992f...][http://localhost:8080/log-demo] service id = testId
[d06b992f...] request scope bean close
  • ObjectProvider.getObject() 를 호출하는 시점까지 request scope 빈의 생성을 지연할 수 있습니다.
  • ObjectProvider.getObject() 를 호출하는 시점에는 HTTP 요청이 진행중이므로 request scope 빈의 생성이 정상 처리됩니다.
  • ObjectProvider.getObject() 를 LogDemoController , LogDemoService 에서 각각 한번씩 따로 호출해도 같은 HTTP 요청이면 같은 스프링 빈이 반환됩니다.

다음 포스트에서는 이보다 더 개선된 Proxy에 대해서 설명 드리겠습니다.

This post is licensed under CC BY 4.0 by the author.