Spring MVC Part 2 - Backend Web Development Application Techniques
Starting HandlerExceptionResolver
WebConfig에서 Autowired로 myHandlerExceptinoResolver를 주입받을 경우
639
3 asked
안녕하세요! resolver 등록관련해서 질문이 있습니다.
WebConfig에서 ExceptionResolver를 등록할 때 new로 MyHandlerExceptionResolver를 직접 생성하지 않고, MyHandlerExceptionResolver에 @Component 어노테이션을 사용하고 WebConfig에서 @Autowired로 주입받아서 resolver 등록한 후 /api/member/ex 로 요청을 해봤는데요, 이 경우 resolver가 2회 호출되는 것으로 확인했습니다. 아무리 생각해봐도 이유를 잘 모르겠는데 혹시 어떤 이유로 2회 호출되는 것일까요?
Answer 3
9
안녕하세요. oht1221님, 공식 서포터즈 David입니다.
우선, 답변까지 시간이 오래걸렸음에도 기다려주셔서 감사합니다.
예외가 2번 발생한 이유는 직접 작성하신 exception resolver가 2번 호출되었기 때문입니다.
2번이나 호출된 이유는 DispatcherServlet이 HandlerExceptionResolver를 가져오는 방식 때문입니다.
DispatcherServlet은 2가지 방법으로 HandlerExceptionResolver를 가져옵니다.
1. 컨테이너에 HandlerExceptionResolver 타입으로 등록된 빈
2. WebMvcConfigurer를 구현한 Configuration을 통해서 extendHandlerExceptionResolver()를 통해 등록된 객체
2가지 방법을 사용하여 HandlerExceptionResolver를 등록한다면 DispatcherServlet이 가지고 있는 HandlerExceptionResolver 목록에 중복 추가됩니다.
그리고 DispatcherServlet은 핸들러에서 예외가 발생했을 때 HandlerExceptionResolver 목록을 for문으로 돌면서 해당 예외를 처리할 수 있는 HandlerExceptionResolver를 찾습니다. 이 과정에서 중복 등록된(질문자 분께서 만드신) HandlerExceptionResolver가 중복 등록된 만큼(2번) 호출되게 됩니다. 따라서, 로그가 2번 찍히는 것입니다.
즉, @Component를 추가하여 빈으로 등록하거나 WebMvcConfigurer를 구현한 Configuration을 통해 수동으로 등록하거나 둘 중 하나만 하셔야 중복 호출을 피할 수 있습니다.
감사합니다.
0
안녕하세요 강사님, 말씀하신 드라이브 주소와 재현방법을 남겨드립니다.
구글 드라이브 링크 : https://drive.google.com/file/d/1VsDm2mnTe73oBbAKGNk8IrXAHmwNcH3a/view?usp=sharing
1. 포스트맨으로 /api/members/ex 로 GET 요청을 보내보면 재현할 수 있습니다.
2. 위 요청을 보내면 MyHandlerExceptionResolver 가 2회 호출되는 것을 로그에서 확인하실 수 있습니다.
덧붙여, 이 질문은 강의 내용을 그대로 적용한 것이 아니고 MyHandlerExceptionResolver 를 WebConfig에 주입하는 과정에서 기존에 new를 통해서 하는 방법이 아니라 Autowired + Compnent 에너테이션 을 사용한 방법으로 변경 후 나타나는 현상임을 알려드립니다.
0
안녕하세요. oht1221님
전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.
구글 드라이브 업로드 방법은 다음을 참고해주세요.
주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요
추가로 다음 내용도 코멘트 부탁드립니다.
1. 실행 방법을 알려주세요.
2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.
감사합니다.
이미지 업로드와 db 트랜잭션 묶는법
0
42
1
Could not resolve org.springframework.boot:spring-boot-starter-validation:2.4.4
0
52
2
MessageSourceTest 코드
0
47
1
인터셉터 에러 설정
0
48
1
resolveArgument()메서드 질문
0
56
1
43강 검증1 에서 실패 로직 관련 질문있습니다.
0
54
2
타임리프 3.X 버전 rendering, serializer 에러 해결 방법
2
133
3
스프링 빈에 등록이 안되는거 같은데 어떻게 하면 좋을까요?ㅠㅠ
0
89
3
pdf 오타 문의
0
57
1
ItemUpdateForm 검증 관련 질문입니다.
0
48
1
22page 링크 주소 변경
0
59
2
특정 데이터와 파일을 함께 저장 시, 테이블 구조 질문
0
53
1
섹션3번 수업에 대한 질문입니다.
0
80
2
@Autowired 보다 더 좋은 방법이 어떤 걸까요?
0
85
2
타입컨버터 가 람다랑 비슷해 보이는데 저의 생각이 맞는지?.
0
65
1
자바스크립트 인라인에서 객체 직렬화 시 오류가 납니다
0
142
3
스프링부트 - 오류페이지2 에서 500.html 에서 쓰인 객체 질문
0
63
1
톰캣 에러 페이지가 안보입니다.
0
100
2
apiEceptionController에서 센드 에러 호출하면 안되는지?
0
81
1
세션 타임아웃시 쿠키 삭제 방법이 없나요?
0
118
2
ApiExceptionController 질문드립니다.
0
63
1
셀렉박스 챕터에서 option value에 ==배송 방식 선택== 이것을 넣은 이유가 궁금함, 이렇게 구상해도 되는지?
0
65
1
MemberRepository 필드의 fianl 선언 유무
0
85
2
혹시 index.html 에서는 fragment 사용이 안되는건가요
0
58
1

