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

3주차 미션 / 서버 1조 - 강지윤 #3

Open
wants to merge 19 commits into
base: main
Choose a base branch
from

Conversation

kwiyoon
Copy link

@kwiyoon kwiyoon commented Apr 6, 2023

HTTP Request

InputStream에서 read하며 각 요소 파싱 후 저장

  • StartLine
    • method : GET / POST
    • request url : path + query(Nullable)
      url에서 쿼리가 들어오면 path와 query 분리하여 저장
    • version
  • Header
    Map으로 관리
    empty line으로 body와 구분
  • Body(Nullable)
    body로 쿼리가 들어오면 파싱하여 이용

HTTP Response

각 요소를 조합하여 OutputStream에 write

  • StartLine
    • version
    • Status code : 200 OK / 302 FOUND
  • Header
    Map으로 관리
    외부에서 주입 받음 (각 Controller에서 주입)
    empty line으로 body와 구분
  • Body
    Controller에서 주입

Controller

각 Controller는 받아온 Http request message를 해석하여Http response message를 작성하는 일을 수행
Controller마다 Http response message 작성 시 필요한 Header와 body를 set하여 주입

RequestMapper

각 url별 controller의 mapping을 if문으로 처리하지 않고,
미리 Map을 mapping 해놓고 해당 데이터를 활용

  • 해당 Map 에서 url을 key로 하여 controller를 받아옴.

향후 refactoring 방향

  • validate 처리
  • stream 활용
  • 각 Controller마다 반복되는 부분 리팩토링

Copy link
Contributor

@jung-woo-kim jung-woo-kim left a comment

Choose a reason for hiding this comment

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

안녕하세요!

Enum 클래스의 활용과 깔끔한 테스트 코드, 컨트롤러 싱글톤 유지까지,, 정말 깔끔해서 너무 놀랐어요!

다만, 코멘트에서도 적어주셨듯 중복 제거에 대한 리뷰도 조금 남겨드렸으니 참고해보시면 도움 될 것 같습니다!
추가로, Controller에 너무 로직이 집중 된다 싶으면 controller -> service-> repository 구조도 고려해보세요!

Copy link
Contributor

Choose a reason for hiding this comment

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

forward(String url) 메서드의 의미에 대해서 한번 되짚어 보시면 좋을 것 같아요!
forward: url의 위치 뷰의 파일을 response body에 작성한다.
즉, 파일 read와 Header 세팅을 HttpResponse 내부로 캡슐화할 수 있지 않을까요??🧐🧐

httpResponse.setHeaders(httpHeaders);

// 로그인 성공 - redirect MAIN_PATH
httpResponse.redirect(path);
Copy link
Contributor

Choose a reason for hiding this comment

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

마찬가지로 redirect가 헤더의 Location:path와 status code를 변경함은 고정되어있기 때문에 httpResponse.redirect(path) 메서드 내부로 로직을 분리하면 중복을 제거할 수 있을 것 같아요!🧐

return Arrays.stream(values())
.filter(m -> method.equals(m.method))
.findFirst()
.orElseThrow(() -> new IllegalArgumentException(String.format("해당되는 Http Method가 없습니다.")));
Copy link
Contributor

Choose a reason for hiding this comment

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

Enum 클래스의 valueOf 메서드 활용해보세요! 👍

}
if (line.startsWith(COOKIE.getHeader())) {
headers.put(COOKIE, line.split(": ")[1].strip());
}
Copy link
Contributor

Choose a reason for hiding this comment

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

조사해야하는 Header가 추가될 때마다 HttpRequest에 까지 와서 Header if문 분기 처리 하는 작업은 단일책임 원칙을 어긴 것 같아요!
HttpHeaders에 생성자로 BufferedReader를 넘겨주어서 처리하는 것은 어떨까요??
추가로 HttpHeader enum 클래스에 메서드를 만들어서 분기 처리를 없앨 수 있을 것 같아요😮

}

// 200 OK
public void forward(String path) throws IOException {
Copy link
Contributor

Choose a reason for hiding this comment

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

forward 메서드가 고정적으로 하는 File I/O 작업과 Content-Length, Content-Type 처리를 이 메서드 안에서 처리하면 훨씬 깔끔해져요!!

// 302 FOUND
public void redirect(String path) throws IOException {
startLine.setStatus(REDIRECT);
writeResponse();
Copy link
Contributor

Choose a reason for hiding this comment

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

forward와 마찬가지!!!

controllers.put(SIGNUP_ACTION.getURL(), new SignUpController());
controllers.put(LOGIN_ACTION.getURL(), new LoginController());
controllers.put(USERLIST_ACTION.getURL(), new UserListController());
}
Copy link
Contributor

Choose a reason for hiding this comment

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

static 을 사용해 정적으로 처리하여 스레드가 생성될 때마다 컨트롤러를 생성하는 것이 아닌 싱글톤으로 컨트롤러를 유지해주셨네요!!👍👍👍
싱글톤으로 유지할 수 있는 이유가 컨트롤러가 상태(인스턴스 변수)를 가지고 있지 않기 때문임을 이해하고 계셨으면 좋겠습니다!

Copy link
Contributor

Choose a reason for hiding this comment

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

테스트 전부 깔끔하고 좋은 것 같아요!👍

@kwiyoon
Copy link
Author

kwiyoon commented Apr 7, 2023

흑흑,, 자세한 코드 리뷰 너무너무 감사드려요!!😭😭
해당 리뷰를 바탕으로 더 많이 공부해보고, 열심히 리팩토링 해보겠습니다!!! 😆❤

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