Spring/스프링 핵심 원리 - 기본편

[빈 스코프] 웹 스코프 request 예제 만들기

alsruds 2024. 1. 3. 23:00
🧐강의🧐
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

 

  • 웹 스코프는 웹 환경에서만 동작하기 때문에, 라이브러리를 추가해야 한다

 

💡웹 환경 구성하기

1. build.gradle 라이브러리 추가 & gradle refresh

...
dependencies {
	implementation 'jakarta.inject:jakarta.inject-api:2.0.1' // JSR-330 Provider
	...
}

...

 

2. 애플리케이션 실행 후 브라우저 접속 (localhost:8080)

hello.core.CoreApplication main 메서드 실행
접속 성공

 

참고
- 웹 라이브러리 없을 시, 스프링 부트는 AnnotationConfigApplicationContext 기반 구동
- 웹 라이브러리 추가 시, AnnotationConfigServletWebServerApplicationContext 기반 구동

 

 

💡request scope 예제 개발하기

✅ 동시에 여러 HTTP 요청이 오면, 로그 구분이 어려워 request scope 를 활용한다

☑️ request scope : 로그 남기기

UUID 사용으로 HTTP 요청 구분 & requestURL 정보 추가

 

· main/java/hello.core/common/MyLogger

@Component
@Scope(value = "request") // request scope 지정 : HTTP 요청 당 하나의 빈 생성 & 요청 종료 시 소멸
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);
    }
    
    // 초기화 메서드 : 빈이 생성되는 시점에 uuid 생성 후 저장    
    @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);
    }
}

 

· main/java/hello.core/web/LogDemoController

@Controller
@RequiredArgsConstructor
public class LobDemoController { // MyLogger 클래스 동작 확인하는 테스트용 컨트롤러

    private final LogDemoService logDemoService;
    private final MyLogger myLogger;

    @RequestMapping("log-demo")
    @ResponseBody
    public String logDemo(HttpServletRequest request) { // 요청 URL 받기
        String requestURL = request.getRequestURL().toString();
        myLogger.setRequestURL(requestURL);

        myLogger.log("controller test"); // 로그 남기기
        logDemoService.logic("testId");
        return "OK";
    }
}

 

·main/java/hello.core/web/LogDemoService

@Service
@RequiredArgsConstructor
public class LogDemoService { // 서비스 계층 로그 출력 (비즈니스 로직 존재)
// 웹 기술에 종속되지 않고 가급적 순수하게 유지해야, 유지보수 관점에서 좋다

    private final MyLogger myLogger;

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

 

😊 실제 고객 요청이 와야 생성이 가능하기 때문에, 테스트 코드로 애플리케이션 실행 시 오류가 발생한다!