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

[Spring MVC + JDBC + CORE] 김민창 미션 제출합니다. #368

Open
wants to merge 10 commits into
base: idle2534
Choose a base branch
from

Conversation

idle2534
Copy link

@idle2534 idle2534 commented Nov 7, 2024

2개 주차 분량을 한번에 진행하는 과정에서 Commit이 상세하게 이루어 지지 않았습니다. 그래서 결과적으로 3 단계의 과정을 확인하기 어려운 상태에서 Core 단계 Layer Architecture 까지의 완성된 형태를 띄고 있습니다. 아래는 이번 과정을 진행하면서 생긴 궁금증들 입니다.

  1. 이번 과정에서는 h2 설정을 application.properties로 했는데 yaml과의 차이점은 가독성 밖에 없는 건가요? 만약에 사용하게 되면 둘 중에 무엇을 더 자주쓰나요?
  2. ReservationDao에서 Time table의 값을 읽는 것은 TimeDao를 무시하는 것 같아서 Time이 비어있는 상태로 서비스에 반환하고 서비스에서 TimeDao로부터 값을 가져와서 Reservation에 Set을 했는데 이와 같은 방식이 적절한지 궁금합니다.
  3. 위의 과정을 위해 Time Entity에 NoArgsConstructor과 AllArgsConstructor 외에 Time이 없는 생성자를 추가로 만들었는데 상황에 따라 생성자를 여러개를 만드는게 적절한지 궁금합니다.
  4. Name, Date, Time이 공백인 것에 대한 예외 처리는 입력 형식에 대한 예외 처리임으로 View 쪽에서 해야한다고 생각해서 일단 Controller에서 ResponseBody로 받는 Dto에 NoBlank validate를 추가하고 Entity에는 따로 추가하지 않았습니다. 그리고 Time table을 만든 이후 "10:00"에 대한 예외 처리 또한 입력 형식에 관한 것이므로 Controller에서 try catch를 통해 예외 처리 했는데 View에서 해야하는 예외처리를 Controller에서 처리하는게 맞는 방식인 것 인가요? @RestController일 때는 또 달라지는지도 궁금합니다.
  5. 4번과 비슷하게 Dao는 데이터 관련 로직만을 수행해야 한다고 생각해서 요구조건에 대한 예외처리는 Service에서 처리 했는데 이와 같은 방식이 맞는지 궁금합니다.
  6. API 명세서에 적힌 json 값이 Entity와 동일하여 별다른 ResponseDto를 만들지 않았는데 아무리 같은 값을 가지더라도 layer가 다르므로 후에 유지보수를 대비해 ResponseDto를 만들어줘야 하는지 궁금합니다.
    7. 추가로 이번 과정에서는 없었지만 Jpa 없이 JDBC에서 연관관계 매핑을 어떻게 하는지 궁금합니다.
  7. inter join 쿼리문을 보면서 조금 애를 먹었는데 혹시 sql 공부하기 좋은 자료가 있다면 추천 부탁드립니다.

Copy link

@hong-sile hong-sile left a comment

Choose a reason for hiding this comment

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

  1. 이번 과정에서는 h2 설정을 application.properties로 했는데 yaml과의 차이점은 가독성 밖에 없는 건가요? 만약에 사용하게 되면 둘 중에 무엇을 더 자주쓰나요?

제가 알기론 가독성 차이밖에 없는 걸로 압니다.
저는 개인적으로 yaml을 선호합니다. 계층형으로 되어있어서 나중에 값이 많아졌을 때 보기 편하거든요.

  1. ReservationDao에서 Time table의 값을 읽는 것은 TimeDao를 무시하는 것 같아서 Time이 비어있는 상태로 서비스에 반환하고 서비스에서 TimeDao로부터 값을 가져와서 Reservation에 Set을 했는데 이와 같은 방식이 적절한지 궁금합니다.

민창님께서 정의한 Dao가 어떤 의미인가요?
단순히 테이블과 1대1로 매핑되어서 쿼리하는 용도일까요?
아니면, 도메인을 완성시켜서 조회하는 용도일까요?

  1. 위의 과정을 위해 Time Entity에 NoArgsConstructor과 AllArgsConstructor 외에 Time이 없는 생성자를 추가로 만들었는데 상황에 따라 생성자를 여러개를 만드는게 적절한지 궁금합니다.

