-
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
[Tomcat 구현하기 1 - 2단계] 페드로(류형욱) 미션 제출합니다. #578
Conversation
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.
안녕하세요 페드로~ 재즈입니다 😊
프로젝트 같은 팀원에서 미션 리뷰이로 만나니 반갑네요 :)
미션 구현하느라 고생 많으셨고 코드 잘 봤습니다.
리팩토링은 다음 단계임에도 불구하고 깔끔하게 잘 구현해주셨네요 👍
사소한 코멘트만 남겨두었으니 확인해보시고
톰캣 내부 구조에 관한 더 깊은 논의들은 다음 단계에서 진행하시죠 ✈
@@ -21,7 +21,7 @@ dependencies { | |||
implementation 'org.springframework.boot:spring-boot-starter-webflux' | |||
implementation 'org.apache.commons:commons-lang3:3.14.0' | |||
implementation 'com.fasterxml.jackson.core:jackson-databind:2.17.1' | |||
implementation 'pl.allegro.tech.boot:handlebars-spring-boot-starter:0.4.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.
페드로가 미션 프로젝트에 제안한 PR 잘 읽었습니다.
문제점을 찾아 잘 해결하셨네요 👍
return resource != null; | ||
} | ||
|
||
public static String read(String filePath) { |
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 in thread "Thread-2" java.nio.file.InvalidPathException: Illegal char <:> at index 2:
제 실행 환경에서 HTTP 요청 시 매번 위와 같은 에러가 발생하네요.
로직 문제는 아닌 것 같아 직접 찾아보니 OS 마다 파일 경로를 처리하는 방식이 다르기 때문인 것 같아요.
Winodws 에서 파일 경로는 드라이브 문자(C:/Users/..)
와 함께 사용되는데 이를 Unix 스타일(루트 디렉토리)로 잘못 해석하여 문제가 발생하는듯 합니다. (/C:/Users/..)
(저는 윈도우 사용자 ㅎㅎ)
URL::getPath
이 문제인 것 같은데 미션 요구사항에 크리티컬한 부분은 아닌 것 같아 다음 미션 진행할 때 한 번 확인해보시면 좋을 것 같아요. 😊
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.HashMap; | ||
import java.util.Map; | ||
|
||
public class Session implements HttpSession { |
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.
HttpSession은 Sevlet이 제공하여 기본 메서드가 워낙 많은데요 때문에 사용하지 않는 메서드도 많은 것 같아요.
현재 자바 코드로만 톰캣을 구현하는 것이 미션 목표이니 서블릿 의존성을 끊어보는 것은 어떨까요? 저는 Manager 인터페이스 시그니처를 수정했습니다.
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.
때문에 사용하지 않는 메서드도 많은 것 같아요.
저도 이것 때문에 고민을 좀 했었는데요, 'JavaDoc 까지 작성되어 있는 인터페이스 클래스를 내 입맛에 맞게 수정해서 쓰는 것이 과연 옳은가?' 를 고민해 봤을 때, 시그니처를 수정하는 것이 좀 더 어색한 구현이라고 판단해서 지금과 같이 작성해 두었어요.
이와 별개로, Servlet 자체는 톰캣의 것이라기보다는 JavaEE(현재는 Jakarta EE) 의 컴포넌트라 활용해도 큰 무리는 없을 것 같은데 어떻게 생각하시나요?
ref: https://jakarta.ee/specifications/platform/9/apidocs/jakarta/servlet/http/httpsession
|
||
public class SessionManager implements Manager { | ||
|
||
private static final Map<String, Session> SESSIONS = new HashMap<>(); |
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.
서버 세션 매니저 같은 경우, 다중 스레드 접근 시 발생하는 문제들을 고려해야 할 것 같아요.
동기화를 달성하는 방법은 페드로도 잘 알고 있을 거라 생각합니다 😊
MediaType mediaType = MediaType.fromAcceptHeader(request.getAccept()); | ||
|
||
// 로그인한 경우 index.html로 리다이렉트 | ||
Optional<HttpSession> session = request.getSession(sessionManager); |
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
에서 SessionManager
를 넘겨받아 세션을 가져오고 있는데 조금 어색한 것 같습니다.
현재는 책임상 HttpRequest
가 세션을 관리하는 구조인 것 같고
SessionManager
를 수정하면 HttpRequest
도 수정해야하니 유연하지 못하다는 생각도 들어요.
sessionManager.xxx(request)
구조가 되어야할 것 같은데 어떻게 생각하시나요?
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.
세션이 Request의 소유물이라고 생각하고 구조를 잡아갔는데, 다시 생각해 보니 SessionManager
가 존재하는 이상 제안해 주신 방향이 좀 더 자연스러운 것 같네요! 3단계 리팩토링을 하면서 수정해 보겠습니다~
안녕하세요 재즈!
우연히 같은 팀원을 리뷰어로 만나게 되니 반갑네요.
3단계가 리팩토링으로 알고 있어서, 3단계까지 완료 휴 PR을 남기려고 했는데 여러 이유로 2단계까지만 완료하고 PR을 작성하게 됐어요.
때문에 코드가 아주.. 마음에 들지는 않네요.
객체 분리가 덜 된 부분도 많고 코드 스타일도 이번에는 신경쓰지 못했어요😅
리뷰 잘 부탁드립니다ㅎㅎ