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

[feat] 할인 쿠폰 발급 #82

Merged
merged 53 commits into from
Aug 16, 2024

Conversation

kimhyun5u
Copy link
Member

@kimhyun5u kimhyun5u commented Aug 15, 2024

💡 다음 이슈를 해결했어요.

Issue Link - #75

  • 할인 쿠폰 발급

💡 이슈를 처리하면서 추가된 코드가 있어요.

CouponIssuance

쿠폰 발급 엔티티 입니다.

IssueCouponeService

쿠폰 발급 로직을 담당하는 서비스입니다.


💡 이런 고민을 했어요.

동시성 제어 성능 고민

  • 낙관적 락 사용
    image

  • 비관적 락 사용
    image

CouponIssuance 는 어디에 ?

  • 할인 쿠폰 발급은 Coupon 도메인에서 담당한다.
    + 할인 쿠폰 발급은 Coupon 도메인에서 담당한다.
    + 할인 쿠폰 생성 시 Coupon 과 Customer 가 null 이 아니어야 한다.
    + 할인 쿠폰 만료일이 발급일보다 이전이여야한다.
    + 할인 쿠폰의 수량이 0일 때 발급 받을 수 없다.

✅ 셀프 체크리스트

  • 내 코드를 스스로 검토했습니다.
  • 필요한 테스트를 추가했습니다.
  • 모든 테스트를 통과합니다.
  • 브랜치 전략에 맞는 브랜치에 PR을 올리고 있습니다.
  • 커밋 메세지를 컨벤션에 맞추었습니다.
  • wiki를 수정했습니다.