상황에 따라 생성자를 여러개 만드는 건 좋습니다. 상황에 맞춰서 적절하게 쓸 수 있으니까요.

  1. Name, Date, Time이 공백인 것에 대한 예외 처리는 입력 형식에 대한 예외 처리임으로 View 쪽에서 해야한다고 생각해서 일단 Controller에서 ResponseBody로 받는 Dto에 NoBlank validate를 추가하고 Entity에는 따로 추가하지 않았습니다. 그리고 Time table을 만든 이후 "10:00"에 대한 예외 처리 또한 입력 형식에 관한 것이므로 Controller에서 try catch를 통해 예외 처리 했는데 View에서 해야하는 예외처리를 Controller에서 처리하는게 맞는 방식인 것 인가요? @RestController일 때는 또 달라지는지도 궁금합니다.

말씀하신 것처러 View에서 해야하는 예외처리라고 저는 생각합니다. @Valid를 활용할 수도 있고, 다른 방법도 있을 수 있습니다. 한번 찾아보시죠
@RestController는 어떤 이유로 물어보신걸까요...?

  1. 4번과 비슷하게 Dao는 데이터 관련 로직만을 수행해야 한다고 생각해서 요구조건에 대한 예외처리는 Service에서 처리 했는데 이와 같은 방식이 맞는지 궁금합니다.

Dao에 대한 민창님의 정의에 따라 다릅니다. 요구조건에 대한 예외처리가 단순히 도메인 레벨이 아닌, 비즈니스 레벨이 다하면 서비스에서 하는 게 적절할 수도 있죠

  1. API 명세서에 적힌 json 값이 Entity와 동일하여 별다른 ResponseDto를 만들지 않았는데 아무리 같은 값을 가지더라도 layer가 다르므로 후에 유지보수를 대비해 ResponseDto를 만들어줘야 하는지 궁금합니다.

저는 분리하는 것을 추천드립니다. 어찌보면 코드의 중복이라 생각될 수도 있지만, 이정도는 관심사의 분리에 가깝다고 생각해요.
클래스는 하나의 책임만을 가져야합니다. view의 역할과 domain의 역할을 둘 다 가지는 것은 좋지 않아보여요.

  1. 추가로 이번 과정에서는 없었지만 Jpa 없이 JDBC에서 연관관계 매핑을 어떻게 하는지 궁금합니다.

jdbc에서 연관관게 매핑..? 어떤 걸 말씀하시는 건지 잘 모르겠어요. 스터디 떄 한번 이야기해주시죠.

  1. inter join 쿼리문을 보면서 조금 애를 먹었는데 혹시 sql 공부하기 좋은 자료가 있다면 추천 부탁드립니다.

sql은 음 저는 직접 필요할떄마다 찾아보면서 그냥 익혔어서 별도로 책을 보진 않았습니다.
일단 학교 수업도 있기도 하고, 음ㅁ 혼자 공부하는 sql이라는 책도 좋다고 들었습니다!!

전체적으로 많은 고민을 한게, 느껴져서 좋네요!!
몇몇 부분에 대한 코멘트를 남겼는데, 한번 확인 부탁드려요.


Reservation addReservation(ReservationRequestDto reservationRequestDto);

void removeReservation(Long id);

Choose a reason for hiding this comment

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

ReservationService와 ServiceImpl을 나누셨군요. 그렇게 구현하신 이유가 있을까요??

import lombok.Setter;

@AllArgsConstructor
@NoArgsConstructor

Choose a reason for hiding this comment

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

AllArgsConstructor와 NoArgsConstructor 둘 모두 필요한 생성자인가요??

));
}

public Reservation save(ReservationRequestDto reservationRequestDto) {

Choose a reason for hiding this comment

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

Dao를 만드셨군요!!

Dto랑 Dao는 무엇인지?
둘은 mvc 중에 어디에 속하는지 궁금해요.

import org.springframework.test.annotation.DirtiesContext;
import roomescape.controller.ReservationController;
import roomescape.domain.Reservation;

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)

Choose a reason for hiding this comment

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

테스트 중에서 실패하는 테스트가 있는 것 같아요. 한번 확인해보시는 게 어떨까요?

private final JdbcTemplate jdbcTemplate;

public List<Reservation> findAll() {
return jdbcTemplate.query("SELECT "

Choose a reason for hiding this comment

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

java 17부터는 여러 라인의 문자열을 나타낼 떄
"""
"""
로 감쌀 수 있는 문법이 있어요 한번 확인해보시면 좋을 것 같습니다.

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