웹 스코프

박찬우·2023년 12월 20일

스프링

목록 보기
25/88

웹 스코프

  • 웹 환경에서만 동작한다
  • 프로토타입과 다르게 스프링이 해당 스코프의 종료시점까지 관리한다. 따라서 종료 메서드가 호출된다.
  • 종류
    • request: HTTP 요청 하나가 들어오고 나갈 때 까지 유지되는 스코프, 각각의 HTTP 요청마다 별도의 빈 인스턴스가 생성되고, 관리된다.
    • session: HTTP Session과 동일한 생명주기를 가지는 스코프
    • application: 서블릿 컨텍스트( ServletContext )와 동일한 생명주기를 가지는 스코프
    • websocket: 웹 소켓과 동일한 생명주기를 가지는 스코프

request

  • HTTP request 요청 당 각각 request 스코프가 할당된다
  • 웹 환경 추가
//web 라이브러리 추가 
implementation 'org.springframework.boot:spring-boot-starter-web'
  • 포트 중복 오류 시
    • application.properties에 server.port=9090 추가
  • Test
    MyLogger
package hello.core.common;

import jakarta.annotation.PostConstruct;
import jakarta.annotation.PreDestroy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

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("[" + uuid + "] request scope bean close:" + this);
    }
}

Controller

package hello.core.web;

import hello.core.common.MyLogger;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequiredArgsConstructor
public class LogDemoController {
    private final LogDemoService logDemoService;
    // private final myLogger; 
    // 의존 관계 주입을 하게 되면 스프링 컨테이너 실행 과정에 HTTP 요청이 없기 떄문에 찾을 수 없어서 오류가 발생
    // request Scope는 HTTP 요청부터 종료까지만 살아 있기 때문임
    // 따라서 ObjectProvider을 통해 DL을 해야함
    private final ObjectProvider<MyLogger> myLoggerObjectProvider;

    @RequestMapping("log-demo")
    @ResponseBody
    public String logDemo(HttpServletRequest request) {
        String requestURL = request.getRequestURL().toString();

        // 찾아서 가져옴
        MyLogger myLogger = myLoggerObjectProvider.getObject();
        myLogger.setRequestURL(requestURL);

        myLogger.log("controller test");
        logDemoService.logic("testId");
        return "OK";
    }
}

Service

package hello.core.web;

import hello.core.common.MyLogger;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class LogDemoService {

    // private final myLogger;
    // 의존 관계 주입을 하게 되면 스프링 컨테이너 실행 과정에 HTTP 요청이 없기 떄문에 찾을 수 없어서 오류가 발생
    // request Scope는 HTTP 요청부터 종료까지만 살아 있기 때문임
    // 따라서 ObjectProvider을 통해 DL을 해야함
    private final ObjectProvider<MyLogger> myLoggerObjectProvider;

    public void logic(String id) {
        // 찾아서 가져옴
        MyLogger myLogger = myLoggerObjectProvider.getObject();
        myLogger.log("service id = " + id);
    }
}

profile
진짜 개발자가 되어보자

0개의 댓글