(Spring) 16. Spring Web Scope

업데이트:
1 분 소요

웹 스코프 (Spring)

1. 웹 스코프에 특징

  • 웹 스코프는 웹 환경에서만 동작한다.
  • 웹 스코프는 프로토타입과 다르게 스프링이 해당 스코프의 종료시점까지 관리한다.
    • 따라서 종료 메서드가 호출된다.

2. 웹 스코프의 종류

1) request

  • Http 요청 하나가 들어오고 나갈때 까지 유지되는 스코프, 각각의 HTTP 요청마다 별도의 빈 인스턴스가
    생성되고, 관리된다.

2) session

  • HTTP Session과 동일한 생명주기를 가지는 스코프

3) application

  • 서블릿 컨텍스트(‘ServletContext’)와 동일한 생명주기를 가지는 스코프

4) websocket

  • 웹 소켓과 동일한 생명주기를 가지는 스코프

2. Request Test

1) logger 찍어보기

package kr.co.hellospring.web;

import kr.co.hellospring.common.MyLogger;
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;

import javax.servlet.http.HttpServletRequest;

@Controller
@RequiredArgsConstructor
public class LogDemoController {

    private final LogDemoService logDemoService;
    private final ObjectProvider<MyLogger> myLoggerObjectProvider;

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

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

  • 로그를 출력하기 위한 'MyLogger' 클래스이다.
  • '@Scope(value="request")를 사용해서 request 스코프로 지정했다.
  • 이 빈은 HTTP 요청당 하나씩 생성되고, HTTP 요청이 끝나는 시점에 소멸된다.
  • 이 빈이 생성되는 시점에 자동으로 @PostConstruct 초기화 메서드를 사용해서 uuid를 생성해서
    저장해 둔다.
  • requestURL은 이빈이 생성되는 시점에는 알 수 없으므로, 외부에서 setter로 입력 받는다.

2) LogDemoController

package kr.co.hellospring.web;

import kr.co.hellospring.common.MyLogger;
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";
    }
}
  • 로거가 잘 작동하는지 확인하는 테스트용 컨트롤러다.
  • HttpServletRequest를 통해서 요청 URL을 받는다.
    requestURL 값 : http://localhost:8080/log-demo
  • 컨트롤러에서 controller test라는 로그를 남긴다.

3. LogDemoService

package kr.co.hellospring.web;

import kr.co.hellospring.common.MyLogger;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class LogDemoService {

    private final ObjectProvider<MyLogger> myLoggerObjectProvider;

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

4. result

  • log
[af2b18ff-a107-4196-a92b-693d6ae29e9c] request scope bean create:kr.co.hellospring.common.MyLogger@3510b558
[af2b18ff-a107-4196-a92b-693d6ae29e9c][http://localhost:8080/log-demo] controller test
[af2b18ff-a107-4196-a92b-693d6ae29e9c][http://localhost:8080/log-demo] service id = testId
[af2b18ff-a107-4196-a92b-693d6ae29e9c] request scope bean close:kr.co.hellospring.common.MyLogger@3510b558

댓글남기기