코더
쿠폰 선착순 기능에 대한 고민 본문
-배경-
쿠폰기능에서 선착순쿠폰이 끝나면 다른 유저가 조회를 못하도록 기능을 구현했다.
-문제점-
그런데 이렇게 하려다 보니 couponUsed = false가 true가 되면 조회가 안되도록 구현하였는데 이 couponUsed가 UserCoupon객체에 존재하게 되어
public List<CouponResponse> findRestaurantCoupons(Long restaurantId) {
List<Coupon> coupons = couponRepository.findByRestaurantId(restaurantId);
CouponResponse의 응답값을 받는 Coupon으로는 couponUsed를 사용 할 수 없게 되었다.
그래서 생각한것이 하나의 usedCoupon2(?) 이런식으로 하나 더 만들어서 Coupon 엔티티에 넣어주자는 생각이었는데
뭔가 이러한 구조가 마음에 들지 않았다(똑같은 기능이 userCoupon에도 있고 coupon에도 있는듯한 느낌?)
그래서 생각해낸 방안이
이런 식으로 코드를 구성하는것이였다. 굳이 엔티티에 하나 더 추가해주는 방식이 아닌
couponUsed값이 false일때 downloadedCount < maxCount;를 비교해 이 조건을 만족할때만 다른 유저들도 이 선착순 쿠폰을 조회가능하게만 만들어 주었다.
위에 null값일때 0으로 값을 변경한것은
{ "httpStatus": "INTERNAL_SERVER_ERROR",
"errorMessage": "Cannot invoke \"java.lang.Integer.intValue()\"
because the return value of \"com.sparta.oishitable.domain.owner.coupon.entity.Coupon.getFirstComeCouponMaxCount()\" is null"
}
이런 오류가 발생해 원인이 firstComeCouponMaxCount가 null인 경우가 있어서 null일경우 0으로 반환해주는 코드를 추가해주었다.