WindsomeProject - 배송지 관리 기능 추가

박민수·2024년 3월 19일
0

WindsomeProject

목록 보기
21/32
post-thumbnail

개요

해당 포스팅에서는 배송지 관리 기능을 구현한 과정에 대해 간략하게 정리해 보고자 한다.

Entity 추가

이전에는 회원 테이블에 배송지가 하나만 등록되어 있었다. 하지만 주문할 때 배송지가 자주 변경될 수 있기 때문에, 여러 배송지를 저장할 수 있도록 별도의 Address 테이블을 추가했다.
Address 테이블은 Member 테이블과 N:1 연관 관계를 맺어, 한 명의 회원이 여러 주소를 가질 수 있도록 했다.
이렇게 함으로써 사용자는 상품을 주문할 때, 회원의 모든 배송지 목록을 가져와서 원하는 배송지를 선택할 수 있다.

@Entity
public class Address extends BaseTimeEntity {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "address_id")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id")
    private Member member;

    private String name;  // 받는분 성함

    private String zipcode; // 우편 번호

    private String addr; // 받는분 주소

    private String addrDetail; // 받는분 상세 주소

    private String tel; // 받는분 전화 번호

    private String req; // 배송 메시지

    private boolean isDefault; // 기본 배송지 여부
}

요구사항 정리

  • 사용자가 회원가입할 때 입력한 주소지가 기본 배송지로 자동 설정된다.
  • "최근 배송지" 탭에는 사용자가 "기본 배송지"로 설정한 배송지가 표시된다.
  • 상품을 주문할 때 "직접 입력" 탭에서 배송지를 직접 입력하고, "기본 배송지로 저장"에 체크한 후 주문을 하면 배송지가 추가된다.
  • "최근 배송지" 탭에서 배송지 목록을 조회하고, 원하는 배송지를 선택할 수 있다.
  • "최근 배송지" 탭에서 원하는 배송지를 선택하여 주문한 경우 해당 배송지가 기본 배송지로 설정된다.
  • "배송지 편집" 모드를 실행하여, 배송지를 삭제할 수 있다.

MemberService.java

/**
 * 회원 가입
 */
public void createAccount(SignUpRequestDTO signUpRequestDTO) {
    Member member = modelMapper.map(signUpRequestDTO, Member.class);
    member.setPassword(passwordEncoder.encode(signUpRequestDTO.getPassword()));
    member.setRole(Role.USER);
    addressRepository.save(signUpRequestDTO.toAddress(member, signUpRequestDTO));
    memberRepository.save(member);
}

OrderService.java

/**
 * 주문서 작성 화면 - 회원 기본 배송지 조회
 */
public Address getDefaultShippingAddress(Long memberId) {
    return addressService.getAddressByMemberIdAndIsDefault(memberId, true);
}

/**
 * 주문서 작성 화면 - 회원 배송지 목록 조회
 */
public List<Address> getAddressList(Long memberId) {
    return addressService.getAllAddressByMemberId(memberId);
}

/**
 * 상품 주문
 */
public Long order(OrderRequestDTO orderRequestDTO, Long memberId) {
    // 생략
    
    // 회원 배송지 관련 정보 업데이트
    if (orderRequestDTO.isDefault()) {
        // 기존의 주소 목록 가져오기
        List<Address> existingAddresses = addressService.getAllAddressByMemberId(member.getId());
    
        // 기본 배송지 모두 false로 초기화
        existingAddresses.forEach(address -> {
            address.setDefault(false);
            addressService.saveAddress(address); // 기존 주소의 default 값을 변경한 후 저장
        });
    
        // 새로운 배송지 생성
        Address newAddress = OrderRequestDTO.toAddress(member, orderRequestDTO);
    
        // 새로운 배송지와 일치하는 기존 주소가 있는지 확인
        boolean isDuplicate = existingAddresses.stream().anyMatch(address -> address.equals(newAddress));
    
        // 중복되는 주소가 없는 경우 배송지 추가
        if (!isDuplicate) {
            // 새로운 배송지 추가
            addressService.saveAddress(newAddress);
        } else {
            // 기존의 주소와 동일한 경우 isDefault 값을 true로 변경
            existingAddresses.stream()
                    .filter(existingAddress -> existingAddress.equals(newAddress))
                    .findFirst()
                    .ifPresent(existingAddress -> {
                        existingAddress.setDefault(true);
                        existingAddress.setReq(orderRequestDTO.getReq());
                        addressService.saveAddress(existingAddress);
                    });
        }
    }
    
    // 생략
}

실제 구현 모습

  • "최근 배송지" 탭에는 사용자가 "기본 배송지"로 설정한 배송지가 표시된다.
  • "배송지 목록" 버튼을 클릭하여 배송지 목록을 확인하고 원하는 배송지를 선택할 수 있다.
  • "배송지 편집" 버튼을 클릭하여 배송지를 삭제할 수 있다.
  • "직접입력" 탭에서 배송지 입력 후 "기본 배송지로 저장"을 체크하고 주문을 하면 배송지가 추가되고 해당 배송지가 기본 배송지로 설정된다.
profile
안녕하세요 백엔드 개발자입니다.

0개의 댓글

관련 채용 정보