web/Bakery Shop Project
쇼핑몰 구현 14 - 배송지 기능
su0a
2024. 2. 23. 21:58
1. Delivery Repository
@Repository
public interface DeliveryRepository extends JpaRepository<Delivery,Long> {
}
2. Delivery Service
@Service
@RequiredArgsConstructor
public class DeliveryService {
private final DeliveryRepository deliveryRepository;
//배송지 등록 시 유효성 검사
public BindingResult editValid(DeliveryDto dto,BindingResult bindingResult){
if(dto.getDeliveryName().isEmpty()){
bindingResult.addError(new FieldError("dto","deliveryName","배송지명이 비어있습니다."));
}
if(dto.getMemberName().isEmpty()){
bindingResult.addError(new FieldError("dto","memberName","이름이 비어있습니다."));
}
if(dto.getPhoneNumber()==null){
bindingResult.addError(new FieldError("dto","phoneNumber","전화번호가 비어있습니다."));
}
if(dto.getZipcode().isEmpty()){
bindingResult.addError(new FieldError("dto","zipcode","우편번호가 비어있습니다."));
}
return bindingResult;
}
//배송지 수정
@Transactional
public Delivery editDelivery(Member member,DeliveryDto dto){
Delivery newDelivery=DeliveryDto.toEntity(dto);
member.deliveryCreate(newDelivery);
return newDelivery;
}
//주문 배송지 생성 (회원이 배송지를 변경할 경우에도 해당 배송지 유지하기 위해)
@Transactional
public Delivery orderDelivery(Delivery delivery){
Delivery orderDelivery = Delivery.builder()
.member(delivery.getMember())
.deliveryName(delivery.getDeliveryName())
.memberName(delivery.getMemberName())
.address(delivery.getAddress())
.phoneNumber(delivery.getPhoneNumber())
.build();
deliveryRepository.save(orderDelivery);
return orderDelivery;
}
}
3. 배송지 관련 컨트롤러 - MemberController에 포함
@GetMapping("/myPage/delivery")
public String myDeliveryPage(Authentication auth, Model model){
Delivery delivery = memberService.myInfo(auth.getName()).getDelivery();
model.addAttribute("deliveryDto",DeliveryDto.of(delivery));
return "members/myDelivery";
}
@PostMapping("/myPage/delivery")
public String myDelivery(Authentication auth, Model model, @ModelAttribute DeliveryDto dto,BindingResult bindingResult){
Member loginMember = memberService.myInfo(auth.getName());
if(deliveryService.editValid(dto, bindingResult).hasErrors()){
return "members/myDelivery";
}
deliveryService.editDelivery(loginMember,dto);
model.addAttribute("message","배송지가 등록되었습니다");
model.addAttribute("nextUrl","/members/myPage");
return "printMessage";
}
4. DeliveryDto
- 배송지 확인 및 수정할 때 사용
@Data
@Builder
public class DeliveryDto {
private String zipcode;
private String streetAddress;
private String detailAddress;
private String deliveryName;
private String memberName;
private String phoneNumber;
public static DeliveryDto of(Delivery delivery){
if(delivery==null){
return DeliveryDto.builder().build();
}
return DeliveryDto.builder()
.deliveryName(delivery.getDeliveryName())
.memberName(delivery.getMemberName())
.zipcode(delivery.getAddress().getZipcode())
.streetAddress(delivery.getAddress().getStreetAddress())
.detailAddress(delivery.getAddress().getDetailAddress())
.phoneNumber(delivery.getPhoneNumber())
.build();
}
public static Delivery toEntity(DeliveryDto dto){
return Delivery.builder()
.deliveryName(dto.getDeliveryName())
.address(new Address(dto.getZipcode(), dto.getStreetAddress(), dto.getDetailAddress()))
.memberName(dto.getMemberName())
.phoneNumber(dto.getPhoneNumber())
.build();
}
}