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();
    }
}