diff --git a/src/main/java/com/t3t/bookstoreapi/member/controller/MemberGradeController.java b/src/main/java/com/t3t/bookstoreapi/member/controller/MemberGradeController.java new file mode 100644 index 00000000..1aad7d46 --- /dev/null +++ b/src/main/java/com/t3t/bookstoreapi/member/controller/MemberGradeController.java @@ -0,0 +1,86 @@ +package com.t3t.bookstoreapi.member.controller; + +import com.t3t.bookstoreapi.member.model.dto.MemberGradeDto; +import com.t3t.bookstoreapi.member.model.dto.MemberGradePolicyDto; +import com.t3t.bookstoreapi.member.model.entity.MemberGrade; +import com.t3t.bookstoreapi.member.model.request.CreateMemberGradePolicyRequest; +import com.t3t.bookstoreapi.member.model.request.MemberGradeCreationRequest; +import com.t3t.bookstoreapi.member.model.response.MemberGradePolicyResponse; +import com.t3t.bookstoreapi.member.service.MemberGradeService; +import com.t3t.bookstoreapi.model.response.BaseResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.math.BigDecimal; +import java.util.List; + +@RestController +@RequiredArgsConstructor +public class MemberGradeController { + private final MemberGradeService memberGradeService; + @GetMapping("/admin/member-grades") + public ResponseEntity>> getMemberGradeList() { + List memberGradePolicyList = memberGradeService.getMemberGradeList(); + return ResponseEntity.ok(new BaseResponse>().data(memberGradePolicyList)); + } + + /** + * 특정 ID를 기반으로 한 회원 등급 정책 조회 + * @param policyId 조회할 회원 등급 정책의 ID + * @return 조회된 회원 등급 정책을 포함한 BaseResponse 객체 반환 + * + * @author hydrationn(박수화) + */ + @GetMapping("/admin/member-grade-policies/{policyId}") + public ResponseEntity> getMemberGrade(@PathVariable("policyId") Long policyId) { + MemberGradeDto memberGrade = memberGradeService.getMemberGrade(policyId); + return ResponseEntity.ok(new BaseResponse().data(memberGrade)); + } + + /** + * 새로운 회원 등급 정책 생성 + * @param request 생성할 회원 등급 정책의 정보를 담은 요청 객체 + * @return 생성된 회원 등급 정책을 포함한 BaseResponse 객체 반환 + * + * @author hydrationn(박수화) + */ + @PostMapping("/admin/member-grade-policy") + public ResponseEntity> createMemberGrade(@RequestBody MemberGradeCreationRequest request) { + MemberGradeDto memberGrade = memberGradeService.createMemberGrade(request); + return ResponseEntity.ok(new BaseResponse().data(memberGrade)); + } + + /** + * 기존의 회원 등급 정책 업데이트 + * @param policyId 업데이트할 회원 등급 정책의 ID + * @param startAmount 기준 시작 금액 + * @param endAmount 기준 종료 금액 + * @param rate 포인트 적립 비율 + * @return 업데이트된 회원 등급 정책을 포함한 BaseResponse 객체 반환 + * + * @author hydrationn(박수화) + */ + @PutMapping("/admin/member-grade-policy/{policyId}/default") + public ResponseEntity> updateMemberGrade(@PathVariable("policyId") Long policyId, + @RequestParam("startAmount") BigDecimal startAmount, + @RequestParam("endAmount") BigDecimal endAmount, + @RequestParam("rate") int rate) { + memberGradeService.updateMemberGrade(policyId, startAmount, endAmount, rate); + return ResponseEntity.ok(new BaseResponse().message("회원 등급 정책 업데이트 요청이 정상적으로 처리되었습니다. ")); + } + + /** + * 특정 ID를 가진 회원 등급 정책 삭제 + * @param policyId 삭제할 회원 등급 정책의 ID + * @return 삭제 성공 메시지를 포함한 BaseResponse 객체 반환 + * + * @author hydrationn(박수화) + */ + @DeleteMapping("/admin/member-grade-policy/{policyId}") + public ResponseEntity> deleteMemberGradePolicy(@PathVariable("policyId") Long policyId) { + memberGradeService.deleteMemberGrade(policyId); + return ResponseEntity.status(HttpStatus.NO_CONTENT).body(new BaseResponse().message("회원 등급 정책 삭제 요청이 성공적으로 처리되었습니다. ")); + } +} diff --git a/src/main/java/com/t3t/bookstoreapi/member/controller/MemberGradePolicyController.java b/src/main/java/com/t3t/bookstoreapi/member/controller/MemberGradePolicyController.java index 15296368..d61d6612 100644 --- a/src/main/java/com/t3t/bookstoreapi/member/controller/MemberGradePolicyController.java +++ b/src/main/java/com/t3t/bookstoreapi/member/controller/MemberGradePolicyController.java @@ -1,7 +1,7 @@ package com.t3t.bookstoreapi.member.controller; -import com.t3t.bookstoreapi.member.model.dto.MemberGradePolicyDto; import com.t3t.bookstoreapi.member.model.request.CreateMemberGradePolicyRequest; +import com.t3t.bookstoreapi.member.model.response.MemberGradePolicyResponse; import com.t3t.bookstoreapi.member.service.MemberGradePolicyService; import com.t3t.bookstoreapi.model.response.BaseResponse; import lombok.RequiredArgsConstructor; @@ -27,9 +27,9 @@ public class MemberGradePolicyController { * @author hydrationn(박수화) */ @GetMapping("/admin/member-grade-policies") - public ResponseEntity>> getMemberGradePolicyList() { - List memberGradePolicyDtoList = memberGradePolicyService.getMemberGradePolicyList(); - return ResponseEntity.ok(new BaseResponse>().data(memberGradePolicyDtoList)); + public ResponseEntity>> getMemberGradePolicyList() { + List memberGradePolicyList = memberGradePolicyService.getMemberGradePolicyList(); + return ResponseEntity.ok(new BaseResponse>().data(memberGradePolicyList)); } /** @@ -40,9 +40,9 @@ public ResponseEntity>> getMemberGradePo * @author hydrationn(박수화) */ @GetMapping("/admin/member-grade-policies/{policyId}") - public ResponseEntity> getMemberGradePolicy(@PathVariable("policyId") Long policyId) { - MemberGradePolicyDto policy = memberGradePolicyService.getMemberGradePolicy(policyId); - return ResponseEntity.ok(new BaseResponse().data(policy)); + public ResponseEntity> getMemberGradePolicy(@PathVariable("policyId") Long policyId) { + MemberGradePolicyResponse policy = memberGradePolicyService.getMemberGradePolicy(policyId); + return ResponseEntity.ok(new BaseResponse().data(policy)); } /** @@ -53,9 +53,9 @@ public ResponseEntity> getMemberGradePolicy(@ * @author hydrationn(박수화) */ @PostMapping("/admin/member-grade-policy") - public ResponseEntity> createMemberGradePolicy(@RequestBody CreateMemberGradePolicyRequest request) { - MemberGradePolicyDto createdPolicy = memberGradePolicyService.createMemberGradePolicy(request); - return ResponseEntity.ok(new BaseResponse().data(createdPolicy)); + public ResponseEntity> createMemberGradePolicy(@RequestBody CreateMemberGradePolicyRequest request) { + MemberGradePolicyResponse createdPolicy = memberGradePolicyService.createMemberGradePolicy(request); + return ResponseEntity.ok(new BaseResponse().data(createdPolicy)); } /** @@ -69,12 +69,12 @@ public ResponseEntity> createMemberGradePolic * @author hydrationn(박수화) */ @PutMapping("/admin/member-grade-policy/{policyId}/default") - public ResponseEntity> updateMemberGradePolicy(@PathVariable("policyId") Long policyId, - @RequestParam("startAmount") BigDecimal startAmount, - @RequestParam("endAmount") BigDecimal endAmount, - @RequestParam("rate") int rate) { - MemberGradePolicyDto updatedPolicy = memberGradePolicyService.updateMemberGradePolicy(policyId, startAmount, endAmount, rate); - return ResponseEntity.ok(new BaseResponse().data(updatedPolicy)); + public ResponseEntity> updateMemberGradePolicy(@PathVariable("policyId") Long policyId, + @RequestParam("startAmount") BigDecimal startAmount, + @RequestParam("endAmount") BigDecimal endAmount, + @RequestParam("rate") int rate) { + memberGradePolicyService.updateMemberGradePolicy(policyId, startAmount, endAmount, rate); + return ResponseEntity.ok(new BaseResponse().message("회원 등급 정책 업데이트 요청이 정상적으로 처리되었습니다. ")); } /** @@ -85,8 +85,8 @@ public ResponseEntity> updateMemberGradePolic * @author hydrationn(박수화) */ @DeleteMapping("/admin/member-grade-policy/{policyId}") - public ResponseEntity> deleteMemberGradePolicy(@PathVariable Long policyId) { + public ResponseEntity> deleteMemberGradePolicy(@PathVariable("policyId") Long policyId) { memberGradePolicyService.deleteMemberGradePolicy(policyId); - return ResponseEntity.status(HttpStatus.NO_CONTENT).body(new BaseResponse().message("해당 회원 등급 정책이 성공적으로 삭제되었습니다.")); + return ResponseEntity.status(HttpStatus.NO_CONTENT).body(new BaseResponse().message("회원 등급 정책 삭제 요청이 성공적으로 처리되었습니다. ")); } } diff --git a/src/main/java/com/t3t/bookstoreapi/member/exception/MemberGradeNotFoundException.java b/src/main/java/com/t3t/bookstoreapi/member/exception/MemberGradeNotFoundException.java index 1d0761fe..e759f5cf 100644 --- a/src/main/java/com/t3t/bookstoreapi/member/exception/MemberGradeNotFoundException.java +++ b/src/main/java/com/t3t/bookstoreapi/member/exception/MemberGradeNotFoundException.java @@ -6,11 +6,11 @@ */ public class MemberGradeNotFoundException extends RuntimeException{ private static final String DEFAULT_MESSAGE = "존재하지 않는 회원 등급입니다."; - public MemberGradeNotFoundException() { + public MemberGradeNotFoundException(Long policyId) { super(DEFAULT_MESSAGE); } - protected MemberGradeNotFoundException(String forTarget) { + public MemberGradeNotFoundException(String forTarget) { super(String.format("%s (%s)", DEFAULT_MESSAGE, forTarget)); } } diff --git a/src/main/java/com/t3t/bookstoreapi/member/model/dto/MemberGradeDto.java b/src/main/java/com/t3t/bookstoreapi/member/model/dto/MemberGradeDto.java new file mode 100644 index 00000000..c025cc70 --- /dev/null +++ b/src/main/java/com/t3t/bookstoreapi/member/model/dto/MemberGradeDto.java @@ -0,0 +1,22 @@ +package com.t3t.bookstoreapi.member.model.dto; + +import com.t3t.bookstoreapi.member.model.entity.MemberGrade; +import com.t3t.bookstoreapi.member.model.entity.MemberGradePolicy; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class MemberGradeDto { + private int gradeId; + private String name; + private MemberGradePolicy policy; + + public static MemberGradeDto of(MemberGrade memberGrade) { + return MemberGradeDto.builder() + .gradeId(memberGrade.getGradeId()) + .name(memberGrade.getName()) + .policy(memberGrade.getPolicy()) + .build(); + } +} diff --git a/src/main/java/com/t3t/bookstoreapi/member/model/request/MemberGradeCreationRequest.java b/src/main/java/com/t3t/bookstoreapi/member/model/request/MemberGradeCreationRequest.java new file mode 100644 index 00000000..320a238b --- /dev/null +++ b/src/main/java/com/t3t/bookstoreapi/member/model/request/MemberGradeCreationRequest.java @@ -0,0 +1,18 @@ +package com.t3t.bookstoreapi.member.model.request; + +import com.t3t.bookstoreapi.member.model.entity.MemberGradePolicy; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class MemberGradeCreationRequest { + + private int gradeId; + private String name; + private MemberGradePolicy policy; +} diff --git a/src/main/java/com/t3t/bookstoreapi/member/model/response/MemberGradePolicyResponse.java b/src/main/java/com/t3t/bookstoreapi/member/model/response/MemberGradePolicyResponse.java new file mode 100644 index 00000000..58521afd --- /dev/null +++ b/src/main/java/com/t3t/bookstoreapi/member/model/response/MemberGradePolicyResponse.java @@ -0,0 +1,27 @@ +package com.t3t.bookstoreapi.member.model.response; + +import com.t3t.bookstoreapi.member.model.entity.MemberGradePolicy; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.math.BigDecimal; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MemberGradePolicyResponse { + private BigDecimal startAmount; + private BigDecimal endAmount; + private int rate; + + public static MemberGradePolicyResponse of(MemberGradePolicy memberGradePolicy) { + return MemberGradePolicyResponse.builder() + .startAmount(memberGradePolicy.getStartAmount()) + .endAmount(memberGradePolicy.getEndAmount()) + .rate(memberGradePolicy.getRate()) + .build(); + } +} diff --git a/src/main/java/com/t3t/bookstoreapi/member/model/response/MemberGradeResponse.java b/src/main/java/com/t3t/bookstoreapi/member/model/response/MemberGradeResponse.java new file mode 100644 index 00000000..8331dc21 --- /dev/null +++ b/src/main/java/com/t3t/bookstoreapi/member/model/response/MemberGradeResponse.java @@ -0,0 +1,22 @@ +package com.t3t.bookstoreapi.member.model.response; + +import com.t3t.bookstoreapi.member.model.entity.MemberGradePolicy; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.Comment; + +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MemberGradeResponse { + + private String name; + private MemberGradePolicy policy; +} diff --git a/src/main/java/com/t3t/bookstoreapi/member/repository/MemberGradePolicyRepository.java b/src/main/java/com/t3t/bookstoreapi/member/repository/MemberGradePolicyRepository.java index a9043585..0128b6d6 100644 --- a/src/main/java/com/t3t/bookstoreapi/member/repository/MemberGradePolicyRepository.java +++ b/src/main/java/com/t3t/bookstoreapi/member/repository/MemberGradePolicyRepository.java @@ -9,10 +9,10 @@ public interface MemberGradePolicyRepository extends JpaRepository { - @Query("SELECT m FROM MemberGrade m JOIN FETCH m.policy") + @Query("SELECT g.policy FROM MemberGrade m JOIN FETCH MemberGrade g") List findAll(); @Query("SELECT m FROM MemberGrade m JOIN FETCH m.policy WHERE m.policy.policyId = :policyId") - Optional findById(Long policyId); + Optional findByPolicyId(Long policyId); } diff --git a/src/main/java/com/t3t/bookstoreapi/member/repository/MemberGradeRepository.java b/src/main/java/com/t3t/bookstoreapi/member/repository/MemberGradeRepository.java index dc028641..41c14980 100644 --- a/src/main/java/com/t3t/bookstoreapi/member/repository/MemberGradeRepository.java +++ b/src/main/java/com/t3t/bookstoreapi/member/repository/MemberGradeRepository.java @@ -1,10 +1,19 @@ package com.t3t.bookstoreapi.member.repository; import com.t3t.bookstoreapi.member.model.entity.MemberGrade; +import com.t3t.bookstoreapi.member.model.entity.MemberGradePolicy; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import java.util.List; import java.util.Optional; public interface MemberGradeRepository extends JpaRepository { Optional findByName(String name); + + @Query("SELECT m.policy FROM MemberGrade m JOIN FETCH MemberGradePolicy mg WHERE m.policy.policyId = mg.policyId") + List findAll(); + + @Query("SELECT m.policy FROM MemberGrade m JOIN FETCH MemberGradePolicy mg WHERE m.policy.policyId = mg.policyId") + Optional findByPolicyId(Long policyId); } diff --git a/src/main/java/com/t3t/bookstoreapi/member/service/MemberGradePolicyService.java b/src/main/java/com/t3t/bookstoreapi/member/service/MemberGradePolicyService.java index d6812840..a053e6e3 100644 --- a/src/main/java/com/t3t/bookstoreapi/member/service/MemberGradePolicyService.java +++ b/src/main/java/com/t3t/bookstoreapi/member/service/MemberGradePolicyService.java @@ -1,9 +1,9 @@ package com.t3t.bookstoreapi.member.service; import com.t3t.bookstoreapi.member.exception.MemberGradePolicyNotFoundException; -import com.t3t.bookstoreapi.member.model.dto.MemberGradePolicyDto; import com.t3t.bookstoreapi.member.model.entity.MemberGradePolicy; import com.t3t.bookstoreapi.member.model.request.CreateMemberGradePolicyRequest; +import com.t3t.bookstoreapi.member.model.response.MemberGradePolicyResponse; import com.t3t.bookstoreapi.member.repository.MemberGradePolicyRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -27,14 +27,14 @@ public class MemberGradePolicyService { /** * 모든 회원 등급 정책 조회 * @return 등록된 모든 회원 등급 정책의 리스트 반환 - * * @author hydrationn(박수화) */ @Transactional(readOnly = true) - public List getMemberGradePolicyList() { + public List getMemberGradePolicyList() { List policies = memberGradePolicyRepository.findAll(); + return policies.stream() - .map(MemberGradePolicyDto::of) + .map(MemberGradePolicyResponse::of) .collect(Collectors.toList()); } @@ -47,8 +47,8 @@ public List getMemberGradePolicyList() { * @author hydrationn(박수화) */ @Transactional(readOnly = true) - public MemberGradePolicyDto getMemberGradePolicy(Long policyId) { - return MemberGradePolicyDto.of(memberGradePolicyRepository.findById(policyId) + public MemberGradePolicyResponse getMemberGradePolicy(Long policyId) { + return MemberGradePolicyResponse.of(memberGradePolicyRepository.findByPolicyId(policyId) .orElseThrow(() -> new MemberGradePolicyNotFoundException(policyId))); } @@ -59,14 +59,14 @@ public MemberGradePolicyDto getMemberGradePolicy(Long policyId) { * * @author hydrationn(박수화) */ - public MemberGradePolicyDto createMemberGradePolicy(CreateMemberGradePolicyRequest request) { + public MemberGradePolicyResponse createMemberGradePolicy(CreateMemberGradePolicyRequest request) { MemberGradePolicy newMemberGradePolicy = MemberGradePolicy.builder() .startAmount(request.getStartAmount()) .endAmount(request.getEndAmount()) .rate(request.getRate()) .build(); - return MemberGradePolicyDto.of(memberGradePolicyRepository.save(newMemberGradePolicy)); + return MemberGradePolicyResponse.of(memberGradePolicyRepository.save(newMemberGradePolicy)); } /** @@ -79,15 +79,13 @@ public MemberGradePolicyDto createMemberGradePolicy(CreateMemberGradePolicyReque * @return 수정된 회원 등급 정책의 DTO * @throws MemberGradePolicyNotFoundException 해당 ID의 정책을 찾을 수 없을 경우 예외 발생 */ - public MemberGradePolicyDto updateMemberGradePolicy(Long policyId, BigDecimal startAmount, BigDecimal endAmount, int rate) { - MemberGradePolicy policy = memberGradePolicyRepository.findById(policyId) + public void updateMemberGradePolicy(Long policyId, BigDecimal startAmount, BigDecimal endAmount, int rate) { + MemberGradePolicy policy = memberGradePolicyRepository.findByPolicyId(policyId) .orElseThrow(() -> new MemberGradePolicyNotFoundException(policyId)); policy.updateStartAmount(startAmount); policy.updateEndAmount(endAmount); policy.updateRate(rate); - - return MemberGradePolicyDto.of(memberGradePolicyRepository.save(policy)); } /** @@ -97,7 +95,7 @@ public MemberGradePolicyDto updateMemberGradePolicy(Long policyId, BigDecimal st * @throws MemberGradePolicyNotFoundException 해당 ID의 정책을 찾을 수 없을 경우 예외 발생 */ public void deleteMemberGradePolicy(Long policyId) { - memberGradePolicyRepository.delete(memberGradePolicyRepository.findById(policyId) + memberGradePolicyRepository.delete(memberGradePolicyRepository.findByPolicyId(policyId) .orElseThrow(() -> new MemberGradePolicyNotFoundException(policyId))); } diff --git a/src/main/java/com/t3t/bookstoreapi/member/service/MemberGradeService.java b/src/main/java/com/t3t/bookstoreapi/member/service/MemberGradeService.java new file mode 100644 index 00000000..ab6f7da6 --- /dev/null +++ b/src/main/java/com/t3t/bookstoreapi/member/service/MemberGradeService.java @@ -0,0 +1,89 @@ +package com.t3t.bookstoreapi.member.service; + +import com.t3t.bookstoreapi.member.exception.MemberGradeNotFoundException; +import com.t3t.bookstoreapi.member.exception.MemberGradePolicyNotFoundException; +import com.t3t.bookstoreapi.member.model.dto.MemberGradeDto; +import com.t3t.bookstoreapi.member.model.entity.MemberGrade; +import com.t3t.bookstoreapi.member.model.request.MemberGradeCreationRequest; +import com.t3t.bookstoreapi.member.repository.MemberGradeRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.math.BigDecimal; +import java.util.List; +import java.util.stream.Collectors; + +@Service +@Transactional +@RequiredArgsConstructor +public class MemberGradeService { + private final MemberGradeRepository memberGradeRepository; + + @Transactional(readOnly = true) + public List getMemberGradeList() { + List memberGrades = memberGradeRepository.findAll(); + + return memberGrades.stream() + .map(MemberGradeDto::of) + .collect(Collectors.toList()); + } + + /** + * 특정 ID를 가진 회원 등급 정책 조회 + * @param gradeId 조회할 회원 등급 정책 ID + * @return 조회된 회원 등급 정책 DTO + * @throws MemberGradePolicyNotFoundException 해당 ID의 정책을 찾을 수 없을 경우 예외 발생 + * + * @author hydrationn(박수화) + */ + @Transactional(readOnly = true) + public MemberGradeDto getMemberGrade(Long gradeId) { + return MemberGradeDto.of(memberGradeRepository.findByPolicyId(gradeId) + .orElseThrow(() -> new MemberGradeNotFoundException(gradeId))); + } + + /** + * 새로운 회원 등급 정책 생성 + * @param request 회원 등급 정책 생성 요청 정보 + * @return 생성된 회원 등급 정책의 DTO + * + * @author hydrationn(박수화) + */ + public MemberGradeDto createMemberGrade(MemberGradeCreationRequest request) { + MemberGrade newMemberGrade = MemberGrade.builder() + .name(request.getName()) + .policy(request.getPolicy()) + .build(); + + return MemberGradeDto.of(memberGradeRepository.save(newMemberGrade)); + } + + /** + * 기존의 회원 등급 정책 수정 + * @param policyId 수정할 회원 등급 정책의 ID + * @param startAmount 기준 시작 금액 + * @param endAmount 기준 종료 금액 + * @param rate 포인트 적립 비율 + * @return 수정된 회원 등급 정책의 DTO + * @throws MemberGradePolicyNotFoundException 해당 ID의 정책을 찾을 수 없을 경우 예외 발생 + */ + public void updateMemberGrade(Long policyId, BigDecimal startAmount, BigDecimal endAmount, int rate) { + MemberGrade policy = memberGradeRepository.findByPolicyId(policyId) + .orElseThrow(() -> new MemberGradeNotFoundException(policyId)); + + policy.getPolicy().updateStartAmount(startAmount); + policy.getPolicy().updateEndAmount(endAmount); + policy.getPolicy().updateRate(rate); + } + + /** + * 특정 ID를 가진 회원 등급 정책 삭제 + * @param policyId 삭제할 회원 등급 정책의 ID + * @throws MemberGradePolicyNotFoundException 해당 ID의 정책을 찾을 수 없을 경우 예외 발생 + */ + public void deleteMemberGrade(Long policyId) { + memberGradeRepository.delete(memberGradeRepository.findByPolicyId(policyId) + .orElseThrow(() -> new MemberGradeNotFoundException(policyId))); + } +}