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단계] 오션(김동해) 미션 제출합니다 #347

Merged
merged 20 commits into from
Sep 8, 2023

Conversation

e-astsea
Copy link
Member

@e-astsea e-astsea commented Sep 4, 2023

안녕하세요 "스플릿".split(" ")[0] 잘부탁드립니다.

코드를 handler로 분리하여 진행을 하려다가 3단계 리팩토링 과정을 보고 그때 진행하려고 합니다 ㅎㅎ. . 기능구현에 충실해봤어요

리팩토링은 피드백 이후에 진행하겠습니다 !
감사합니다

@e-astsea e-astsea changed the base branch from main to donghae-kim September 4, 2023 08:33
Copy link

@splitCoding splitCoding left a comment

Choose a reason for hiding this comment

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

오션 리뷰가 늦어서 미안해요ㅠㅠ🙇

기본적인 구조 깔끔하게 잘 가져가신 것 같아요!! 👍

image

테스트하는 과정에서 의도치않은 세션 발생에 대한 문제가 있더라구요ㅠㅠ

image

나머지는 코멘트에서 확인해주시면 될 것 같아요!! 😄

ps. 오션의 코드에서 보이는 줄바꿈이나 final 키워드, 상수 분리 컨벤션들이 다른 부분들이 꽤 있더라구요ㅎㅎ 이 부분도 한번 확인해주세요 👍

this.requestBody = requestBody;
}

public static HttpRequest from(final InputStream inputStream) throws IOException {

Choose a reason for hiding this comment

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

개인적으로 InputStream 을 전달해서 사용한다면 InputStream 에서 데이터를 읽은 상태에 따라 의도치 않게 작동할 확률이 굉장히 높을 것 같아요!

InputStream 을 생성한 주체에서만 의도한 순서대로 작동하도록 하는것이 좋을것 같습니다!!😊

Copy link
Member Author

Choose a reason for hiding this comment

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

음 전 InputStream을 받은 bufferedReader를 메소드에 전달하였는데요.
같은 클래스 내부에서 사용된다하더라도 의도치 않게 작동할 확률이 있다고 생각합니다! 결국 개발자의 휴먼에러이니까요..

제 의견은 개발자가 유지보수가 어려울 수 있지만 '호출이 보장되어야 하는 로직' 이라는 이유로는 굳이 전달해서 사용하지 않을 이유가 없다고 생각해서 현재방식 그대로 이어갔습니다.

리팩토링 단계 때 어려움이 발생하면 다시한번 고려해보겠습니다!

}

