안녕하세요 다빈님!!
매번 새로운 도전과제가 생겨서 쉽지않음에도 잘 해주시고 계셔서 좋습니다!! 🔥🔥🔥
전체 과제 체크 사항
API 명세서 없어요!! ERD 없어요!! 안돼요!! 다빈님 개인과제가,, 완성도가 점점 높아져야 하는데,, 아쉽습니다,, 정말 🥹🥹🥹
왜 배포를 안하셨어요!!! 고로,, 코드 기반 리뷰를 해봅시다!!
이번에 CI/CD 도 학습하셨으니, 이를 바탕으로 배포까지 쭉 해봅시다!!
더욱이 swagger 까지 붙이셔서, 배포한 swagger + API 명세라면 다빈님의 프로젝트가 더 완벽해지지 않을까요?!
보너스 기능에 집중하시느라 필수 기능에서 빠진 부분이 있는 것 같아요!! 하나씩 다시 체크해보자구요!
필수 기능 구현 리스트
[x] 로그인 / 회원가입
[x] 프로필 보기
[x] 새 공연 등록
[x] 공연 목록 보기
[x] 공연 검색하기
[x] 공연 상세보기
[ ] 좌석을 지정하지 않고 공연 예매하기
[x] 예매 확인하기
보너스 기능 구현 리스트
[x] 공연의 좌석 예매 정보 확인하기
[x] 좌석을 지정하여 예매하기
[x] 동시성 처리하기
[x] 예매 취소하기
[ ] 테스트 코드 내용 채우기
세부 피드백
우선 전체적으로 서비스 계층에 DTO 를 풀어서 전달하고 계신데, DTO 는 "Data Transfer Object" 약자로, 주로 "계층간 데이터 공유" 에 활용됩니다.
지금 다빈님처럼 DTO 를 풀어버리면, DTO 가 바뀌면 controller 의 service 호출 부분, service 에서 파라미터 수정, service 내부 로직 수정까지 3단계가 수정이 필요합니다. 하지만 DTO 자체를 넘긴다면, 서비스 계층의 내부 서비스로직만 바뀌면 되는거죠.
즉, 서비스 계층에 바로 풀어 넘겨버리면 다빈님의 추후 유지보수에 볼륨이 커집니다! 이 부분 다시 고려해보시는게 좋을 것 같아요
user
사용자와 Role, Auth (jwt) 기본 강의 형태가 동일해서 세부 피드백은 넘어가겠습니다.
그리고 제가 예전 부터 피드백 드린 부분이 있는데, admin 으로 가입하는 API 은 기본 사용자와 아예 전혀 다른 보안 로직을 태우거나, 아예 없어야 합니다.
태초의 admin 이 딱 하나 수동으로 만들어지고, 이 admin 이 다른 user 를 admin ROLE 가질 수 있게 update 하는 방향이 훨씬 올바른 방향입니다.
profile 에서 aggregation function 을 위한 createQueryBuilder 좋았습니다! 이런 aggregation 에 익숙해지실 필요가 있어요!
안녕하세요 다빈님!! 매번 새로운 도전과제가 생겨서 쉽지않음에도 잘 해주시고 계셔서 좋습니다!! 🔥🔥🔥
전체 과제 체크 사항
필수 기능 구현 리스트
보너스 기능 구현 리스트
세부 피드백
user
createQueryBuilder
좋았습니다! 이런 aggregation 에 익숙해지실 필요가 있어요!show
https://github.com/ratempty/online-reservation/blob/2d005f5e4caf65412628f21dcb6b3855868f74ed/src/shows/shows.controller.ts#L33-L39
@Query('title') title: string
로 url query string 받는 것 좋았습니다. 그에 따라 다른 서비스 로직 호출하는 것도 좋았구요https://github.com/ratempty/online-reservation/blob/2d005f5e4caf65412628f21dcb6b3855868f74ed/src/shows/shows.service.ts#L25-L47
save
대신 bulk create (bulk insert) 를 할 수 있습니다. 이는 지금과 같은 단일 save 보다 고효율이며 더 고차원적인 데이터 정합성을 보장할 수 도 있습니다.save
에 배열 자체를 던지는 방법과queryBuilder
를 사용하는 방법이 있습니다!reservations
create
method에서 "실패하는 경우를 가장 위에서 먼저 하시는 것" 을 추천해요!마무리 첨언