-
Notifications
You must be signed in to change notification settings - Fork 309
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, 4단계] 민트(유재민) 미션 제출합니다. #462
Conversation
";" 뒤에 옵션이 붙는 것을 고려하여 이를 처리하는 역할을 담당한다.
Response Header의 순서로 인해 실패하는 테스트를 위해 조정
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.
수고하셨어요 민트🌱
전체적으로 클래스를 잘 분리해주셨지만 아쉬운 점은 각 클래스의 책임에 맞게 충분히 역할을 분배하지 못한 것 같아요.
고쳤으면 하는 부분들을 몇개 짚었는데 다 변경하실 필욘 없구 상황에 맞게 그리고 민트의 기준에 맞게 변경하시면 될 것 같아요. 그리구... LMS 요구사항을 한 번 더 읽어보는 것을 추천드립니덩😉
private HttpRequest readHttpRequest(BufferedReader bufferedReader) throws IOException { | ||
List<String> lines = readRequesteHeaders(bufferedReader); | ||
RequestLine requestLine = RequestLine.from(lines.get(0)); | ||
HttpHeaders httpHeaders = HttpHeaders.from(lines.subList(1, lines.size())); | ||
String requestBody = readRequestBody(bufferedReader, httpHeaders.contentLength()); | ||
return new HttpRequest(requestLine, httpHeaders, requestBody); | ||
} |
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.
이 메서드부터 시작해서 요청을 읽고 요청라인, 헤더, 바디를 읽는 부분은 HttpRequest가 갖고있는게 어떨까요?
Http11Processor의 책임일지 HttpRequest의 책임에 더 가까울지 생각해보면 좋을 것 같아요.
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.
리뷰를 보고 생각하니 확실히 책임이 분리되는 것도 괜찮을 거 같더라고요.
대신 BufferedReader
를 통해 직접 읽어들이는 것보다 '읽기'만의 책임을 갖는 객체가 따로 있는 게 좋을 것 같다고 생각했습니다.
HttpRequestReader
를 구현하는 방향으로 리팩토링 했으니 혹시나 별로라면 말씀해 주세요~
tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java
Outdated
Show resolved
Hide resolved
tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java
Outdated
Show resolved
Hide resolved
tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java
Outdated
Show resolved
Hide resolved
tomcat/src/main/java/org/apache/coyote/http11/Http11Processor.java
Outdated
Show resolved
Hide resolved
tomcat/src/main/java/org/apache/coyote/http11/controller/AuthController.java
Outdated
Show resolved
Hide resolved
tomcat/src/main/java/org/apache/coyote/http11/controller/AuthController.java
Outdated
Show resolved
Hide resolved
tomcat/src/main/java/org/apache/coyote/http11/controller/AuthController.java
Outdated
Show resolved
Hide resolved
tomcat/src/main/java/org/apache/coyote/http11/controller/AuthController.java
Outdated
Show resolved
Hide resolved
tomcat/src/main/java/org/apache/coyote/http11/controller/RegisterController.java
Outdated
Show resolved
Hide resolved
안녕하세요 키아라 리뷰 반영 완료했습니다. |
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.
수고하셨어요 민트ㅎㅎ🌱
오늘부터 MVC미션이라 톰캣 리뷰 반영하면서 마음이 조급했을텐데 잘 반영해주셨어요!
이번엔 상수화나 메서드 분리같은 것들 위주로 짚어드렸어요.
그치만 저희는 이제 MVC 미션에 집중해야하니 만약 반영한다면 호로록 간단히만 반영하고 새 미션 시작합시당~
bufferedOutputStream.flush(); | ||
} catch (IOException | UncheckedServletException e) { | ||
} catch (Exception e) { |
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.
왜 Exception으로 변경하셨을까용?
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.service()에서 발생할 수 있는 에러로 여러 종류가 있을 거라고 생각했습니다.
발생할 수 있는 에러를 커스텀 예외로 추상화해서 catch 했다면 좋았을 것 같지만, 당장은 모든 예외를 잡을 수 있는 Exception으로 변경해서 개발을 빠르게 하고자 했네요 ㅋㅋㅋ..
HttpRequest httpRequest = requestReader.readHttpRequest(bufferedReader); | ||
HttpResponse httpResponse = new HttpResponse(httpRequest.httpVersion()); | ||
|
||
String responseBody = readFile(requestHandler.getResponseFilePath()); | ||
Controller controller = requestMapping.getController(httpRequest); | ||
controller.service(httpRequest, httpResponse); | ||
|
||
List<String> responseHeaders = new ArrayList<>(); | ||
responseHeaders.add("HTTP/1.1 " + requestHandler.getHttpStatus() + " "); | ||
responseHeaders.add(contentTypeHeader); | ||
responseHeaders.add("Content-Length: " + responseBody.getBytes().length + " "); | ||
for (Entry<String, String> headerEntry : requestHandler.getHeaders().entrySet()) { | ||
responseHeaders.add(headerEntry.getKey() + ": " + headerEntry.getValue()); | ||
} | ||
String responseHeader = String.join("\r\n", responseHeaders); | ||
httpResponse.setBody(FileReader.readFile(httpResponse.getResponseFileName())); | ||
httpResponse.addHeader(CONTENT_LENGTH.getValue(), String.valueOf(httpResponse.getBody().getBytes().length)); | ||
httpResponse.addHeader(CONTENT_TYPE.getValue(), httpRequest.getContentTypeByAcceptHeader()); |
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.
확실히 훨씬 간결해졌네요!👍
import java.util.ArrayList; | ||
import java.util.List; | ||
|
||
public class HttpRequestReader { |
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 static String readFile(String fileName) { | ||
String filePath = FileReader.class.getClassLoader().getResource(STATIC_DIRECTORY_PATH + fileName).getPath(); | ||
try (Stream<String> lines = Files.lines(Paths.get(filePath))) { | ||
return lines.collect(Collectors.joining("\n", "", "\n")); |
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.
결론부터 말씀드리자면 join한 문자열의 끝에 개행을 추가해주고 싶어서 joining 메서드를 활용했습니다.
List의 원소들마다 한 줄씩 띄어주기 위해 "\n"
으로 join하고 있으며, join이 끝난 문자열에 suffix로 "\n"
을 한 번 더 붙여주고 있습니다.
파라미터의 중간에 들어가는 빈 문자열(""
)은 prefix 자리입니다. 현재 상황에서 prefix는 필요 없지만 suffix를 넣어주기 위해 의미 없는 값을 넣어줬습니다.
|
||
@Override | ||
protected void doPost(HttpRequest request, HttpResponse response) throws Exception { | ||
String[] splitBody = request.getBody().split("&"); |
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.
RegisterController에선 상수화 해줬으면서..!
Optional<String> account = getValueOf("account", splitRequestBody); | ||
Optional<String> email = getValueOf("email", splitRequestBody); | ||
Optional<String> password = getValueOf("password", splitRequestBody); | ||
|
||
if (account.isEmpty() || email.isEmpty() || password.isEmpty()) { |
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.
이 부분을 따로 메소드로 빼서 isInvalidateRegister(String[])으로 확인하고자 하는 걸 명시하면 좋을 것 같아요
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.
좋은 생각인 것 같습니다. 근데 account, email, password 변수를 if문 분기 이후에도 사용하고 있습니다. 그래서 저는 그냥 이대로 남겨 놓는 것도 괜찮을 것 같네요..!
splitRequestBody
에서 한 번 더 값을 꺼내오는 게 좀 지저분할 것 같아서요..
int queryStringIndex = path.indexOf("?"); | ||
if (queryStringIndex == -1) { |
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??
상수화 부탁해용
Kudos, SonarCloud Quality Gate passed! 0 Bugs 0.0% Coverage The version of Java (11.0.20.1) you have used to run this analysis is deprecated and we will stop accepting it soon. Please update to at least Java 17. |
키아라 안녕하세요. 민트입니다.
요구사항에 따라 리팩토링 진행하면서 1,2단계 보다는 훨씬 나은 코드가 된 것 같네요.
그럼에도 보기 힘들 수는 있을 것 같습니다.. 리뷰 잘 부탁드리겠습니다.