Provider를 이용한 request scope 문제 해결 방법
606
작성한 질문수 33
강의 교안 <9.빈 스코프>의 28페이지를 보면 다음과 같이 설명되어있습니다.
"ObjectProvider.getObject()를 호출하는 시점까지 request scope 빈의 생성을 지연할 수 있다"
이 때, 빈의 생성을 지연한다는 말이 실제로 getObject() 함수를 호출해야만 request scope의 MyLogger 빈이 만들어 진다는 건가요?
아니면 http 요청이 들어오는 순간 이미 MyLogger 빈은 다른 로직에 의해 생성되어 존재함이 보장되고, getObject() 함수는 무조건 MyLogger 빈을 갖고 올 수 있기 때문에 이를 논리적으로 "빈의 생성을 지연한다"라고 표현하신 건가요?
전자가 맞는지 후자가 맞는지 궁금합니다.
*추가. 비슷한 질문이 있어서 해당 질문을 참고하여 내용을 추가하였습니다.
https://www.inflearn.com/questions/702458
위의 질문에서 "http요청이 들어왔을 때 request bean이 생성되는게 아니라, 생성할수있는 상태가 되는것이고, 이 상태일때 ObjectProvider.getObject()를 하게되면 request bean을 생성한후 반환하는것이다" 라는 답변이 있었습니다. 그래도 이해가 안되서, getObject() 함수가 호출되기 전에 getBean()으로 등록된 MyLogger 빈을 갖고와봤습니다.
@Controller
@RequiredArgsConstructor
public class LogDemoController {
private final ObjectProvider<MyLogger> myLoggerProvider;
// 추가된 라인
private final ApplicationContext ac;
@RequestMapping("log-demo")
@ResponseBody
public String logDemo(HttpServletRequest request) {
// 추가된 라인
MyLogger testMyLogger = ac.getBean(MyLogger.class);
// 추가된 라인
System.out.println(testMyLogger);
String requestURL = request.getRequestURL().toString();
MyLogger myLogger = myLoggerProvider.getObject();
myLogger.setRequestURL(requestURL);
myLogger.log("controller test");
LogDemoService.logic("testID");
return "OK";
}
}
ApplicationContext를 의존주입 받아서,
getObject()가 호출되기 전에 getBean()으로 MyLogger 타입의 스프링 빈을 조회하고 출력하였는데,
testMyLogger와 myLogger에 동일한 객체가 들어있었습니다.
위의 답변과는 상충되는 결과인데, 제가 추가한 코드에 문제가 있는 건가요?
답변 1
1
안녕하세요. 세승님
MyLogger는 @Scope(value = "request") 입니다.
따라서 하나의 HTTP 요청이 들어오고 나갈 때 까지는 그 안에서 같은 빈이 보장됩니다.
최초 조회하는 시점에 생성되고, 이후 조회하면 처음 조회한 빈을 사용하게 됩니다.
그런데 다른 HTTP 요청이 들어오면 그 안에서는 다른 빈을 만들어서 사용하겠지요?
감사합니다^^
0
안녕하세요 영한님. 항상 친절한 답변 감사드립니다.
답해주신 부분에 대해서는 이해가 잘 되었습니다.
추가적으로 하나만 더 질문드리고 싶은게 생겨서 질문 드립니다.
제가 위에 적어놓은 코드에서는 ac.getBean() 에 의해서 request scope의 빈이 최초 조회되기 때문에 그때 빈이 생성되는 것이고, 코드의 아래 부분의 myLoggerProvider.getObject()에서는 위의 getBean()에 의해 생성되었던 빈과 동일한 빈이 반환되는 건가요?
섹션3. 11 회원객체 다이어그램
0
18
1
OCP, DIP과 @Qualifier 어노테이션에 대해서 질문합니다.
0
20
1
코드 자료
0
54
2
구현체가 동적으로 정해질 때, 팩토리 기법을 사용하나요?
0
61
2
MemberService의 인터페이스를 왜 사용하는지 궁금합니다.
0
83
1
롬복 @Setter를 써야 하는 상황이 있는건가요?
0
94
1
빈 등록 메서드의 파라미터가 빈이 아니어도 되나요?
0
81
1
테스트 속도가 나중에 영향이 있을까요?
0
79
1
gradle 설정 안떠서 질문 남깁니다!
0
125
2
build.gradle로 프로젝트를 여는 이유
0
89
1
provider 사용하는 이유
0
93
1
다음 강의 뭘 들어야 할까요
0
130
2
프로토타입 빈, 직접 destroy 호출 안 할 경우
0
66
1
beanB
0
82
2
퀴즈다시풀기
0
69
1
Gradle로 바꿔도 오류가 똑같이 발생하네요 ㅠㅠ
0
92
2
"중복 등록과 충돌" 강의에서 강사님과 다른 에러가 발생합니다.
0
67
3
run 실행했는데 결과창이 이렇게 뜨네요 왜 그런건가요>
0
106
2
도메인의 정의?
0
59
1
ApplicationContext 질문입니다.
0
63
1
@Scope의 proxyMode를 사용할때 단위 테스트 방법
0
93
2
ai api 선정하기 관련 질문
0
119
2
생성자 자동주입 관련해서
0
67
1
생성자 직접 호출 vs 팩토리 메서드 패턴
0
97
2





