jinho-yoo-jack / wanted-preonboarding-challenge-backend-16

원티드 프리온보딩 백엔드 챌린지 사전과제
59 stars 155 forks source link

홍석준 - 2월 사전과제 제출합니다. #22

Open seokjun7410 opened 9 months ago

seokjun7410 commented 9 months ago

도메인 다이어그램

스크린샷 2024-02-01 오전 1 41 05

ERD

스크린샷 2024-02-01 오전 1 41 05

1. Perform 과 Perfomance

스크린샷 2024-01-31 오후 11 55 05

공연 및 전시 도메인 특성상, 하나의 전시가 진행되는 시간대에 따라 여러 예약이 가능할 것이라 생각했습니다. 때문에 전시행위(perfrom)를 entity로 식별하여 perfrom : Performance = N : 1 의 관계로 개발을 진행했습니다.

2.전시 및 공연에 다양한 할인정책 적용

스크린샷 2024-01-31 오후 11 57 21

추상클래스를 이용하여 새로운 할인정책의 등장으로부터 OCP원칙을 지키도록 구성하였습니다.

3. 도메인간 결합

스크린샷 2024-02-01 오전 12 13 37

예약기능을 개발하면서 예약도메인과 전시도메인이 강하게 결합되는 것을 식별했습니다.

스크린샷 2024-02-01 오전 12 15 48

도메인간의 결합도를 낮추기 위한 이벤트 혹은 메시징큐를 쉽게 도입할 수 있도록 구조를 변경했습니다. 실제 코드에선 이벤트를 발생시키지 않고 구조만 반영한 후 마무리했습니다.

4.예약 취소시 알림 기능, 비동기 이벤트 발행

예약 취소로직이 알림의 성공/실패 여부에 영향을 받으면 안되므로 비동기 이벤트로 구성했습니다.

@Test
public void 예약_취소_시_구독자_알림_발송_실패_예약취소에_영향_없음() throws InterruptedException {
    Mockito.doThrow(new RuntimeException("알림 외부서비스 에러")).when(notificationOutput).reservationCancelNotify(any(),any());
    ...
    reservationService.cancel(cancelRequest);

    ThreadPoolTaskExecutor executor = (ThreadPoolTaskExecutor) customThreadPoolTaskExecutor;
    executor.getThreadPoolExecutor().awaitTermination(1, TimeUnit.SECONDS);

    ...
    assertThat(reservation.status()).isEqualTo(ReservationStatus.CANCEL);

테스트는 mokito를 이용하여 예외를 발생시키고, 비동기 로직을 진행하는 스레드가 끝날때까지 대기한 뒤 취소되었는지 확인하도록 구현했습니다.

이후 개선사항

  1. 테스트 코드를 꼼꼼히 작성하지 못했습니다.
  2. Controller 구현/테스트를 작성하지 않았습니다.
  3. 할인정책 CURD가 구현되지 않았습니다.
  4. 부적절한 네이밍이 존재합니다.
  5. 가독성이 좋지 않은 메소드가 있습니다.
  6. 깔끔한 커밋메시지를 작성하지 못했습니다.
  7. 중복되는 코드가 많습니다.
  8. JPA 상속사용으로 발생한 조회쿼리 문제, 최적화가 필요합니다.
  9. embedded컬럼명 재정의가 필요합니다.