-
Notifications
You must be signed in to change notification settings - Fork 302
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[MVC 구현하기 2단계] 포이(김보준) 미션 제출합니다. #446
Conversation
안녕하세요 포이! |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
안녕하세요 포이!
미션 구현하느라 수고하셨습니다 👏👏
추상화를 굉장히 잘 하셨고, 구조도를 남겨주셔서 이해하기에 편했던 것 같아요.
구조적으로는 부족한 점이 느껴지지 않아 자잘한 컨벤션(final
)과 궁금한 부분을 남겨놓았습니다.
한가지 걸렸던
ModelAndView
에viewName
을 넣고 이후 렌더링때 다시 꺼내오는 구조는, 현재 3단계를 피하면서 2단계를 구현하기 위해서는 최선의 구조였다고 생각합니다. 🫠
추가로 시간 여유가 되신다면 테스트도 구현해보면 어떨까 싶어요!
이번 리뷰에서 이야기해보고 싶은 부분이 있다고 하셔서, 혹여 추가로 주고받을 의견이 있을까 싶어 request change 하겠습니다.
바쁜 기간 화이팅 하시고 좋은 하루 보내세요 😊
public DispatcherServlet(List<HandlerMapping> handlerMappings, List<HandlerAdapter> handlerAdapters) { | ||
this.handlerMappings = handlerMappings; | ||
this.handlerAdapters = handlerAdapters; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
#컨벤션
통일한다면 여기 매개변수에도 final을 붙이는건 어떨까요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
배우고 싶을 정도로 꼼꼼하시네요😎 감사합니다!!!
@RequestMapping(value = "/register", method = RequestMethod.GET) | ||
public ModelAndView show(final HttpServletRequest req, final HttpServletResponse res) { | ||
return new ModelAndView(new JspView("/register.jsp")); | ||
} | ||
|
||
@RequestMapping(value = "/register", method = RequestMethod.POST) | ||
public ModelAndView save(final HttpServletRequest req, final HttpServletResponse res) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
AnnotationHandlerMapping
에서 클래스 단위의 경로인 parentPath
까지 구현 하신걸로 알고있는데, 이를 활용해보는건 어떨까요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
엇.. 왜 제가 구현해놓고 까먹었네요ㅋㅋㅋㅋㅋㅋㅋ 바로 등록했습니다 ㅎㅎ..
@Override | ||
public boolean supports(Object handler) { | ||
return handler instanceof HandlerExecution; | ||
} | ||
|
||
@Override | ||
public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { | ||
return ((HandlerExecution) handler).handle(request, response); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
#컨벤션
여기도 매개변수에 final 을 사용해보는건 어떨까요?
SimpleControllerHandlerAdapter
도 동일합니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
앗... 프로젝트 때문에 기본 설정을 바꿔놨더니 자주 놓치게 되네요.. ㅠㅠ 감사합니다!
final var handlerMappings = HandlerMappingFactory.getHandlerMappings(); | ||
final var handlerAdapters = HandlerAdapterFactory.getHandlerAdapters(); | ||
final var dispatcherServlet = new DispatcherServlet(handlerMappings, handlerAdapters); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
DispatcherServlet
에서 init
메서드가 존재하는데, init
에서 handlerMappings
와 handlerAdapters
를 생성하지 않고 외부에서 주입해주는 이유가 궁금해요! 😄
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
스터빙을 통해 테스트를 쉽게 하려는 의도였습니다! (테스트 0개)
아무래도 스프링의 구조처럼 beanFactory처럼 bean을 프로필마다 다르게 불러올 수 있다면 테스트에도 문제가 없겠지만, 이를 구현하지 않으면 테스트가 어려워질 것 같았습니다.
그렇지만 확실히 DispatcherServlet에서만 사용하는 클래스들을 밖에서 주입하는 것도 조금 이상하게 느껴지긴 하네요! 이를 basePackage를 주입받아 초기화하는 식으로 변경하였습니다!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
안녕하세요 포이!
피드백 드린 부분 모두 잘 반영해주셨네요! 어프루브 하겠습니다. 😊
다음 단계에서 다시 뵙겠습니다 :)
이오 안녕하세요!
먼저 이전 풀리퀘스트에서 있었던 질답을 이어서 적고 가겠습니다.
이오가 답변해주신 부분이 정확하게 여쭤보고 싶었던 내용입니다! 다만 여기서 터뜨려도 사용자가 잘 확인할 수 있을까가 궁금해서 예외를 여기저기서 터뜨려봤는데 500 페이지에 어떤 예외인지도 잘 나오네요ㅋㅋㅋ... 답변 감사합니다!
이 부분은 이번 단계를 진행하며 확실히 느끼게 됐네요! 다른 형태를 가지는 handler에 대해서 처리하기 위해서는 확실히 클래스를 국한하지 않는게 좋을 것 같습니다! 👍
이번 단계에서 구성한 흐름은 다음과 같습니다.
이 과정에서 아직 RequestDispatcher 를 사용하는 기존 코드는 유지하였습니다.
정확히는 이를 어떻게 수정해야할지 감이 안와서 놔뒀습니다.. 3단계에 뷰에 대한 책임을 나누는 요구사항이 있던데 이 과정을 진행하면서 알아봐야할 것 같아요!
패키지 또한 3단계 요구사항에 분리요청이 있어 적당히 배치해놨습니다!
그래서 이번 리뷰에서는 HandlerMapping과 Adapter의 생성, 사용위치, 추상화에 대해 집중적으로 이야기해보고 싶습니다!
또 글이 매우 길어졌네요..ㅋㅋㅋ
오늘도 좋은 하루 보내세요~~🫡