private static void validate(final String line) {
if (line.isBlank() && line.isEmpty()) {

Choose a reason for hiding this comment

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

Suggested change
if (line.isBlank() && line.isEmpty()) {
if (line.isBlank()) {

isBlank() 가 isEmpty() 까지 같이 검증해주는 걸로 알고 있어요~

Copy link
Member Author

Choose a reason for hiding this comment

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

잊고 있었네요.. 감사합니다~

try {
Objects.requireNonNull(resource);
} catch (NullPointerException e) {
throw new ResourceNotFoundException(resourcePath);
Copy link

@splitCoding splitCoding Sep 6, 2023

Choose a reason for hiding this comment

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

GET 메서드 처리에서 요청 대상에 확장자가 없을 경우 html 을 확장자로 처리함으로 발생하는 리소스를 찾지 못하는 경우들이 발생할텐데요 ( ex. GET /hello HTTP/1.1 )

이 부분을 404가 아닌 500 으로 처리한 이유가 궁금해요~~

Copy link
Member Author

Choose a reason for hiding this comment

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

따로 500으로 처리한 이유는 없었습니다! 404로 처리하려고 했는데 커스텀 예외를 제대로 잡아주지 못해 500으로 빠져버렸네요 .. 404로 제대로 매핑되도록 처리하였습니다!

Comment on lines +104 to +105
final Map<String, String> requestParam = Arrays.stream(httpRequest.getRequestBody().split("&")).takeWhile(it -> !it.isEmpty())
.map(it -> it.split("=")).collect(Collectors.toMap(it -> it[0], it -> it[1]));

Choose a reason for hiding this comment

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

"&", "=" 도 상수 분리해주면 좋을 것 같아요!!

Copy link
Member Author

Choose a reason for hiding this comment

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

특정 값에 대해 상수 분리가 덜 되었던 이유는 리팩토링 후 클래스 분리가 제대로 되면 상수분리를 진행하려고 하다보니까 그렇게 된 것 같습니다!

추후 3단계에서 리팩토링과 함께 깔끔한 상수 분리 진행하도록 하겠습니다 ..

Comment on lines 114 to 116
if(isLoggedIn(httpRequest)){
return foundResponse(httpRequest, INDEX);
}

Choose a reason for hiding this comment

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

POST 의 경우에도 로그인 처리 해주셨군요 👍

@@ -29,19 +55,143 @@ public void process(final Socket connection) {
try (final var inputStream = connection.getInputStream();
final var outputStream = connection.getOutputStream()) {

final var responseBody = "Hello world!";
final HttpRequest httpRequest = HttpRequest.from(inputStream);

Choose a reason for hiding this comment

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

개인적으로 InputStream 을 전달해서 사용한다면 InputStream 을 사용하는 메서드의 호출 순서가 확실하게 보장되지 않을 경우 의도치 않게 작동할 확률이 굉장히 높을 것 같아요!

호출 순서가 보장되어야 하는 로직이라서 InputStream 을 사용하는 한곳에서만 의도한 순서대로 절차적인 메서드를 작성하여 작동하도록 하는것이 좋을것 같다는 의견입니다!!😊

Copy link
Member Author

@e-astsea e-astsea Sep 7, 2023

Choose a reason for hiding this comment

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

음 전 InputStream을 받은 bufferedReader를 메소드에 전달하였는데요.
같은 클래스 내부에서 사용된다하더라도 의도치 않게 작동할 확률이 있다고 생각합니다! 결국 개발자의 휴먼에러이니까요..

제 의견은 개발자가 유지보수가 어려울 수 있지만 '호출이 보장되어야 하는 로직' 이라는 이유로는 굳이 전달해서 사용하지 않을 이유가 없다고 생각해서 현재방식 그대로 이어갔습니다.

리팩토링 단계 때 다시한번 고려해보겠습니다!

String headersString = headers.entrySet()
.stream()
.map(entry -> entry.getKey() + ": " + entry.getValue())
.collect(Collectors.joining("\r\n"));
Copy link

@splitCoding splitCoding Sep 6, 2023

Choose a reason for hiding this comment

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

Suggested change
.collect(Collectors.joining("\r\n"));
.collect(Collectors.joining(System.lineSeperator()));

줄바꿈 문자가 어플리케이션이 실행되는 환경에 다를 수 있기에 환경에 의존하지 않게 위에 코드처럼 작성해보면 어떨까요오??

Copy link
Member Author

Choose a reason for hiding this comment

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

좋은 것 같아요 :)

if (SESSIONS.containsKey(id)) {
return SESSIONS.get(id);
}
return null;

Choose a reason for hiding this comment

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

Optional 로 처리하는 방식도 좋을것 같아요!!😊

( 호출하는 쪽에서 세션이 없는 경우에 대해 어떻게 처리했는지에 대해 신경쓰지 않아도 되는 장점이 있을 것 같아요!! )

Copy link
Member Author

Choose a reason for hiding this comment

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

Optional 로 처리하니 훨씬 깔끔하게 진행할 수 있게 된 것 같습니다! 수정하였습니다~

absolutePath = absolutePath.split(NON_RESERVED_QUERY_PARAM_DELIMITER)[0];
}
if (!absolutePath.contains(EXTENSION_DELIMITER)) {
absolutePath += DEFAULT_EXTENSION;

Choose a reason for hiding this comment

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

Suggested change
absolutePath += DEFAULT_EXTENSION;
absolutePath += EXTENSION_DELIMITER + HttpContentType.HTML.getContentType()

HttpContentType 에 있는 HTML 을 재사용해보는 건 어떨까요오?? 😁

public static HttpCookie parseCookie(String cookie) {
Map<String,String> parsedCookie = new HashMap<>();
if(cookie!=null) {
parsedCookie = Arrays.stream(cookie.split(";= "))
Copy link

@splitCoding splitCoding Sep 6, 2023

Choose a reason for hiding this comment

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

Suggested change
parsedCookie = Arrays.stream(cookie.split(";= "))
parsedCookie = Arrays.stream(cookie.split("; "))

오션은 ";= " 를 기준으로 나누었는데 어떤 동작을 의도하신건지 궁금해요오~ 😁

Copy link
Member Author

Choose a reason for hiding this comment

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

스플릿이 수정해주신대로 계획했었는데 밑에서도 '='을 사용하다보니 오타가 발생했던 것 같습니다 ㅠㅠ 수정했습니다!

Copy link
Member Author

@e-astsea e-astsea left a comment

Choose a reason for hiding this comment

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

크게 구조적인 리팩토링은 진행하지 않았습니다. 3단계 때 구조적 리팩토링이 있다고해서 코드적으로만 조금 수정하였습니다! 빠르게 리팩토링 하고싶어지는 코드네요 ..

@sonarcloud
Copy link

sonarcloud bot commented Sep 7, 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 9 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

@splitCoding splitCoding left a comment

Choose a reason for hiding this comment

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

남긴 코멘트에 대한 고민과 해결 잘 해주셔서 감사합니다!!👍

3단계 화이팅하시구 3단계에서 뵈요!!😊

@splitCoding splitCoding merged commit da04259 into woowacourse:donghae-kim Sep 8, 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