Skip to content

[3 - 4단계 방탈출 예약 대기] 레디(최동근) 미션 제출합니다.#116

Merged
ddu0422 merged 52 commits intowoowacourse:reddevilmidzyfrom
reddevilmidzy:step2
May 28, 2024
Merged

[3 - 4단계 방탈출 예약 대기] 레디(최동근) 미션 제출합니다.#116
ddu0422 merged 52 commits intowoowacourse:reddevilmidzyfrom
reddevilmidzy:step2

Conversation

@reddevilmidzy
Copy link
Member

@reddevilmidzy reddevilmidzy commented May 22, 2024

안녕하세요 미르!

이번 단계에선 요구사항이 명확하게 주어진 것이 아닌 자율적인 부분이 있어 제가 구현한 방식에 대해 남겨요!


  • 내 예약 목록에서 예약과 예약 대기 조회
    • 몇번째 예약 대기인지 확인 가능
  • 예약이 없는 상태에선 예약 대기가 불가능
  • 동시에 예약 요청이 올 경우 한 사람은 예약, 다른 사람은 예약 대기로 빠진다.
    • 구현 방법: 예약 요청과 예약 대기 요청의 API 및 테이블 동일
  • USER는 자신의 예약 대기만 취소만 가능. 예약은 취소 불가능
    • 구현 방법: 쿼리를 날려 삭제하고자 하는 ID가 자신의 예약인지, 예약대기인지 확인
  • ADMIN은 USER의 예약 대기를 거절할 수 있다.
  • ADMIN은 USER의 예약을 취소할 수 있다.
  • 예약 대기 승인은 자동으로 한다.
    • ADMIN이 USER의 예약을 취소하면 가장 먼저 예약 대기한 USER가 예약 대기에서 예약이 된다.

이런 구현들을 예약 대기를 모아둔 테이블을 새로 만들지 않고, 또 기존 Reservation 테이블에 필드를 추가하지 않고 스키마 변경없이 구현해보았습니다!

기존에 있던 Reservation 테이블에 테마, 날짜, 시간으로 조회했을 때 나온 예약들 중 첫번째 값이 예약이고, 그 이후의 나머지 값들은 전부 예약 대기며 이 점을 이용했습니다!

맞으면서 배우는 타입이라 그런진 몰라도 혼자 차력쇼한 감이 없지 않아 있는데 테이블 수정 없이 구현해보고 싶었습니다 😀

리뷰 감사드립니다! 🙇‍♂️


회원정보

이름 아이디 비번 역할
레디 redddy@gmail.com 0000 admin
재즈 gkatjraud1@redddybabo.com 1234 user
제제 jinwuo0925@gmail.com 1111 user

Copy link

@ddu0422 ddu0422 left a comment

Choose a reason for hiding this comment

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

안녕하세요 레디! 미르입니다 :)

요구 사항 구현 잘 해주셨네요~
몇 가지 코멘트 남겼으니 확인 부탁드려요 :)

궁금한 내용이 있으면 언제든지 코멘트 남겨주시거나 DM주세요!

답변

더티 체킹은 무엇일까요?
현재 프로세스에서 적용할 만한 부분이 있을까요?

(선택) 추가 학습

코드 변경은 많지 않을 것 같아서 추가 학습 키워드 드립니다.
급하게 진행하지 않고 기간을 정해서 할 수 있는 내용만 우선 학습해보면 어떨까합니다 :)

  • @Embedded란?
  • @Transactional 이란?
  • 복잡한 한방 쿼리 vs 여러 단계로 나누어 쿼리 요청 후 Application에서 조합
  • N + 1이란? 해결 방법은?
  • Lazy Loading 이 반드시 효율적인가?

@reddevilmidzy
Copy link
Member Author

더티 체킹은 무엇일까요?

더티 체킹이란 엔티티의 변경을 감지하고 명시적으로 업데이트 쿼리를 날리지 않아도, 엔티티가 영속 상태라면 최초 조회때의 엔티티와 비교하여 커밋 시점에 수정된 부분에 대한 업데이트 쿼리를 날리는 것을 말합니다!
jpa 스펙을 구현한 하이버네이트가 제공하는 기능입니다!


현재 프로세스에서 적용할 만한 부분이 있을까요?

