🧐강의🧐
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)
참고
- 웹 라이브러리 없을 시, 스프링 부트는 AnnotationConfigApplicationContext 기반 구동
- 웹 라이브러리 추가 시, AnnotationConfigServletWebServerApplicationContext 기반 구동
💡request scope 예제 개발하기
✅ 동시에 여러 HTTP 요청이 오면, 로그 구분이 어려워 request scope 를 활용한다
☑️ request scope : 로그 남기기
· 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);
}
}
😊 실제 고객 요청이 와야 생성이 가능하기 때문에, 테스트 코드로 애플리케이션 실행 시 오류가 발생한다!
'Spring > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글
[빈 스코프] 웹 스코프에 ObjectProvider 사용 시 발생하는 문제, CGLIB 가짜 프록시로 해결하기 (0) | 2024.01.08 |
---|---|
[빈 스코프] 싱글톤 & 프로토타입 빈 함께 사용하기 : Provider (0) | 2024.01.04 |
[빈 스코프] 싱글톤 스코프 빈 & 프로토타입 스코프 빈 조회하기 (0) | 2024.01.02 |
[빈 스코프] 스코프 종류(싱글톤, 프로토타입, 웹) & 지정 방법 (0) | 2024.01.01 |
[빈 생명주기 콜백] 스프링 빈 생명주기 콜백 지원하는 방법 3가지 - 인터페이스, 설정 정보, 애노테이션 (0) | 2023.12.29 |