-
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단계] 우르(김현우) 미션 제출합니다. #476
Conversation
* feat: index.html 응답하기 구현 * feat: CSS 지원하기 구현 * feat: login.html 응답 구현 * refactor: 로그인 쿼리 스트링 구분 * feat: 로그인 후 리다이렉트 기능 구현 * refactor: 로그인 컨트롤러, view resolver 생성 * feat: register html 응답 구현 * fix: body 전송 구현 * refactor: HttpRequest 객체 생성 및 파싱 기능 분리 * feat: 유저 등록 기능 구현 * feat: 로그인 메소드 POST로 변경 * refactor: 회원가입 성공 시 redirect로 응답하도록 변경 * feat: 쿠키 생성 및 로그인 시 쿠키에 세션 저장 * feat: session을 통해 로그인 페이지 redirect하는 기능 구현 * refactor: 패키지 이동 * refactor: 불필요한 필드 삭제 * refactor: 로그 포맷 변경 * refactor: 컨트롤러 핸들러 생성 * refactor: 불필요한 enum 필드 삭제 및 메소드 분리 * refactor: 예외 처리 분기문 추가 * refactor: 파일 경로 조회 메서드 분리 * refactor: GET, POST 요청이 아닌 경우 예외 반환 * fix: 잘못된 유저 정보 입력 시 401 리다이렉트 되지 않는 문제 해결 * refactor: session을 포함한 redirect 응답값 생성 메소드 분리 * refactor: 확장자 검증 메서드 Extension으로 이동 * refactor: 메서드 순서 변경 * refactor: cookie 존재 여부 확인 분기문 getOrDefault로 변경 * refactor: FileController 정팩메 ControllerHandler에 등록 * refactor: HttpRequest에 해당하는 request line, headers, body 클래스 생성 * refactor: controller 인스턴스 저장 방식 변경 * fix: CRLF 읽는 불필요한 로직 삭제 * style: 메서드 순서 재정렬 및 공백 제거 및 네이밍 변경 * refactor: HttpResponse 클래스 생성 및 response 생성 로직 분리 * refactor: 불필요한 메서드, 필드 삭제 * fix: 실패하는 테스트 수정 * fix: 잘못된 타입 수정 * refactor: Controller 인터페이스로 변경 * refactor: Controller 인터페이스 파라미터 변경, AbstractController 생성 * feat: ThreadPool 적용 및 동시성 컬렉션 사용 * style: 불필요한 개행 제거 * refactor: 상속한 클래스에서 재정의하는 메서드 abstract로 변경 * fix: cookie가 아닌 SESSION이 존재할 때 redirect 하도록 수정 * test: Response 문자열 순서가 다른 문제 해결을 위해 테스트 수정 * refactor: HttpResponse 필드 raw 타입에서 객체로 변경 * fix: 누락된 ResponseHeaders 커밋 추가
* feat: index.html 응답하기 구현 * feat: CSS 지원하기 구현 * feat: login.html 응답 구현 * refactor: 로그인 쿼리 스트링 구분 * feat: 로그인 후 리다이렉트 기능 구현 * refactor: 로그인 컨트롤러, view resolver 생성 * feat: register html 응답 구현 * fix: body 전송 구현 * refactor: HttpRequest 객체 생성 및 파싱 기능 분리 * feat: 유저 등록 기능 구현 * feat: 로그인 메소드 POST로 변경 * refactor: 회원가입 성공 시 redirect로 응답하도록 변경 * feat: 쿠키 생성 및 로그인 시 쿠키에 세션 저장 * feat: session을 통해 로그인 페이지 redirect하는 기능 구현 * refactor: 패키지 이동 * refactor: 불필요한 필드 삭제 * refactor: 로그 포맷 변경 * refactor: 컨트롤러 핸들러 생성 * refactor: 불필요한 enum 필드 삭제 및 메소드 분리 * refactor: 예외 처리 분기문 추가 * refactor: 파일 경로 조회 메서드 분리 * refactor: GET, POST 요청이 아닌 경우 예외 반환 * fix: 잘못된 유저 정보 입력 시 401 리다이렉트 되지 않는 문제 해결 * refactor: session을 포함한 redirect 응답값 생성 메소드 분리 * refactor: 확장자 검증 메서드 Extension으로 이동 * refactor: 메서드 순서 변경 * refactor: cookie 존재 여부 확인 분기문 getOrDefault로 변경 * refactor: FileController 정팩메 ControllerHandler에 등록 * refactor: HttpRequest에 해당하는 request line, headers, body 클래스 생성 * refactor: controller 인스턴스 저장 방식 변경 * fix: CRLF 읽는 불필요한 로직 삭제 * style: 메서드 순서 재정렬 및 공백 제거 및 네이밍 변경 * refactor: HttpResponse 클래스 생성 및 response 생성 로직 분리 * refactor: 불필요한 메서드, 필드 삭제 * fix: 실패하는 테스트 수정 * fix: 잘못된 타입 수정 * refactor: Controller 인터페이스로 변경 * refactor: Controller 인터페이스 파라미터 변경, AbstractController 생성 * feat: ThreadPool 적용 및 동시성 컬렉션 사용 * style: 불필요한 개행 제거 * refactor: 상속한 클래스에서 재정의하는 메서드 abstract로 변경 * fix: cookie가 아닌 SESSION이 존재할 때 redirect 하도록 수정 * test: Response 문자열 순서가 다른 문제 해결을 위해 테스트 수정 * refactor: HttpResponse 필드 raw 타입에서 객체로 변경 * fix: 누락된 ResponseHeaders 커밋 추가
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.
안녕하세요 우르 메리입니다!
1단계에 이어 2단계도 깔끔한 구조로 잘 구현해주셨네요!!
2단계에서 추상화를 잘 해주셔서 코드를 읽고 이해하는 재미가 있었습니다.
특히 일급컬렉션 구현 방식이 생소하게 느껴져 관련 질문을 몇 가지 남겨두었습니다.
주석으로 남겨주신 TODO도 3단계에서 어떻게 구현해주실지 기대가 됩니다!!
코드에 대한 요청은 아니고 우르의 의견이 궁금한 점이 몇 가지 있어 이 부분만 답변 남겨주시면 approve 하겠습니다!
@@ -30,7 +31,7 @@ protected void service(final HttpServletRequest request, final HttpServletRespon | |||
log.debug("Method : {}, Request URI : {}", request.getMethod(), requestURI); | |||
|
|||
try { | |||
final var controller = manualHandlerMapping.getHandler(requestURI); | |||
final var controller = (Controller) manualHandlerMapping.getHandler(request); |
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.
Controller
로 타입캐스팅을 해주신 이유가 있으신지 궁금합니다!
2단계 미션이 legacy controller와 annotation controller가 공존할 수 있도록 구현하는 것인데, 이렇게 된다면 두 가지 컨트롤러가 공존하기보다 새로운 컨트롤러가 기존의 컨트롤러 사용방식에 영향을 미칠 것 같습니다. 레거시 컨트롤러의 인터페이스인 Controller로 타입캐스팅을 하면 어노테이션 컨트롤러도 레거시 컨트롤러를 구현해야 하기 때문입니다.
새로운 컨트롤러도 기존의 레거시 컨트롤러 인터페이스의 구현체로 만들도록 구현하신 이유가 있으신지 궁금합니다!
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.
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.
헉 그러네요ㅠㅠ 죄송합니다 제가 헷갈렸네요!
) | ||
); | ||
|
||
handlerMappingComposite.initialize(); |
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.
일급컬렉션을 사용해 역할 분리가 잘 이루어진 것 같습니다 👍🏻저는 일급컬렉션을 생성하지 않았는데 일급컬렉션이 가져갈 수 있는 역할이 많아보이네요!
다만 handlerMappingComposite.initialize()
을 dispatcherServlet에서 호출하신 이유가 궁금합니다!
코드를 처음 읽을 때 handlerMappingComposite.initialize()
라면 handlerMappingComposite의 생성자 역할을 할 것 같다는 생각이 들어서 해당 메서드를 확인한 뒤 이해하게 되었습니다.
해당 메서드를 호출하는 역할은 HandlerMappings의 기본 생성자 내부에서 가능할 것 같고, 생성자에 별도의 로직이 포함되는걸 지양하신다면 정팩메를 사용하는 방법도 있을 것 같습니다. 일급컬렉션이 객체들의 관리자 역할을 하는 만큼 관리의 대상이 되는 객체들을 초기화 시키는 역할 또한 일급컬렉션의 책임이라고 생각했습니다.
우르의 의견이 궁금합니다!
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.
오,, 그러네요 메리 말씀듣고 initialize
부분은 HandlerMappings
의 생성자에서 하도록 했습니다.
일급 컬렉션이 관리 대상 객체를 초기화하는게 맞다고 생각이 듭니다!
public void init() { | ||
handlerMappingComposite = new HandlerMappings( | ||
List.of( | ||
new ManualHandlerMapping() |
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.
저는 2단계 미션을 구현하면서 레거시 컨트롤러와 어노테이션 컨트롤러의 공존에 많이 집중했던 것 같습니다. 두 컨트롤러가 공존한다는 것은 또 다른 타입의 컨트롤러를 사용하는 프레임워크를 사용하더라도 코드의 변경이 최소화될 수 있을만큼의 확장성을 갖는 것에 대해 고민했습니다.
그런데 새로운 프레임워크를 사용할 때마다 List에 XXHandlerMapping
객체를 추가해야 한다면 리스트에 추가되는 객체가 많아졌을 때는 관리하기 어려워질 것 같다는 생각이 들었습니다. 저는 단순히 enum으로 관리하거나 조금 복잡하게는 리플렉션으로 handlerMapping
의 구현체들을 가져와서 초기화 하는 것을 생각했었는데, 리플렉션으로 구현체를 가져오는 방법을 찾아보다 감이 잘 오지 않아 우르가 작성하신 것처럼 직접 객체를 생성해 초기화해주는 방법을 사용했습니다.
혹시 이 부분에 대해서도 우르가 고민하신 부분이 있으신지 궁금해 코멘트 남깁니다!
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.
말씀하신대로 XXXHandlerMapping
, XXXHandlerAdapter
가 추가되면 계속해서 List에 넣어줘야하는 번거로움이 있습니다.
말씀하신대로 다른 타입의 컨트롤러를 사용하는 프레임워크 사용
할 경우, DispatcherServlet
에서는 새로운 기능이 추가되므로 그에 대한 기능이 추가되야한다고 생각합니다.
예를 들어 @BarController
라는 것이 추가된다면, 리플렉션을 사용하더라도 @BarController
라는 것을 처리에야하는 리플렉션 코드가 추가되는 것은 어쩔 수 없다고 생각합니다.
이때 가장 중요한 것은 새로운 기능이 추가됐을 때, 변경점이 최소화
되어야한다고 생각하는데요.
그래서 저는 새로운 기능이 추가된다면 XXXHandlerMapping을 만들어주고, List만 추가하면 된다고 생각하여 변경점이 최소화되지 않았을까?라는 생각에 이렇게 작성했습니다.
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 내 리스트만 변경하면 된다는 점에서 변경점이 최소화 된다는 점이 잘 지켜지고 있는 것 같아요 👍🏻
|
||
import jakarta.servlet.http.HttpServletRequest; | ||
import java.util.List; | ||
import webmvc.org.springframework.web.servlet.mvc.tobe.HandlerMapping; |
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.
패키지를 이동해주셨네요!
어떤 계기로 패키지를 이동하게 되었는지 배경이 궁금합니다!!
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.
대단한 이유가 있는게 아니라 tobe 패키지 뜻이 미션에서 마지막으로 보여야하는 패키지라고 생각이 들어서 tobe 패키지로 옮겼습니다,,
import jakarta.servlet.http.HttpServletRequest; | ||
import java.util.List; | ||
|
||
public class HandlerMappings implements HandlerMapping { |
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.
일급컬렉션이 관리하는 객체들의 인터페이스를 일급컬렉션에서도 구현하고 있는 구조가 인상적이었습니다.
일급컬렉션은 추상화한 구현체들을 한번에 관리한다는 것만 생각하고 있었는데,
일급컬렉션 자체가 관리하는 객체의 추상화 타입을 구현한 구현체가 된다는 점이 생소하게 느껴졌어요!
조금 고민해봤을 때는 일급컬렉션을 추상화하여 일급컬렉션 자체도 HandlerMapping
의 구현체들처럼 동작 가능하도록 하신 것 같다는 생각이 들었는데 제가 이해한 게 맞을까요?? 일급 컬렉션을 어떤 목적으로 만들게 되었는지 궁금합니다!
그리고 제가 이해한 게 맞다면 저도 한번 이런 방식으로 구현해보고싶네요! 👍🏻
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
에서 타입을 바꿔줘야하고, 굳이 같은 인터페이스를 구현할 필요가 없다는 생각이 듭니다.
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 isSupport(final Object handler) { | ||
throw new UnsupportedOperationException(); |
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.
해당 메서드에서 바로 예외를 던지는 이유가 뭔가요?
boolean을 반환할 것을 기대하고 호출했는데 호출하자마자 예외가 던져지는 게 조금 어색하게 느껴져서 코멘트 남깁니다!
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.
handle
메서드에서 모든 adapters를 탐색하면서 isSupport 를 실행하기 때문에 굳이 HandlerAdapters
에서는 isSupport 를 사용하지 않았습니다.
총 두 번 adapters를 도는거라 불필요한 연산이라 생각이 들었어요.
그래서 해당 메서드는 지원하지 않는다고 개발자에게 명시적으로 보여주고자 작성했습니다
final var requestDispatcher = request.getRequestDispatcher(viewName); | ||
requestDispatcher.forward(request, response); | ||
if (handleValue instanceof String) { | ||
final String viewName = (String) handleValue; |
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.
이 부분도 일급컬렉션에서 가져갈 수 있는 책임의 영역이라는 생각이 들었습니다!
다음 미션에서 리팩토링을 어떻게 진행하실지 궁금해지네요!
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.
타입에 따라 처리하는 클래스들이 존재할 것 같아요!
|
||
private ManualHandlerMapping manualHandlerMapping; | ||
private HandlerMapping handlerMappingComposite; |
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.
일급컬렉션 사용 목적 질문과 비슷한 맥락의 질문입니다.
여기에서 직접 일급컬렉션을 갖지 않고 추상화해주신 의도가 궁금합니다!
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.
인터페이스를 가지고 있는게 더 확장성 있다고 생각했습니다!!
} | ||
|
||
@Test | ||
@DisplayName("handle() : Controller Interface의 adapter를 찾아 실행할 수 있다.") |
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.
테스트코드도 짜주셨군요 👍🏻
public Object getHandler(final HttpServletRequest request) { | ||
final String requestURI = request.getRequestURI(); | ||
final String method = request.getMethod(); | ||
|
||
final HandlerKey handlerKey = new HandlerKey(requestURI, RequestMethod.find(method)); | ||
final HandlerKey handlerKey = new HandlerKey(requestURI, RequestMethod.valueOf(method)); |
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.
👍🏻👍🏻
…appings 생성자에서 수행하도록 수정
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.
안녕하세요 메리 !!
리뷰 감사히 잘 받았습니다.
질문 덕분에 제가 왜 이렇게 작성했는지 다시 한번 생각하게 된 것 같아요!
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.
안녕하세요 우르!
남겨주신 코멘트 잘 확인했습니다.
의견 남겨주셔서 새로운 관점으로 생각해볼 수 있어 좋았습니다.
이번 단계는 머지하도록 하겠습니다! 3단계도 화이팅!!
* 패키지 위치 변경 및 코드 정리 * 서블릿 학습 테스트 코드 개선 * test: Reflection API 학습 테스트 구현 * test: 서블릿 학습테스트 구현 * test: 필터 학습테스트 구현 * feat: 요청 값에 해당하는 handler 반환하는 기능 구현 * chore: 소나클라우드 관련 설정 추가 * first commit * 톰캣 구현하기 * - 라이브러리 버전 업데이트 - study 추가 * thread 실습 추가 * sonarcloud 설정 추가 * [톰캣 구현하기 - 1 단계] 메리(최승원) 미션 제출합니다. (#385) * test: 파일 테스트 통과 * test: IOStream 학습 테스트 * feat: index.html 응답하기 구현 * feat: CSS 지원하기 구현 * feat: login.html 응답 구현 * refactor: 로그인 쿼리 스트링 구분 * feat: 로그인 후 리다이렉트 기능 구현 * refactor: 로그인 컨트롤러, view resolver 생성 * feat: register html 응답 구현 * [톰캣 구현하기 - 2, 3단계] 메리(최승원) 미션 제출합니다. (#412) * feat: index.html 응답하기 구현 * feat: CSS 지원하기 구현 * feat: login.html 응답 구현 * refactor: 로그인 쿼리 스트링 구분 * feat: 로그인 후 리다이렉트 기능 구현 * refactor: 로그인 컨트롤러, view resolver 생성 * feat: register html 응답 구현 * fix: body 전송 구현 * refactor: HttpRequest 객체 생성 및 파싱 기능 분리 * feat: 유저 등록 기능 구현 * feat: 로그인 메소드 POST로 변경 * refactor: 회원가입 성공 시 redirect로 응답하도록 변경 * feat: 쿠키 생성 및 로그인 시 쿠키에 세션 저장 * feat: session을 통해 로그인 페이지 redirect하는 기능 구현 * refactor: 패키지 이동 * refactor: 불필요한 필드 삭제 * refactor: 로그 포맷 변경 * refactor: 컨트롤러 핸들러 생성 * refactor: 불필요한 enum 필드 삭제 및 메소드 분리 * refactor: 예외 처리 분기문 추가 * refactor: 파일 경로 조회 메서드 분리 * refactor: GET, POST 요청이 아닌 경우 예외 반환 * fix: 잘못된 유저 정보 입력 시 401 리다이렉트 되지 않는 문제 해결 * refactor: session을 포함한 redirect 응답값 생성 메소드 분리 * refactor: 확장자 검증 메서드 Extension으로 이동 * refactor: 메서드 순서 변경 * refactor: cookie 존재 여부 확인 분기문 getOrDefault로 변경 * refactor: FileController 정팩메 ControllerHandler에 등록 * refactor: HttpRequest에 해당하는 request line, headers, body 클래스 생성 * refactor: controller 인스턴스 저장 방식 변경 * fix: CRLF 읽는 불필요한 로직 삭제 * style: 메서드 순서 재정렬 및 공백 제거 및 네이밍 변경 * refactor: HttpResponse 클래스 생성 및 response 생성 로직 분리 * refactor: 불필요한 메서드, 필드 삭제 * fix: 실패하는 테스트 수정 * fix: 잘못된 타입 수정 * refactor: Controller 인터페이스로 변경 * [톰캣 구현하기 4단계] 메리(최승원) 미션 제출합니다. (#476) * feat: index.html 응답하기 구현 * feat: CSS 지원하기 구현 * feat: login.html 응답 구현 * refactor: 로그인 쿼리 스트링 구분 * feat: 로그인 후 리다이렉트 기능 구현 * refactor: 로그인 컨트롤러, view resolver 생성 * feat: register html 응답 구현 * fix: body 전송 구현 * refactor: HttpRequest 객체 생성 및 파싱 기능 분리 * feat: 유저 등록 기능 구현 * feat: 로그인 메소드 POST로 변경 * refactor: 회원가입 성공 시 redirect로 응답하도록 변경 * feat: 쿠키 생성 및 로그인 시 쿠키에 세션 저장 * feat: session을 통해 로그인 페이지 redirect하는 기능 구현 * refactor: 패키지 이동 * refactor: 불필요한 필드 삭제 * refactor: 로그 포맷 변경 * refactor: 컨트롤러 핸들러 생성 * refactor: 불필요한 enum 필드 삭제 및 메소드 분리 * refactor: 예외 처리 분기문 추가 * refactor: 파일 경로 조회 메서드 분리 * refactor: GET, POST 요청이 아닌 경우 예외 반환 * fix: 잘못된 유저 정보 입력 시 401 리다이렉트 되지 않는 문제 해결 * refactor: session을 포함한 redirect 응답값 생성 메소드 분리 * refactor: 확장자 검증 메서드 Extension으로 이동 * refactor: 메서드 순서 변경 * refactor: cookie 존재 여부 확인 분기문 getOrDefault로 변경 * refactor: FileController 정팩메 ControllerHandler에 등록 * refactor: HttpRequest에 해당하는 request line, headers, body 클래스 생성 * refactor: controller 인스턴스 저장 방식 변경 * fix: CRLF 읽는 불필요한 로직 삭제 * style: 메서드 순서 재정렬 및 공백 제거 및 네이밍 변경 * refactor: HttpResponse 클래스 생성 및 response 생성 로직 분리 * refactor: 불필요한 메서드, 필드 삭제 * fix: 실패하는 테스트 수정 * fix: 잘못된 타입 수정 * refactor: Controller 인터페이스로 변경 * refactor: Controller 인터페이스 파라미터 변경, AbstractController 생성 * feat: ThreadPool 적용 및 동시성 컬렉션 사용 * style: 불필요한 개행 제거 * refactor: 상속한 클래스에서 재정의하는 메서드 abstract로 변경 * fix: cookie가 아닌 SESSION이 존재할 때 redirect 하도록 수정 * test: Response 문자열 순서가 다른 문제 해결을 위해 테스트 수정 * refactor: HttpResponse 필드 raw 타입에서 객체로 변경 * fix: 누락된 ResponseHeaders 커밋 추가 * fix: 깃 충돌 해결 * @MVC 구현하기 * 라이브러리 버전 정리 및 실습 코드 추가 * 패키지 위치 변경 및 코드 정리 * 서블릿 학습 테스트 코드 개선 * refactor: 여러 basePackage를 Reflections에 저장할 수 있도록 변경 * feat: handlerMapping 인터페이스 생성 * feat: HanlderMapping 구현체 초기화 기능 추가 * style: 개행 추가 * refactor: handlerMapping 인터페이스 구현 메서드 시그니처 수정 * refactor: 분기문을 포함한 for문 stream으로 변경 * feat: 3단계에서 구현할 부분 주석 추가 및 실행 시 예외 발생하지 않도록 처리 * refactor: 이중 for문 메서드 분리 * feat: 어노테이션 컨트롤러 생성 * refactor: 스트림 내부에서 외부에 영향이 없도록 메서드 분리 * refactor: 메서드 분리 * refactor: null이 포함될 수 있는 반환값 Optional로 포장 * refactor: 반환값과 일치하는 네이밍으로 변경 * style: 주석 제거 * refactor: 컨트롤러 패키지 범위 변경 * refactor: HandlerMapping에서 Handler 존재 여부 판단 메서드 추가 * feat: HandlerMappings 일급컬렉션과 HandlerAdapter 추가 --------- Co-authored-by: kang-hyungu <hkkang@woowahan.com>
* 패키지 위치 변경 및 코드 정리 * 서블릿 학습 테스트 코드 개선 * test: Reflection API 학습 테스트 구현 * test: 서블릿 학습테스트 구현 * test: 필터 학습테스트 구현 * feat: 요청 값에 해당하는 handler 반환하는 기능 구현 * chore: 소나클라우드 관련 설정 추가 * first commit * 톰캣 구현하기 * - 라이브러리 버전 업데이트 - study 추가 * thread 실습 추가 * sonarcloud 설정 추가 * [톰캣 구현하기 - 1 단계] 메리(최승원) 미션 제출합니다. (#385) * test: 파일 테스트 통과 * test: IOStream 학습 테스트 * feat: index.html 응답하기 구현 * feat: CSS 지원하기 구현 * feat: login.html 응답 구현 * refactor: 로그인 쿼리 스트링 구분 * feat: 로그인 후 리다이렉트 기능 구현 * refactor: 로그인 컨트롤러, view resolver 생성 * feat: register html 응답 구현 * [톰캣 구현하기 - 2, 3단계] 메리(최승원) 미션 제출합니다. (#412) * feat: index.html 응답하기 구현 * feat: CSS 지원하기 구현 * feat: login.html 응답 구현 * refactor: 로그인 쿼리 스트링 구분 * feat: 로그인 후 리다이렉트 기능 구현 * refactor: 로그인 컨트롤러, view resolver 생성 * feat: register html 응답 구현 * fix: body 전송 구현 * refactor: HttpRequest 객체 생성 및 파싱 기능 분리 * feat: 유저 등록 기능 구현 * feat: 로그인 메소드 POST로 변경 * refactor: 회원가입 성공 시 redirect로 응답하도록 변경 * feat: 쿠키 생성 및 로그인 시 쿠키에 세션 저장 * feat: session을 통해 로그인 페이지 redirect하는 기능 구현 * refactor: 패키지 이동 * refactor: 불필요한 필드 삭제 * refactor: 로그 포맷 변경 * refactor: 컨트롤러 핸들러 생성 * refactor: 불필요한 enum 필드 삭제 및 메소드 분리 * refactor: 예외 처리 분기문 추가 * refactor: 파일 경로 조회 메서드 분리 * refactor: GET, POST 요청이 아닌 경우 예외 반환 * fix: 잘못된 유저 정보 입력 시 401 리다이렉트 되지 않는 문제 해결 * refactor: session을 포함한 redirect 응답값 생성 메소드 분리 * refactor: 확장자 검증 메서드 Extension으로 이동 * refactor: 메서드 순서 변경 * refactor: cookie 존재 여부 확인 분기문 getOrDefault로 변경 * refactor: FileController 정팩메 ControllerHandler에 등록 * refactor: HttpRequest에 해당하는 request line, headers, body 클래스 생성 * refactor: controller 인스턴스 저장 방식 변경 * fix: CRLF 읽는 불필요한 로직 삭제 * style: 메서드 순서 재정렬 및 공백 제거 및 네이밍 변경 * refactor: HttpResponse 클래스 생성 및 response 생성 로직 분리 * refactor: 불필요한 메서드, 필드 삭제 * fix: 실패하는 테스트 수정 * fix: 잘못된 타입 수정 * refactor: Controller 인터페이스로 변경 * [톰캣 구현하기 4단계] 메리(최승원) 미션 제출합니다. (#476) * feat: index.html 응답하기 구현 * feat: CSS 지원하기 구현 * feat: login.html 응답 구현 * refactor: 로그인 쿼리 스트링 구분 * feat: 로그인 후 리다이렉트 기능 구현 * refactor: 로그인 컨트롤러, view resolver 생성 * feat: register html 응답 구현 * fix: body 전송 구현 * refactor: HttpRequest 객체 생성 및 파싱 기능 분리 * feat: 유저 등록 기능 구현 * feat: 로그인 메소드 POST로 변경 * refactor: 회원가입 성공 시 redirect로 응답하도록 변경 * feat: 쿠키 생성 및 로그인 시 쿠키에 세션 저장 * feat: session을 통해 로그인 페이지 redirect하는 기능 구현 * refactor: 패키지 이동 * refactor: 불필요한 필드 삭제 * refactor: 로그 포맷 변경 * refactor: 컨트롤러 핸들러 생성 * refactor: 불필요한 enum 필드 삭제 및 메소드 분리 * refactor: 예외 처리 분기문 추가 * refactor: 파일 경로 조회 메서드 분리 * refactor: GET, POST 요청이 아닌 경우 예외 반환 * fix: 잘못된 유저 정보 입력 시 401 리다이렉트 되지 않는 문제 해결 * refactor: session을 포함한 redirect 응답값 생성 메소드 분리 * refactor: 확장자 검증 메서드 Extension으로 이동 * refactor: 메서드 순서 변경 * refactor: cookie 존재 여부 확인 분기문 getOrDefault로 변경 * refactor: FileController 정팩메 ControllerHandler에 등록 * refactor: HttpRequest에 해당하는 request line, headers, body 클래스 생성 * refactor: controller 인스턴스 저장 방식 변경 * fix: CRLF 읽는 불필요한 로직 삭제 * style: 메서드 순서 재정렬 및 공백 제거 및 네이밍 변경 * refactor: HttpResponse 클래스 생성 및 response 생성 로직 분리 * refactor: 불필요한 메서드, 필드 삭제 * fix: 실패하는 테스트 수정 * fix: 잘못된 타입 수정 * refactor: Controller 인터페이스로 변경 * refactor: Controller 인터페이스 파라미터 변경, AbstractController 생성 * feat: ThreadPool 적용 및 동시성 컬렉션 사용 * style: 불필요한 개행 제거 * refactor: 상속한 클래스에서 재정의하는 메서드 abstract로 변경 * fix: cookie가 아닌 SESSION이 존재할 때 redirect 하도록 수정 * test: Response 문자열 순서가 다른 문제 해결을 위해 테스트 수정 * refactor: HttpResponse 필드 raw 타입에서 객체로 변경 * fix: 누락된 ResponseHeaders 커밋 추가 * fix: 깃 충돌 해결 * @MVC 구현하기 * 라이브러리 버전 정리 및 실습 코드 추가 * 패키지 위치 변경 및 코드 정리 * 서블릿 학습 테스트 코드 개선 * refactor: 여러 basePackage를 Reflections에 저장할 수 있도록 변경 * feat: handlerMapping 인터페이스 생성 * feat: HanlderMapping 구현체 초기화 기능 추가 * style: 개행 추가 * refactor: handlerMapping 인터페이스 구현 메서드 시그니처 수정 * refactor: 분기문을 포함한 for문 stream으로 변경 * feat: 3단계에서 구현할 부분 주석 추가 및 실행 시 예외 발생하지 않도록 처리 * refactor: 이중 for문 메서드 분리 * feat: 어노테이션 컨트롤러 생성 * refactor: 스트림 내부에서 외부에 영향이 없도록 메서드 분리 * refactor: 메서드 분리 * refactor: null이 포함될 수 있는 반환값 Optional로 포장 * refactor: 반환값과 일치하는 네이밍으로 변경 * style: 주석 제거 * refactor: 컨트롤러 패키지 범위 변경 * refactor: HandlerMapping에서 Handler 존재 여부 판단 메서드 추가 * feat: HandlerMappings 일급컬렉션과 HandlerAdapter 추가 * refactor: HashMap -> Map으로 받도록 수정 * feat: dispatcherSerlvet에서 담당하는 view 관련 처리 view 클래스로 이동 * feat: jsonView render 메서드 구현 * fix: 회원가입을 위한 레포지토리 저장 로직 추가 * refactor: 레거시 loginController 어노테이션 컨트롤러로 변경 * refactor: 레거시 loginViewController 어노테이션 컨트롤러로 변경 * refactor: 레거시 LogoutController 어노테이션 컨트롤러로 변경 * refactor: 레거시 RegisterController 어노테이션 컨트롤러로 변경 * refactor: 레거시 RegisterViewController 어노테이션 컨트롤러로 변경 * refactor: 레거시 ForwardController 어노테이션 컨트롤러로 변경 * refactor: 레거시 코드 삭제 * fix: LogoutController 메소드 변경 * refactor: DispatcherServlet app -> mvc 패키지로 이동 * refactor: 코드 변경으로 인해 실패하는 테스트 수정 * fix: ForwardController 컨트롤러로 등록되지 않는 오류로 인해 패키지 이동 * refactor: 뷰 렌더링 로직 ModelAndView 객체로 이동 --------- Co-authored-by: kang-hyungu <hkkang@woowahan.com>
안녕하세요 메리 !!
2단계 리뷰도 잘 부탁드립니다 !!
이번 단계는 Adapter와 Mapping을 하는 객체들을 추상화하여 사용해보았습니다.
현재에는 adapter에서 path를 반환하는 String, ModelAndView를 분기로 처리하였는데
3단계에서 진행해보도록 할게요 !