현재 테이블 구조상에선 사용할 일이 없습니다. 지금은 예약을 취소하거나 예약 대기를 취소하면 아예 delete 쿼리를 날려 데이터를 삭제해버리지만, 실생활에서 티켓팅할 때 보면 예매를 취소해도 아예 취소되는 게 아니라 그래도 기록은 남는 형태입니다!

예약이나 예약 대기를 취소하여도 delete 쿼리를 날리는 것이 아니라 상태를 변경해야 한다면 적용해볼만한거 같습니다!

하이버네이트 명세

@reddevilmidzy
Copy link
Member Author

@transactional 이란?

스프링이 aop를 활용하여 제공하는 기능으로써 @transactional이 붙은 메서드 안에서 어느 하나의 작업이라도 실패한다면 롤백을 수행해주는 애노테이션입니다 !

jakarta에서도 @transactional 애노테이션이 있지만 스프링이 제공하는 @transactional이 전파, 격리수준, 읽기전용 등등 더 많은 옵션을 제공해주고 있습니다!

트랜잭션을 학습하면서 서비스 레이어의 메서드에 @transactional을 붙여 하나의 트랜잭션으로 묶어주고 동시에 OSIV의 속성도 false로 변경해주었습니다!

변경 커밋

Copy link

@ddu0422 ddu0422 left a comment

Choose a reason for hiding this comment

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

안녕하세요 레디! 미르입니다 :)

JPA 관련해서 학습 많이 해주셨네요~
몇 가지 코멘트 남겨드렸으니 확인 부탁드립니다 😄

궁금한 점 있으면 코멘트 남겨주시거나 DM주세요!

Copy link

Choose a reason for hiding this comment

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

@Test
@DisplayName("예약 시간을 추가한다.")

해당 테스트가 실패하네요

Screenshot 2024-05-26 at 10 43 31 PM

Copy link
Member Author

Choose a reason for hiding this comment

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

흑 여러번 돌렸을 때 잘 돌아갔었는데 요녀석도 테스트 실행순에 따라 터지는 녀석인거 같네요 😥

AdminEndToEndTest에 있는

    @Test
    @DisplayName("시간 저장 및 삭제")

요 녀석이 AdminEndToEndTest 클래스 안에서 가장 마지막으로 실행되면 @DirtiesContext의 옵션이 DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD 이기 때문에 컨텍스트가 앞에서 초기화 되고 이후엔 초기화되지 않기 때문에 TimeService에서 auto increment 값이 초기화되지 않았네요,,,

TimeServiceTest의 테스트 시 id를 저장할 때 나온 아이디를 가지고 비교하는 방식으로 테스트를 변경하였습니다!

Copy link
Member Author

Choose a reason for hiding this comment

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

1~2 단계에서도 비슷한 상황이 있었는데 결국 초기화 문제였습니다,

이런 실수를 예방할 수 있는 방법이 궁금합니다!
모든 클래스에서 @DirtiesContrext를 사용하면 너무 느려질 거 같아서 필요한 데에서만 사용하고, repository 테스트에선 @DataJpaTest를(@transactional 포함) 사용하고, service 테스트에선 @Trasactional 을 사용하는 방식으로 테스트 했는데, 미르는 어떤 방식으로 테스트를 하시나요?!

Copy link

Choose a reason for hiding this comment

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

저는 런던파이고 Unit Test를 작성하여 잘 사용하지 않아요.
테스트 코드가 길어지지만, 예상치 못한 테스트 결과를 도출하려고 하지 않아요.

만약, 저라면 각 테스트마다 격리하는 환경을 사용하는 것이 아닌 테스트 코드가 독립적으로 수행될 수 있도록 노력할 것 같습니다.
또한 id 값을 비교하는 게 아니라 나머지 내용이 올바른지 확인할 것 같아요.

레디도 해당 내용을 지속적으로 사용하며 레디만의 노하루를 쌓아보는건 어떨까요?

Copy link

@ddu0422 ddu0422 left a comment

Choose a reason for hiding this comment

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

안녕하세요 레디! 미르입니다 :)

충분히 잘 해주셨다고 판단하여 이번 내용은 여기서 마무리하겠습니다.
고생 많으셨어요~

다음 미션도 화이팅입니다 💪🏻

@ddu0422 ddu0422 merged commit 771147d into woowacourse:reddevilmidzy May 28, 2024
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