[PROJECT] 정기구독 웹서비스 5 - 장바구니 Entity, Repository

zirryo·2023년 1월 17일
0

💊 Pillivery

목록 보기
5/7

22.11.14 MON - 15 TUE (DAY 5 - 6)


💿 백엔드 업무 분담

팀원1순위2순위3순위비고
팀장(본인)장바구니, 주문리뷰, 토크마이페이지이전 프로젝트에서 게시판, 마이페이지 구현
팀원1상품(영양제)필터링위시리스트이전 프로젝트에서 예외 처리, 기타 업무
팀원2jwt 인증유저테스트 결제이전 프로젝트에서 유저 + 보안 구현
  • 팀장 : 유저 플로우와 엔티티 사이의 연관관계는 구상을 해두었으나, 장바구니 -> 주문 으로의 로직을 어떻게 구현해야 할 지 여러차례 회의 끝에도 결론이 나지 않아 팀장이 이 부분을 구현하기로 했다.
    리뷰와 토크는 게시판을 구현했었던 경험을 토대로 비교적 쉽게 구현할 수 있을 것 같아서 2순위 업무로 배정했다.

  • 팀원1 : 이전 프로젝트에서 예외 처리, 응답 객체 등을 구현했다고 하셨다.
    이번 프로젝트에서는 메인이 되는 상품 처리를 맡아보고 싶다고 하셨고 상품 CRUD 구현을 1순위 업무로 배정했다.
    상품 CRUD의 연장선인 상품 필터링위시리스트 기능을 그 다음 순위로 배정했다.

  • 팀원2 : 이전 프로젝트에서 jwt유저 CRUD, 소셜로그인 등을 다뤄보셨다고 하셔서 관련 업무를 배정했다.
    소셜 로그인을 도입하면서 외부 API를 경험해보신 적이 있다고 하셔서 테스트 결제를 그 다음 순위로 배정했다.




💿 Cart Entity

카트(장바구니)

  • 회원가입을 하면서 유저의 고유 카트가 생성됨.
  • 즉, 유저와 카트는 1:1 관계
  • 하나의 카트에 여러개의 아이템이 속할 수 있고, 하나의 아이템은 여러 카트에 속할 수 있으므로 N:N 관계
  • 테이블 설계 시, N:N 관계는 중간에 연결테이블을 추가해서 두 개의 일대다 관계를 만들어주는 것이 일반적임.

Cart, ItemCart, Item 사이의 테이블 설계

  • N:N 관계에 있는 CART 테이블과 ITEM 테이블 사이에 ITEM_CART 테이블을 이용하여 두 개의 1:N 관계 연결.
  • ITEM_CART 테이블은 ITEM 테이블의 외래키와 CART 테이블의 외래키를 가짐.

// ItemCart.java

@ManyToOne
@JoinColumn(name = "CART_ID")
private Cart cart;

@ManyToOne
@JoinColumn(name = "ITEM_ID")
private Item item;
// Cart.java

@OneToMany(mappedBy = "cart", cascade = CascadeType.PERSIST)
List<ItemCart> itemCarts = new ArrayList<>();
  • @ManyToOne 애너테이션으로 다대일의 관계를 명시.
  • @JoinColumn 애너테이션으로 ItemCart 테이블에서 외래키에 해당하는 컬럼명 작성.
  • @OneToMany 애너테이션으로 일대다 매핑을 추가해 양방향 관계 매핑.

🔗 전체 코드




💿 Cart Repository

Repository(리포지토리)
데이터 액세스 계층에서 데이터베이스와 상호작용하는 역할을 하는 인터페이스

// CartRepository.java

public interface CartRepository extends JpaRepository<Cart, Long> {

    Cart findByUser(User user);
}
// Cart.java

@Entity
public class Cart {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long cartId;

    ...
    ...
}
  • JpaRepository 인터페이스를 확장하여 편리하게 데이터를 데이터베이스의 테이블에 저장, 조회, 수정, 삭제할 수 있음.
  • JpaRepository<Cart, Long> 에서 Cart는 Cart 엔티티 클래스를 가르키며, Long은 엔티티 클래스에서 @Id 애너테이션이 붙은 멤버 변수의 타입을 가르킴.
  • findByUser(User user); : Spring Data JPA 에서 지원하는 쿼리 메서드(Query Method)를 이용한 데이터 조회 메서드 정의.
  • 메서드에서 사용하는 컬럼명은 내부적으로는 테이블의 컬럼명으로 변경되지만 Spring JPA 입장에서는 엔티티 클래스를 바라보고 작업을 하기 때문에 반드시 엔티티 클래스의 멤버 변수명을 적어주어야 함.

// ItemCartRepository.java

public interface ItemCartRepository extends JpaRepository<ItemCart, Long> {

	ItemCart findByCartAndItemAndSubscription(Cart cart, Item item, boolean subscription);

	List<ItemCart> findAllByCartAndSubscription(Cart cart, boolean subscription);

	List<ItemCart> findAllByCartAndSubscriptionAndBuyNow(Cart cart, boolean subscription, boolean buyNow);
} 

ItemCartRepository 인터페이스의 구조는 CartRepository 와 유사함.

  • findByCartAndItemAndSubscription
    • 유저의 장바구니에 해당 아이템이 이미 담겨있는 지 확인하는 메서드
    • 해당 물건이 없을 경우 새로운 ItemCart를 생성하고, 이미 담겨있는 물건이라면 수량만 더하기 위함.
    • subscription 은 특정 객체의 일반 / 정기배송 여부를 구분하는 변수 ( boolean )
  • findAllByCartAndSubscription
    • 유저의 장바구니 목록을 불러오는 메서드
    • subscription 으로 일반 / 정기배송 장바구니 구분하여 조회
  • findAllByCartAndSubscriptionAndBuyNow
    • 유저의 장바구니 목록 중에서 선택된 아이템만을 불러오는 메서드 (buyNow == true)
    • 장바구니에서 선택 / 선택해제 토글을 통해 이번 주문 포함 여부를 선택할 수 있음.
    • subscription 으로 일반 / 정기배송 장바구니 구분하여 조회
    • 구매 예정 금액 합계, 주문 목록 생성을 위해 메서드가 사용됨.

      buynow = true : 선택된 상태
      buynow = false : 선택 해제된 상태

🔗 전체 코드



0개의 댓글