코드 그라데이션

스코프와 프록시 본문

Spring/핵심 원리 구현

스코프와 프록시

완벽한 장면 2024. 2. 18. 23:30

스코프와 프록시

이번에는 프록시 방식을 사용해보자.

 

[핵심 로직]

@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyLogger {
}

# proxyMode = ScopedProxyMode.TARGET_CLASS 가 핵심!

  • 적용 대상이 인터페이스가 아닌 클래스면 TARGET_CLASS 를 선택
  • 적용 대상이 인터페이스면 INTERFACES 를 선택

 

이렇게 하면 MyLogger의 가짜 프록시 클래스를 만들어두고 
HTTP request와 상관 없이 가짜 프록시 클래스를 다른 빈에 미리 주입해 둘 수 있다.

 

그래서 전체 MyLogger

@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS) // 여기를 추가
public class MyLogger {
    private String uuid; // UUID를 저장하는 변수
    private String requestURL; // HTTP 요청의 URL을 저장하는 변수

    // 외부에서 HTTP 요청의 URL을 설정하는 메서드
    public void setRequestURL(String requestURL) {
        this.requestURL = requestURL;
    }

    // 로그 메시지를 출력하는 메서드
    public void log(String message) {
        System.out.println("[" + uuid + "]" + "[" + requestURL + "] " +
                message);
    }

    // 빈 초기화 시 UUID를 생성하고 초기화 메시지를 출력하는 메서드
    @PostConstruct
    public void init() {
        uuid = UUID.randomUUID().toString(); // UUID 생성
        System.out.println("[" + uuid + "] request scope bean create:" + this);
    }

    // 빈 소멸 시 소멸 메시지를 출력하는 메서드
    @PreDestroy
    public void close() {
        System.out.println("[" + uuid + "] request scope bean close:" + this);
    }
}

이제 나머지 코드를 Provider 사용 이전으로 돌린다.

LogDemoController

@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";
    }
}

 

LogDemoService

@Service
@RequiredArgsConstructor
public class LogDemoService {

    private final MyLogger myLogger; // 여기

    public void logic(String id) {
        myLogger.log("service id = " + id); // 여기
    }
}

 

실행(3번)

 

문제 없이 실행이 된다!

 

이거 넣고 콘솔 다시 찍어보면

Provider 주입할 때하고 똑같이 뒤에 특이한 게 붙는다.


설명

 

 

 

 

728x90
Comments