-
Notifications
You must be signed in to change notification settings - Fork 90
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
[카프카] 3단계 - HTTP 웹 서버 구현 미션 제출합니다. #211
Open
include42
wants to merge
48
commits into
woowacourse:include42
Choose a base branch
from
include42:level3
base: include42
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
- Request에 대한 Util 정적 메서드를 저장하는 RequestUtils 클래스 구현 - RequestUtils 클래스에 대한 테스트 클래스 구현
- 요구사항 1에 맞춰 구현 - RequestHeader의 내용을 RequestUtils를 통해 분석하여, 적절한 파일을 반환함 - js, css 파일에 관련된 에러 이슈가 있어, 일단 html은 template로, 나머지는 static으로 경로를 잡도록 지정함
- RequestUtils에 전달되는 requestHeader의 값을 String으로 변경 - RequestUtils에 잘못된 파일 경로가 GET으로 요청될 시, InvalidFilePathException 발생 - 커스텀 예외 클래스인 InvalidFilePathException 구현 - RequestUtilsTest에 예외 테스트 추가
- 요구사항 5에 해당하는 css 로딩 이슈 해결. RequestHeader의 Accept 값을 response시 전달하도록 구현함 - RequestUtils에 transferRequestHeaderToMap 메서드 추가. 아직 RequestHeader 클래스가 없어서, 그 대신 HashMap을 사용한다. RequestHeader의 메서드, 경로, 버전, 그리고 각각의 파라미터들을 매핑하여 반환한다.
- HttpRequest 클래스를 구현함. 여기에는 Http Request의 메서드 타입, 경로, 버전 정보 및 기타 인자 정보가 저장됨 - HttpRequest에 잘못된 값이 전달된 채로 생성되면, InvalidHttpRequestException 가 발생하도록 구현 - HttpRequest의 생성과 예외처리에 대한 테스트 코드 구현 - RequestUtils의 Map 생성 로직을 HttpRequest 클래스로 대체함. 추후 경로 계산 로직 역시 점진적으로 대체할 예정
- HttpRequestTest의 테스트 코드 리팩토링 - HttpRequest의 getContentType에 대한 테스트 코드 추가
- README.md에 진행내역 체크리스트 작성
- HttpRequest에 포함되는 요청 타겟을 RequestPath로 분리하였음 - RequestPath는 타겟(파일명이나 요청명)과 파라미터(존재하지 않을 경우 빈 맵으로 저장)를 가짐
- RequestPath를 이용해 parameters를 mapping함 - User 클래스에 맵을 입력받아 생성하는 로직을 구현함 - RequestHandler에 로직 구현. user/create가 요청될 경우, 기존 로직 대신 user를 생성해 DB에 넣는 로직 수행함 - 2단계 요구사항 해결
- RequestPath의 생성, 예외, pathParams에 대한 테스트 구현 - RequestUtils는 RequestPath와 HttpRequest로 대체되어 삭제 - RequestPath의 parameters라는 필드변수를 pathParameters로 이름 변경하여 의미를 명확히 함
…하도록 리팩토링 - 추상 클래스 ParameterMapper를 만들어, Parameter HashMap, Getter, validator 등을 담도록 구현하였음. 또한 Parameter를 쪼개는 메인 로직을 옮겨, 추후 RequestBody 구현 시 재활용하도록 함 - RequestPath가 ParameterMapper를 상속하도록 구조 변경
- RequestBody 구현. ParameterMapper의 로직을 그대로 쓰고, 별도의 validator만 사용함 - ParameterMapper에 대한 테스트 코드 구현. ParameterMapper가 추상 클래스이므로 테스트 클래스 내에 inner class를 만들어 테스트에 활용하였음. 다양한 예외 경우에 대해 테스트 수행함
- 회원가입을 수행하는 form.html의 form method를 POST로 변경하였음 - HttpRequest에 RequestBody를 넣어, POST로 온 요청이 있을 경우 body에 있는 값을 받도록 함 - 만약 body가 빈 request가 올 경우, RequestBody는 빈 생성자를 호출함. 이는 오류로 인해 빈 값을 호출하는 것과 분리됨
- 기존 RequestBody에 관련된 오류 수정, IOUtils를 사용하여 기존 로직 대체 - 회원가입 완료 시, 로그를 출력한 뒤 response의 메서드를 302로 반환, Location 값을 index로 부여
- HttpRequest에서 헤더의 값이 올바르지 않아도 수행되는 오류 발견, 테스트와 함께 수정
- URIUtils에서 파일의 경로를 구할 때, 그 파일이 static인지 template인지 구별하는 로직 필요. 이를 enum 클래스로 구현
- RequestLine 클래스를 만들어 HTTP 리퀘스트의 메서드, 경로, 버전을 담도록 구현 - 기존 HttpRequest의 로직을 RequestLine으로 대체
- lombok을 의존성 추가하여, Builder 패턴을 User에 추가 - RequestHandler에서 User를 생성할 때, Builder 패턴을 통해 생성 로직을 직관적으로 변경
# Conflicts: # src/main/java/model/User.java # src/main/java/web/request/HttpRequest.java # src/main/java/webserver/RequestHandler.java # src/test/java/web/HttpRequestTest.java
- 기존 RequestHeader 클래스를 HttpHeader로 이름 변경, 로직 리팩토링. 출력 기능도 추가 - HttpRequest에서 HttpHeader 사용하도록 구현 - Test 코드 추가
- 기존 코드에서는 Handler가 InputStream을 BufferedReader로 변경해 전달했는데, 이 로직을 HttpRequest로 옮김 - 변경사항에 맞춰 RequestHandler 및 Test 수정
- HttpResponse 클래스 구현. Response에 대한 로직을 분리한 클래스. - HttpResponse에 들어가는 ResponseBody, ResponseLine 클래스 구현. 각각 반환되는 Body의 값, 상단의 상태 라인을 나타냄. - HttpResponse가 HttpHeader를 활용하도록 함. 헤더 로직은 HttpRequest와 공유한다. - Status 구현. 상태 코드와 상태명을 저장하는 Enum Class. - RequestHandler의 Response 로직 HttpResponse로 교체
- Controller interface 구현. service 로직만 구현하였음 - AbstractController 구현. GET,POST 로직이 기본 구현되어 있으며, 이 로직을 호출할 경우 예외를 발생시키고 400 BAD REQUEST를 response에 담아 보낸다. 이 클래스를 상속한 다른 클래스가 구현한 로직이 아니라면 예외를 발생시키는 것.
- User 생성(회원가입)에 대한 POST 요청 처리를 담당하는 CreateUserController 구현 - 리소스 파일에 대한 GET 요청 처리를 담당하는 ResourceController 구현
- ControllerMapper 구현, 이제 링크에 따라 매핑된 Controller를 반환해준다. 만약 주소가 매핑되는 Controller가 존재하지 않을 경우, 리소스 요청으로 간주하고 ResourceController와 연결한다. - IndexController를 구현하여, '/'로 요청이 올 경우 index.html로 연결한다. - RequestHandler 로직을 리팩토링하여, 분리된 클래스들이 각자의 역할을 수행하도록 하였다.
- HttpRequest에서 하위 클래스를 반환하는 Getter 로직을 없애고, 대신 getParametersBykey와 같은 key를 바탕으로 반환하는 getter 메서드를 만들었음. 또한 target, contentType 등 많이 요청되는 값에 대한 getter 역시 만들었음 - 테스트를 원활히 하기 위해 txt 파일을 만들고, 이를 읽어들여 테스트하도록 함. GET에 대한 예시 1개, POST에 대한 예시 2개(경로에 정보 유무 차이) 작성함 - 도메인 변경사항에 맞춰 테스트코드 역시 변경
- HttpResponse에 대한 test 작성, 각각의 상태에 대해 올바른 값을 생성/작성하는지 테스트 - ResponseBody와 ResponseLine에 미사용 메서드가 있는 것을 확인, 모두 삭제 - 일부 코드 컨벤션을 위한 여백 삽입, 주석 삭제
- Controller 인터페이스를 상속한 모든 클래스에 대한 테스트 코드를 구현함 - AbstractController의 경우, TestController라는 클래스를 만들어 상속한 뒤 허가되지 않은 doGet/doPost를 호출하는 식으로 테스트를 진행함 - 테스트를 위한 txt 파일을 추가하였음
- AbstractController에서 400 에러를 띄울 때 나타나는 경고 메시지 상수화 - HttpResponse에서 에러 코드를 저장하는데에 쓰이던 Status 클래스를, ResponseStatus로 이름 변경
- HttpResponse의 write 로직은, 하위 클래스(ResponseBody, ResponseLine, HttpHeader)의 write 메서드를 호출하는 방식으로 설계되었다. 그러나 책임이 이양되고 로직이 분산되는 탓에, 이를 다시 HttpResponse로 모았다. 대신 필요에 따라 toString을 하위 클래스에 추가하였다.
- LoginController 구현을 통해 POST로 들어오는 로그인 요청 대응 - DataBase에 비밀번호 검증 및 삭제 로직 추가 - ControllerMapper에 Login에 대한 매핑 추가 - 잘못된 ID가 입력될 경우 Custom Exception인 UserNotFoundException 발생, 비밀번호가 틀리면 IllegalAccessException 발생 - LoginController에 대한 테스트 구현
- HandleBars helper 기능을 통해 increase 연산을 선언, 이를 통해 @index에 접근한 후 값을 1 올려서 1부터 시작하는 인덱스 생성. 이를 표에 표시해 줌
- UserListController가 '/user/list' 요청 시 GET 요청을 받는다. 이후 DB에서 값을 꺼내 템플릿화하여 반환한다. - templateUtils를 통해 Handlebars를 만든다. list와 profile html 파일 역시 수정해 두었다. - templateUtils와 UserListController에 대한 테스트 코드를 작성하였다.
- 세션 구현을 위한 인터페이스 HttpSession 추가 - 세션 구현 클래스인 WebSession 추가 - Session의 서버에서의 저장을 담당하는 SessionStore 추가
- SessionStore를 활용할 수 있도록 컨트롤러에 추가 - 테스트를 통해 컨트롤러의 변경된 로직 검증
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
안녕하세요, 카프카입니다.
로그인 / 세션에 대해 간단하게 구현한 뒤
이에 대한 테스트 코드를 작성하였습니다.
내용에 대한 이해가 깊지 않아, 추가로 더 공부해 보고자 합니다
(아직도 세션을 어떻게 활용해야 할 지 감이 안오네요 😂 )
혹여나 잘못된 코드나 개선할 수 있는 코드가 있다면,
지적해 주시는 대로 바로 반영하겠습니다.
감사합니다.