public List<CouponDTO> findAllByCompany(String company) {
List<Coupon> couponList = couponRepository.findValidCouponsByCompanyOrAdmin(company, LocalDate.now());
return couponList.stream()
.map(coupon -> modelMapper.map(coupon, CouponDTO.class))
.collect(Collectors.toList());
}
기술 설명
- findAllByCompany(String company):
couponRepository.findValidCouponsByCompanyOrAdmin(company, LocalDate.now())호출하여
- 해당
company별로 발행된 쿠폰 중- 현재 날짜(
LocalDate.now()) 기준으로 유효 기간(validTo)을 아직 지나지 않은 쿠폰만 조회.- 또는
"관리자"발급 쿠폰도 함께 가져옴.- 조회된
List<Coupon>을 스트림으로 순회하며
ModelMapper를 사용해Coupon엔티티를CouponDTO로 매핑.- 최종적으로
List<CouponDTO>를 반환.
public int couponIssue(List<Long> cnoList, UserDetails userDetails) {
User user = User.builder()
.uid(userDetails.getUsername())
.build();
int successCount = 0;
for (Long cno : cnoList) {
Optional<Coupon> optionalCoupon = couponRepository.findById(cno);
// 존재하지 않는 쿠폰 번호는 무시
if (optionalCoupon.isEmpty()) {
continue;
}
Coupon coupon = optionalCoupon.get();
// 이미 발급된 쿠폰인지 확인
boolean exist = couponIssueRepository.existsByUserAndCoupon(user, coupon);
if (exist) {
// 이미 발급된 경우에도 성공 카운트만 증가시키고 다음으로
successCount++;
continue;
}
try {
// 새로운 CouponIssue 엔티티 생성 및 저장
CouponIssue couponIssue = CouponIssue.builder()
.user(user)
.coupon(coupon)
.regDate(LocalDate.now())
.issuedBy(coupon.getIssuedBy())
.validTo(String.valueOf(coupon.getValidTo()))
.build();
couponIssueRepository.save(couponIssue);
successCount++;
} catch (Exception e) {
log.error(e.getMessage());
}
}
return successCount;
}
기술 설명
- couponIssue(List cnoList, UserDetails userDetails):
- User 객체 생성
User.builder().uid(userDetails.getUsername()).build()을 통해
- 로그인된 사용자의
uid를 가진User엔티티 최소값 객체 생성- 실제로는
uid만 셋팅된 상태이므로, JPA 조회없이 관계 매핑 용도로 사용.- 성공 카운트 초기화:
int successCount = 0;- 쿠폰 번호 목록 순회 (
for (Long cno : cnoList))
엔티티 조회
Optional<Coupon> optionalCoupon = couponRepository.findById(cno); if (optionalCoupon.isEmpty()) continue; Coupon coupon = optionalCoupon.get();
couponRepository.findById(cno)호출하여 해당 ID의Coupon엔티티 조회.- 쿠폰이 없으면
continue로 넘어가며, 카운트는 증가시키지 않음.중복 발급 체크
boolean exist = couponIssueRepository.existsByUserAndCoupon(user, coupon); if (exist) { successCount++; continue; }
couponIssueRepository.existsByUserAndCoupon(user, coupon)호출하여
- 해당 사용자(
User.uid)와 쿠폰(Coupon) 조합이 이미 발급되었는지 확인.- 이미 발급된 경우(
exist == true), 성공 카운트(successCount++)만 증가시키고 다음 쿠폰으로 건너뜀.신규 발급 처리
CouponIssue couponIssue = CouponIssue.builder() .user(user) .coupon(coupon) .regDate(LocalDate.now()) .issuedBy(coupon.getIssuedBy()) .validTo(String.valueOf(coupon.getValidTo())) .build(); couponIssueRepository.save(couponIssue); successCount++;
CouponIssue.builder()를 사용해 새CouponIssue엔티티 생성:
user: 앞서 생성한 최소User엔티티 (uid만 세팅)coupon: 조회된Coupon엔티티regDate: 현재 날짜(LocalDate.now())issuedBy: 원본Coupon엔티티의issuedBy필드 복사validTo: 원본Coupon엔티티의 만료일(LocalDate)을 문자열로 변환해 저장couponIssueRepository.save(couponIssue)실행하여 DB에 신규 발급 정보 저장.- 저장 성공 시
successCount++.예외 처리
- 저장 과정에서 예외가 발생하면
log.error(e.getMessage())로 에러 메시지 기록.- 해당 쿠폰은 성공으로 간주하지 않음(카운트 미증가).
- 반환:
- 루프 종료 후
successCount반환.- 반환값은 “성공적으로 발급 혹은 이미 발급 처리된 쿠폰 수”이며, 클라이언트에는 이 값을 통해 결과를 알림.