웹 스코프
웹 환경에서만 동작한다
프로토타입과 다르게 스프링이 해당 스코프의 종료 시점을 관리한다.
웹 스코프의 종류
- request
- session
- application
- websocket
제가 사용해본 스코프는 request로 각각의 request마다 별도의 빈 인스턴스가 생성되고, 관리된다.
클라이언트 A -> A전용 request bean
클라이언트 B -> B전용 request bean
각각의 request bean을 확인하기 위해 Logger를 생성하여 해당 객체에 유효한 uuid생성하여 출력하도록 구현
코드
MyLogger
@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);
}
}
LogDemoController
@Controller
@RequiredArgsConstructor
public class LogDemoController {
private final LogDemoService logDemoService;
private final ObjectProvider<MyLogger> myLoggerProvider;
@RequestMapping("log-demo")
@ResponseBody
public String logDemo(HttpServletRequest request) {
String requestURL = request.getRequestURL().toString();
MyLogger myLogger = myLoggerProvider.getObject();
myLogger.setRequestURL(requestURL);
myLogger.log("controller test");
logDemoService.logic("testId");
return "OK";
}
}
LogDemoService
@Service
@RequiredArgsConstructor
public class LogDemoService {
private final ObjectProvider<MyLogger> myLoggerProvider;
public void logic(String id) {
MyLogger myLogger = myLoggerProvider.getObject();
myLogger.log("service id = " + id);
}
}
매핑된 url로 접근하면 해당 리퀘스트가 컨트롤러로 들어와 해당 객체에 유효한 UUID를 가지고 콘솔을 출력할 것이다.
핵심 코드
private final ObjectProvider<MyLogger> myLoggerProvider;
Controller와 Service에서 의존관계 주입을 받을 때 Myogger myLogger로 받지 않고 Provider를 사용했다.
전 게시글에서 Provider는 의존관계 탐색을 통해 프로토타입 빈을 꺼내올 때 사용했었다.
즉, 원할 때 찾아서 사용하는 지연적 특징을 가지고 있는데 이 특징을 살려 여기서도 사용됐다.
@Component
@Scope(value = "request")
public class MyLogger {}
Provider를 사용한 이유는 위와 같이 MyLogger의 Scope 타입이 request이기 때문에 빈 인스턴스가 request가 생성된 시점부터 소멸된 시점까지이다. 따라서 Provider를 통해 리퀘스트가 들어 왔을 때 꺼내서 사용했다. 이러한 지연적 특징 없이 private final MyLogger myLogger로 의존관계 주입을 받았다면 다음과 같은 에러를 날릴 것이다.
... 'myLogger': Scope 'request' is not active for the current threa ..
'Study > Spring' 카테고리의 다른 글
slf4j 로깅 알아보기 (0) | 2023.08.20 |
---|---|
[Spring] MVC 패턴 (0) | 2023.08.05 |
[Spring] 싱글톤 스코프에서 프로토타입 스코프 사용 시 문제점과 해결 방법 (0) | 2023.08.01 |
[Spring] 빈 등록 초기화(@PostContruct), 소멸 메소드(@PreDestroy) (0) | 2023.08.01 |
스프링 자동 의존관계 주입 (0) | 2023.07.27 |