안녕하세요 지은님 ^^ 요번 리뷰어 이동호입니다.
지은님께서 궁금하셨던 부분 2가지를 중점적으로 코드 리뷰를 진행했습니다.
혹시 틀렸던 부분이나, 궁금하신 부분들은 댓글로 남겨주시면 피드백 혹은 답변해드리겠습니다. :)
PlusUltraCode 지은님의 대부분의 예외처리를 해당 객체 안에서 예외 처리 함수를 만들고 진행하셨습니다. 만약 예외 처리가 한두 개가 아닌 많아지게 될 경우, 해당 객체는 해야 할 일들이 있는데 예외 함수에 가려질 수 있다고 생각해요. 예외 처리 함수들을 따로 클래스 객체로 만들어서 사용하는 게 더 좋아 보입니다. 백엔드 팀 리더분들의 코드를 살펴봤는데 Record를 사용하여 예외 처리를 진행한 것을 봤습니다.
jelee2555 감사합니다! 그 부분 참고하여 커밋해보겠습니다.
src/main/java/roomescape/ReservationController.java
PlusUltraCode JDBC를 사용하여 쿼리문을 잘 작성하였고 데이터베이스와 잘 연동하신 게 보입니다. 다만 ReservationController 입장에서 너무 많은 일을 하고 있다는 생각이 듭니다. 그래서 지은님께서 요청해주신 클래스 나누는 기준에 대해서 말씀드리겠습니다.
MVC 패턴을 아시나요? 여기 링크를 참고해보세요.
Model, View, Controller에는 정해진 역할이 있습니다. 이 세 가지 모델을 나누는 가장 큰 이유는 각 구성 요소의 역할과 책임을 명확하게 구분하기 위해서입니다.
Controller는 주위에 있는 칼을 들어 휘두르는 역할을 합니다. Model은 Controller가 사용할 칼을 직접 제작하는 역할을 합니다.
지은님의 ReservationController를 보면, 칼을 휘두르는 것뿐만 아니라 칼을 직접 제작하고 있습니다. 쉽게 말해, 칼을 휘두른다 == GetMapping 및 PostMapping을 통해 웹과 통신한다. 칼을 직접 제작한다 == JDBC 문법을 이용하여 쿼리문을 작성하여 데이터베이스와 연동한다.
그래서 JDBC 쿼리 문법을 Controller에서 사용하는 게 아닌 따로 클래스를 만들고, Controller에서는 해당 클래스를 소환해야 된다고 생각합니다.
처음에 어떤 클래스를 어떤 패키지에 넣어야 할지 고민이 많으실 겁니다. 그래서 저는 코드를 작성하기 전에 먼저 패키지부터 선언하는 습관을 만들었습니다. model, controller, view 패키지를 만든 뒤 필요할 때마다 해당 패키지 안에 클래스 파일들을 넣었습니다.
이와 같은 큰 틀에서 패키지 이름들을 조금씩 더 추가하는 식으로 코드를 만들면 되겠습니다.
예를 들어, 태연님은 domain, exception, presentation, dto로 총 패키지 4개를 만드셨습니다. domain은 model에 해당하고, exception은 예외를 관리하는 패키지, presentation은 controller의 의미를 담고 있습니다. 또한 어느 정도 view 패키지의 의미도 나타내고 있습니다. dto 패키지는 멤버 변수들만 선언되어 있고 각 멤버 변수를 validate를 검증하기 위해 만들어 놓은 패키지라고 생각하면 되겠습니다.
여기서 presentation 패키지의 ReservationController.java 파일을 보시면 컨트롤러에서 직접 쿼리문을 작성하는 것이 아닌 domain 패키지 안에 있는 ReservationRepository라는 파일을 소환하여 사용하고 있습니다. (검만 휘두른다)
이런 식으로 패키지를 나누고 각 클래스를 만들 때마다 이 클래스가 이 패키지에 들어가는 게 맞는지 고민하면서 만드는 습관이 생기면 좋겠습니다. :)
jelee2555 자세한 답변 감사합니다!!
동호님 리뷰를 보고 공부하던 중 궁금한 점이 생겨 질문 드립니다. 태연님 코드에서 presentation이 controller와 view 패키지의 의미를 둘 다 지니고 있다고 하셨는데 어떤 부분에서 view의 의미를 가지고 있는 건지 궁금합니다!
ReservationController에서 사용자로부터 request를 받고 그에 따른 response를 보내기 때문에 view의 의미를 담고 있는 건가요??
PlusUltraCode 네, 맞습니다! ReservationController에서 사용자로부터 request를 받고 그에 따른 response를 보내는 부분이 바로 view의 의미를 담고 있습니다. 조금 더 구체적으로 설명드리자면:
ReservationController에서 View의 의미
ReservationController는 사용자로부터 HTTP 요청을 받고, 그 요청에 따라 데이터를 처리한 후, 적절한 응답을 생성합니다. 이 응답은 보통 HTML, JSON 등의 형태로 사용자에게 반환됩니다. 따라서 ReservationController는 다음과 같은 두 가지 역할을 수행합니다:
- Controller 역할: 사용자 요청을 받아 처리하고, 필요한 데이터를 모델에서 가져와서 처리합니다.
- View 역할: 처리된 데이터를 사용자에게 반환하는 응답을 생성합니다. 여기서 응답을 생성하는 부분이 뷰의 역할을 일부 포함하고 있다고 볼 수 있습니다.
src/main/java/roomescape/GlobalExceptionHandler.java
PlusUltraCode 클래스를 나누어 코드를 작성하였을 때, 예외 처리는 어디서 진행해야 하는지 고민하셨습니다.
예외에는 두 가지가 있습니다: 런타임 에러와 컴파일 에러.
- 컴파일 에러: 쉽게 말해 인간이 만들어 놓은 코드를 기계어로 바꾸는 과정에서 생기는 오류입니다. 예를 들어, 세미콜론을 빼먹거나, public이라고 선언해야 하는데 pubic이라고 선언하는 경우 등이 있습니다. 컴파일 에러는 대부분 IntelliJ에서 빨간 줄 혹은 밑줄을 통해 알려줍니다.
- 런타임 에러: 프로그램이 실행 중에 생기는 에러입니다. 예를 들어, 사용자가 이름, 날짜, 시간 등을 입력하고 그 데이터가 데이터베이스에 저장되는 과정에서 발생할 수 있습니다. 스프링에서는 @ControllerAdvice라는 애노테이션을 사용하여 런타임 중에 일어나는 에러들을 한꺼번에 관리해주는 역할을 합니다.
지은님처럼 발생할 에러들을 잘 정리해주셨습니다. 스프링에서 개발할 경우 어느 클래스든지 예외들을 throw만 하게 되면, 그 에러를 @ControllerAdvice를 사용하여 처리해주시면 되겠습니다. :)
'멋쟁이사자처럼 동아리 > 코드 리뷰' 카테고리의 다른 글
코드 리뷰 리뷰어 : 이동호 로또 미션 (0) | 2024.06.22 |
---|---|
코드리뷰 리뷰어 : 이동호 Spring MVC (0) | 2024.06.22 |
코드리뷰 Spring Core (0) | 2024.06.22 |
코드리뷰 Lotto mission (0) | 2024.06.22 |
코드리뷰 Spring MVC (0) | 2024.06.22 |