작성
·
210
·
수정됨
0
1.스프링 인터셉터 - 요청 로그 강의 2분 10초에서 3분까지 LogInterceptor가 싱글톤이기 떄문에 String uuid를 preHandle위에 작성하면 안된다고 하셨는데요.
그런데 MemberController에서도 private final MemberRepository memberRepository; 이 부분은 변수 선언 가능한데요.
2. 스프링 인터셉터 - 요청 로그 강의 14분 13초에서 위 코드가 호출한 컨트롤러 메서드의 모든 정보가 포함되어있다. 라고 나오는데요. hm이 회색으로표시(변수 사용안함) 무슨정보가 포함되어있는건가요?
@Slf4j
public class LogInterceptor implements HandlerInterceptor{
public static final String LOGIN_ID = "loginId";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
String uuid = UUID.randomUUID().toString();
request.setAttribute(LOGIN_ID,uuid);
//@RequestMapping:HanddlerMethod
//정적리소스:ResourceHttpRequestHandler
if (handler instanceof HandlerMethod){
HandlerMethod hm=(HandlerMethod)handler;
}
log.info("REQUEST[{}][{}][{}]",uuid,requestURI,handler);
return true;
}
3.bean코드를 주석처리해줬는데 addInterceptors랑 FilterRegistrationBean 랑 코드 차이가 뭔가요?
제 생각엔 필터랑 인터셉터 차이같은데 LoginCheckFilter 이부분은 주석처리 안해주셔서요.
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogInterceptor())
.order(1)
.addPathPatterns("/**")//모든 경로에 대해 LogInterceptor를 실행하도록 지정합니다. 이는 모든 요청이 인터셉터를 통과하게 만듭니다.
.excludePathPatterns("/css/**","/*.ico","/error");//.excludePathPatterns("/css/**","/*.ico","/error")은 /css/ 경로, .ico 파일 및 /error 경로를 제외하고 모든 요청에 대해 LogInterceptor가 실행되도록 설정합니다.
}
// @Bean
public FilterRegistrationBean logFilter(){//스프링부트가 was를 들고 띄움.
FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(new LogFilter());
filterRegistrationBean.setOrder(1);
filterRegistrationBean.addUrlPatterns("/*");//어떤 url패턴을 할꺼냐.
return filterRegistrationBean;
}
같은강의 12분 50초에서 선생님 코드에서는 items가 아래처럼 목록이 다 뜨는데 저는 안뜹니다 .혹시 버전 문제인가요?
전체코드:https://drive.google.com/file/d/13MrBawN2imZlq9AJdH1h9_3_kN5CAueU/view?usp=drive_link
답변 2
0
안녕하세요. zzzzz님
1. memberRepository는 한번 생성된 값이 변하지 않고 사용됩니다. 그런데 uuid는 계속 변하는 값이기 때문에 문제가 될 수 있습니다. 추가로 AI 답변을 참고해주세요.
2. 어떤 컨트롤러의 메서드를 호출해야 하는지에 대한 정보가 담겨 있습니다. 이 정보를 기반으로 컨트롤러의 메서드가 호출됩니다.
3. 필터와 인터셉터의 차이입니다. 둘중 하나를 사용하면 됩니다. 여기서는 처음에는 필터를 사용하다가 이후에 인터셉터를 사용하도록 변경한 코드입니다.
4. LogInterceptor.postHandle() 코드가 구현되어 있지 않습니다. 강의 내용을 참고해서 코드를 구현해주세요.
참고로 4번 질문의 경우에는 다음 순서로 생각해보시면 스스로 문제를 해결할 수 있을거에요.
1. 문제 인지: 인터셉터의 출력 부분이 뭔가 다른 것 같다.
2. 문제 범위 줄이기: LogInterceptor의 코드에 문제가 있을 것 같다.
3. 코드 비교: 제공해드린 소스 코드와 나의 코드를 비교해봅니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다.
zzzzz님께서 스프링 인터셉터 - 요청 로그에 관하여 질문하신 부분은, LogInterceptor의 uuid
관련 처리와 MemberController
의 MemberRepository
관련 선언 사이에서 생길 수 있는 의문에 대한 것으로 보입니다.
이와 관련하여, 첫 번째 질문 “[스프링 MVC2편 : 스프링 인터셉터 - 요청 로그 ]강의에서 2분 10초쯤에 uuid 관련해서 궁금한 점이 있습니다.“에서 다룬 내용이 zzzzz님의 의문을 해소하는 데 도움이 될 수 있을 것 같습니다. 해당 질문 링크는 다음과 같습니다:
- 스프링 MVC2편 : 스프링 인터셉터 - 요청 로그 에서 관련 질문이 논의되었습니다.
질문의 핵심은, 인터셉터에서의 uuid
생성과 같은 데이터를 클래스 변수로 선언 시, 싱글톤으로 인해 여러 요청 간 값의 충돌 문제가 발생할 수 있다는 점입니다. 반면, MemberController
에서 MemberRepository
를 private final
로 선언하는 경우, 스프링이 자동으로 싱글턴 빈을 주입하여 사용하기 때문에 문제가 되지 않습니다. 이는 스프링의 의존성 주입(Dependency Injection) 메커니즘 덕분에 싱글톤 스코프 내에서 안전하게 동작하기 때문입니다.
이 두 경우는 서로 다른 상황에서의 싱글톤 사용법을 나타냅니다. 인터셉터에 선언된 변수가 공유되어 발생하는 문제와, 스프링 빈으로 관리되는 싱글톤 객체가 안전하게 사용되는 상황 사이에는 명백한 차이점이 있습니다. 인터셉터 내 변수는 요청 간 공유될 위험이 있지만, 스프링 빈은 컨테이너에 의해 관리되며 서로 독립적인 상태를 유지합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.