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

[톰캣 구현하기 - 1,2단계] 제이(이재윤) 미션 제출합니다. #324

Merged
merged 21 commits into from
Sep 4, 2023

Conversation

sosow0212
Copy link

@sosow0212 sosow0212 commented Sep 4, 2023

우가 안녕하세요?

이번 미션은 개인적으로 난해하고 너무 어려웠습니다.
아직 Handler를 추가하지 않아서 코드가 if문 범벅인데요.

마음 같아서는 싹 고치고 싶은데 3단계 미션에서 리팩토링을 진행하기에 일단 이대로 제출합니다.
구조를 나누지 않아서 코드 보시기 힘드실텐데 미리 사과의 말씀 드리고 시작하겠습니다 ㅠㅠ 이점 유의해서 리뷰해주세요 :)

오늘도 좋은 하루 보내세요!

Copy link
Member

@wugawuga wugawuga left a comment

Choose a reason for hiding this comment

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

먼저 좋은코드로 눈호강 시켜주셔서 감사합니다. 😚
짧은 시간에도 불구하고 이렇게 깔끔한 코드를 작성하셔서 감탄을 금치 못했습니다.

제이코드가 너무 깔끔하고 정답이지만,
제이랑 얘기를 나눠보면 재밌겠다 싶은 부분이 생겨서 Request change 요청드립니다!!


User user;
try {
user = userService.login(params.get("account"), params.get("password"));
Copy link
Member

Choose a reason for hiding this comment

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

params 에 account 와 password 가 없고 다른 값이 들어오면 예상치 못한 상황이 발생할 것 같아요

Copy link
Author

Choose a reason for hiding this comment

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

Map이라서 null 값이 나오겠네요!
해당 경우를 처리하기 위해서 if문 분기를 하나 두고 badRequest를 내려주도록 변경했습니다.

(추후에 3단계 리팩토링하면서 모두 나누겠습니다 ㅠ.ㅠ)

}
}

private HttpResponse getResponse(final HttpRequest httpRequest) throws URISyntaxException, IOException, NotFoundException {
Copy link
Member

Choose a reason for hiding this comment

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

HttpResponse 객체로 분리를 너무 깔끔하게 해주신 것 같아요!!! 👍👍👍

이 부분에 제이에 대한 생각이 궁금해서 코멘트를 남깁니다.
HttpResponse 를 정적팩토리 메소드를 통해서 생성하고 index.html, login.html 등등... 를 직접 Processor 에서 넣어주고 있습니다.

이때 해당 "xxx.html" 를 관리하는 역할은 어떤 객체가 가져야 된다고 생각하시나요?

Copy link
Author

Choose a reason for hiding this comment

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

일단 자원을 반환하는 것은 HttpResponse가 하는 것이 맞다고 생각합니다!

하지만 지금 저 상태에서는 요청이 늘어난다면 if문이 더 범벅이 되고 말씀하신 반환 부분을 모두 지저분하게 한 곳에서 관리할 것 같습니다.

따라서 handler를 추가하고, 추후에 여기서 요청 별 반환 자원을 관리를 해주는 것이 좋다고 생각합니다.


Session session = httpRequest.createSession();
session.setAttribute("user", user);
HttpResponse response = HttpResponse.ok(ContentType.HTML, Status.FOUND, Map.of(Header.LOCATION, "/index.html"), "");
Copy link
Member

Choose a reason for hiding this comment

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

HttpResponse.ok()

라서 ok 인가 라고 생각했지만, Status.FOUND 를 보고 조금 혼란이 생겼던 것 같아요.
ok 말고 좀 더 명확한 메소드명은 어떠신가요?

Copy link
Author

Choose a reason for hiding this comment

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

추가하겠습니다!
이 부분도 리팩토링하면서 Builder 패턴으로 변경해보도록 하겠습니다 ㅠㅠ 보시느라 고생하셨습니다

Comment on lines +32 to +47
public static HttpRequest from(final BufferedReader reader) throws IOException {
String rawRequestLine = Objects.requireNonNull(reader.readLine());
Uri uri = Uri.from(rawRequestLine);

List<String> headersRead = readHeader(reader);
Headers headers = Headers.from(getHeaders(headersRead));

Optional<String> contentLength = headers.getHeader(Header.CONTENT_LENGTH);
if (contentLength.isPresent()) {
String rawContentLength = contentLength.get();
String body = getBody(reader, Integer.parseInt(rawContentLength.trim()));
return getHttpRequest(uri, headers, Params.from(body));
}

return getHttpRequest(uri, headers, Params.createEmpty());
}
Copy link
Member

Choose a reason for hiding this comment

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

제이의 생각이 궁금한 부분입니다!!
HttpRequest 객체를 생성하기 위해 BufferedReader 를 받아와서 사용하고 있는 모습을 볼 수 있는데요?
이 부분이 궁금합니다!!

Copy link
Author

Choose a reason for hiding this comment

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

InputStream은 1byte씩 읽고, 아스키 코드로 반환됩니다!
반면에 InputStream은 char로 받아서 문자 데이터를 읽는데 특화 됐고, 인코딩을 적용할 수 있어서 사용했습니다!

마찬가지의 이유로 OutputStream도 BufferedWriter로 변경하였습니다 :)

@sonarcloud
Copy link

sonarcloud bot commented Sep 4, 2023

Kudos, SonarCloud Quality Gate passed!    Quality Gate passed

Bug A 0 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 15 Code Smells

0.0% 0.0% Coverage
0.0% 0.0% Duplication

warning 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.
Read more here

Copy link
Member

@wugawuga wugawuga left a comment

Choose a reason for hiding this comment

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

이 부분은 계속해서 얘기를 나누어 보고 싶은 부분이에요.
HttpRequest 객체가 BufferedReader 의존하는 것은 괜찮을까?
저도 아직 이 고민에 대해서 결론을 내리지 못했는데요!!

다음 단계에서 더 멋진 코드들 기대하겠습니다 ㅎㅎ
시간이 촉박했음에도 불구하고 이런 멋진 코드를 작성해 주셔서 감사합니다. 리뷰하기 편했고 얘기 재밌게 나눈 것 같아요! 수고하셨습니다 🙇‍♂️

@wugawuga wugawuga merged commit 3521e26 into woowacourse:sosow0212 Sep 4, 2023
2 checks 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