- CouponIssuanceTest.testConstruct: CouponIssuance 생성자 테스트
- CouponIssuance: Customer와 Coupon 을 갖는다. 또한, 발급일, 사용일을 기록한다.
- 잘못된 Exception 상속 수정
- CouponIssuanceTest.testConstructWithNullCoupon: Coupon 이 Null 인 경우 예외 처리
- CouponIssuanceTest.testConstructWithNullCustomer: Customer 가 Null 인 경우 예외 처리
- CouponIssuanceTest.testConstructWithExpiredCoupon: 만료된 쿠폰인 경우 예외 처리
- CouponErrorCode.EXPIRED_COUPON: 만료된 쿠폰 에러
- NullPointException 이 아닌 InvalidICreationIssuanceException 을 던지도록 변경
- CouponIssuanceErrorCode 를 사용하도록 변경
- CouponIssuance 생성 시 Customer 와 Coupon 의 NUll 여부 확인 및 Coupon 만료일이 발급일 전인지  확인
- Coupon.isExpired: 쿠폰 만료 상태 확인 메소드
- CouponIssuance 생성 시 Null 값 과 쿠폰 만료 상태 검증
- Coupon 에서는 쿠폰이 만료되었더라도 에러를 발생할 이유가 없어 에러 소유를 CouponIssuance 로 넘김
- 만료일 테스트를 위해 수동으로 바꿀 수 있도록 변경
- CouponIssuanceTest.testConstructWithExpiredCoupon 에서 Coupon 이 정상적으로 생성된 후 만료되는 시나리오로 변경
- JpaRepository 기본 키 수정
- IssueCouponServiceTest.testIssueCoupon: 쿠폰 발급 검증 테스트
- test를 위해 사용할 Customer
- test를 위해 사용할 CouponIssuance
- CustomerFixture.createCustomer(UUID): 기본 설정에 id 값만 바뀌는 customer 생성 메소드
- CouponIssuanceFixture.createCouponIssuance: 테스트에서 사용할 CouponIssuance 생성
- IssueCouponService.issueCoupon: 구매자에게 쿠폰을 발행
- IssueCouponServiceTest.testIssueCouponFailWithNotExistCustomer: 사용자가 존재하지 않는 요청 검증 테스트
- IssueCouponServiceTest.testIssueCouponFailWithNotExistCoupon: 쿠폰이 존재하지 않는 요청 검증 테스트
- IssueCouponServiceTest.testIssueCouponFailWithExpiredCoupon: 만료된 쿠폰을 발행하는 요청 검증 테스트
- IssueCouponService.issueCoupon 에 ExpiredCouponException 발생 명시
- IssueCouponServiceTest.testIssueCouponFailWithInsufficientCouponQuantity: 수량 부족 시나리오 검증 테스트
- 테스트를 위해 커스텀 할 수 있도록 수정
- IssueCouponServiceIntegrationTest.testIssueCoupon: 쿠폰 발급 성공 검증 테스트
- IssueCouponServiceIntegrationTest.testIssueCouponFailWithInsufficientQuantity: 쿠폰 수량 부족 실패 검증 테스트
- IssueCouponServiceIntegrationTest.testIssueCouponWithConcurrency: 동시성 제어 검증 테스트
- CouponFixture.createCoupon(String, int, int, LocalDateTime): Coupon Entity 를 생성하는 메서드
- CouponRepository.findByIdWithPessimisticLock: 비관적 락 적용 조회 쿼리
- 쿠폰 조회 시 CouponRepository.findByIdWithPessimisticLock 사용하도록 변경
- `@DisplayName` 수정: 쿠폰 발급 -> 쿠폰 등록
- CouponApiControllerTest.testIssueCoupon: 조건 명시적으로 등록
- CouponApiControllerTest.testIssueCoupon: 쿠폰 발급 요청 검증 테스트
- session 등록 시 SessionConst.SESSION_CUSTOMER_KEY 사용하도록 수정
- 응답 코드 CREATED 로 변경
- CouponApiController.issueCoupon: 쿠폰 발급 API
- InsufficientCouponQuantityException message 수정
- IssueCouponService.issueCoupon throws 주석 오류 수정
- CouponApiControllerTest.testIssueCouponFailWithoutSession: 세션 없이 쿠폰 발급 요청 검증 테스트
- CouponApiControllerTest.testIssueCouponFailWithNotExistsId: 존재하지 않는 쿠폰 또는 구매자 쿠폰 발급 요청 검증 테스트
- CouponApiControllerTest.testIssueCouponFailWithExpiredCoupon: 만료된 쿠폰 발급 요청 검증 테스트
- CouponApiControllerTest.testIssueCouponFailWithInsufficientQuantity: 수량이 부족한 쿠폰 발급 요청 검증 테스트
-  InvalidICreationIssuanceException, ExpiredCouponException 에 대한 예외 핸들링 추가
-  비관적 락 적용에 따른 테스트 코드 수정
@kimhyun5u kimhyun5u added the ✨ Feature 기능 개발 label Aug 15, 2024
@kimhyun5u kimhyun5u added this to the 프로토타입 만들기 milestone Aug 15, 2024
@kimhyun5u kimhyun5u self-assigned this Aug 15, 2024
@kimhyun5u kimhyun5u linked an issue Aug 15, 2024 that may be closed by this pull request
Copy link
Contributor

@Hyeon-Uk Hyeon-Uk left a comment

Choose a reason for hiding this comment

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

다른 부분은 동훤님이 잘 찝어주셔서 사소한 리뷰 남기겠습니다!

- 발급 시간 변경 제한

Co-authored-by: 김현욱 <43038815+Hyeon-Uk@users.noreply.github.com>
Copy link
Contributor

@Hyeon-Uk Hyeon-Uk left a comment

Choose a reason for hiding this comment

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

LGTM ! :~)

Copy link
Member

@Dr-KoKo Dr-KoKo left a comment

Choose a reason for hiding this comment

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

LGTM!

@kimhyun5u kimhyun5u merged commit c838237 into main Aug 16, 2024
1 check passed
@kimhyun5u kimhyun5u deleted the feature/75_kimhyun5u_할인-쿠폰-발급 branch August 16, 2024 03:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
✨ Feature 기능 개발
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

[기능] 할인 쿠폰 발급
3 participants