Skip to content
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단계] 히이로(문제웅) 미션 제출합니다. #464

Merged
merged 13 commits into from
Sep 24, 2023

Conversation

MoonJeWoong
Copy link

@MoonJeWoong MoonJeWoong commented Sep 18, 2023

안녕하세요 무민! 히이로입니다.

이번 step2에서는 기존 controller들과 ManualHandlerMapping 클래스를 수정하지 않고 새로운 annotation 기반 controller와 공존하도록 할 수 있을지를 포커싱해서 진행했습니다. 그 결과 Adapter 패턴을 사용해서 기존 ManualHandlerMapping과 AnnotationHandlerMApping이 함께 동작할 수 있도록 다형성을 부여했습니다. 요구사항 동작 여부를 테스트하실 수 있도록 app 패키지 내 techcourse/controller 경로에 AnnotatedLogoutController를 작성해뒀습니다. HandlerMapping 패키지 내 ManualHandlerMapping 클래스에서 logoutController를 put해주는 부분을 주석처리 후 프로젝트 정상 로그아웃 플로우를 테스트해주시면 될 것 같습니다.

구현완료한 뒤 패키지 정리를 해보려 했는데 techcourse 패키지 내 기존 ManualHandlerMapping을 의존하는 코드들 때문에 DispatcherServlet이나 HandlerMapping 패키지 내 클래스들 등... MVC 관련 코드들을 app 패키지에서 분리하기가 어려웠습니다. 해당 부분은 이후 기존 controller 로직을 제거하면서 리팩토링을 진행하고 나면 자연스럽게 MVC 패키지로 분리할 수 있지 않을까 생각하고 있습니다.

리뷰하시는데 조금이라도 도움이 될까 싶어 이번 미션에서 작성한 클래스 다이어그램을 첨부합니다.


image


따로 스프링 코드를 참고하며 만들지는 않았어서 원래 설계되었던 의도와는 다르게 구현된 부분도 있을 수 있을 것 같은데 이런 부분은 함께 말씀해주시면 좋을 것 같습니다 😃

혹시 애매하거나 궁금한 부분이 있다면 편하게 DM 주세요. 리뷰 잘 부탁드립니다!! 🙇

Copy link
Member

@parkmuhyeun parkmuhyeun left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

안녕하세요 히이로~ 잘 지내고 계시나요 😎

이번 2단계 정말 잘 구현해주신 것 같습니다.
정말.. 필요한 만큼의 깔끔한 코드만 잘 작성하셔서 코멘트 남길게 거의 없네요… 코드가 술술 읽혔던 것 같아요.

그리고 적절하게 필요한 부분에만 어댑터 적용하신 것도 너무 좋았네요👍🏻
(+남겨주신 시각화 flow도 good~)

필요하다고 생각되시는 부분에 테스트 코드만 추가적으로 작성해주면 더 좋을 것 같습니다!

import webmvc.org.springframework.web.servlet.mvc.tobe.HandlerExecution;
import webmvc.org.springframework.web.servlet.mvc.tobe.HandlerMapping;

public class HandlerMappingAdapter implements HandlerMapping {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍🏻👍🏻


public ModelAndView handle(final HttpServletRequest request, final HttpServletResponse response)
throws Exception {
return (ModelAndView) method.invoke(clazz.getDeclaredConstructor().newInstance(), request,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

요청이 handle 될 때마다 컨트롤러를 새로 인스턴스화 할꺼 같은데 처음에 AnnotationHandlerMapping 클래스의 getAnnotatedControllerClasses() 메서드에서 미리 컨트롤러들을 인스턴스화 시켜놓는 건 어떤가요!?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

처음 구현할 때는 생각치 못한 부분이었는데 확실히 매 요청마다 컨트롤러가 초기화 되는 것은 이상하죠 ㅎㅎ... 일러주신 방향대로 수정했습니다! 👍

import org.reflections.Reflections;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import web.org.springframework.web.bind.annotation.RequestMapping;
import web.org.springframework.web.bind.annotation.RequestMethod;

public class AnnotationHandlerMapping {
public class AnnotationHandlerMapping implements HandlerMapping{
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Controller를 찾고 인스턴스화 하는 역활을 하는 객체를 한번 분리해보면 어떨까요!?

Copy link
Author

@MoonJeWoong MoonJeWoong Sep 24, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

처음에는 이걸 어떤 이유로 분리해야 할까? 라고 생각이 들었는데 막상 분리해보니 annotation 기반 컨트롤러를 스캔해서 인스턴스화 하는 책임까지 부여하니까 위에서 무민이 언급해주신 요청마다 컨트롤러를 인스턴스화 해줘야 하는 문제도 함께 해결할 수 있었네요 ㅎㅎ... 👍

private final List<HandlerMapping> handlerMappings = new ArrayList<>();

public void init() {
handlerMappings.add(new HandlerMappingAdapter(new ManualHandlerMapping()));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

동시 작동 굿 👍🏻

Copy link
Author

@MoonJeWoong MoonJeWoong left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

안녕하세요 무민, 히이로입니다.

리뷰해주신 기간으로부터 너무 오래 걸렸네요... 5차 데모데이 발표 준비하느라 정신이 없었어서 이제야 리뷰사항을 반영하고 다시 요청드립니다. 😭

바로 3단계도 빠르게 완료해서 리뷰 요청 드릴 수 있도록 하겠습니다!! 🙇

Copy link
Member

@parkmuhyeun parkmuhyeun left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다 히이로!! 👍🏻👍🏻

5차 데모데이랑 같이 하시느라 많이 바쁘셨죠?

리뷰 잘 반영해주셔서 머지하겠습니다. 다음 단계때 봐요!

@parkmuhyeun parkmuhyeun merged commit da7c29f into woowacourse:moonjewoong Sep 24, 2023
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants