웹/Spring vue 웹 개발

spring vue 장바구니 07

컴퓨터과학 2023. 6. 14. 22:57

이번에 jpa쪽 조인에 대해서  알게 되었는데요.
생각보다 조금 어려웠습니다. 아직 db 설계에 대해서는 많이 미숙한듯 합니다.
진짜 db를 여러번 고쳤습니다.
 
내일은 프론트단을 완성시켜 장바구니리스트를 보이도록 할겁니다.
 

p.s
현재 회사에서는 procedure를 사용해서 직접쿼리문으로 join을 했습니다. 
회사의 테이블이 엄청나게 많고 너무 복잡하다보니 db쪽에 종속되는 방향으로 개발들이 되어 있습니다. (sql mapper 방식)
제 개인프로젝트는 orm 방식으로 했고요.  상당히 많은 it 회사들이 orm 방식으로 개발해서 일단 이쪽으로 공부를 하고 있습니다.
아직 모르는게 많고 배울게 엄청나게 많다고 느끼고 있습니다.
 
장바구니 리스트를 뽑아줄 jpa

//장바구니 리스트
    public List<BasketsWithProduct> findAll(String userName,String status, int page, int size) {
        List<BasketsWithProduct> basketsList = null;
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        try{
            CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
            CriteriaQuery<BasketsWithProduct> criteriaQuery = criteriaBuilder.createQuery(BasketsWithProduct.class);

            Root<Baskets> root = criteriaQuery.from(Baskets.class);

            Join<Baskets, Product> fileJoin = root.join("product", JoinType.INNER);

            // 복합키 검색 조건 생성
            Predicate compositeKeyPredicate = criteriaBuilder.equal(root.get("basketId").get("usersId"),userName );

            // 상태 검색 조건 생성
            Predicate statusPredicate = criteriaBuilder.equal(root.get("status"), status);

            // 검색 조건 결합
            Predicate finalPredicate = criteriaBuilder.and(compositeKeyPredicate, statusPredicate);

            //검색
            criteriaQuery.select(criteriaBuilder.construct( BasketsWithProduct.class, root, fileJoin ));
            criteriaQuery.where(finalPredicate);

            TypedQuery<BasketsWithProduct> typedQuery = entityManager.createQuery(criteriaQuery);
            typedQuery.setFirstResult((page - 1) * size);
            typedQuery.setMaxResults(size);

            // 페이지 조건
            basketsList = typedQuery.getResultList();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(entityManager!=null){
                entityManager.close();
            }
        }
        return basketsList;
    }

BasketsWithProduct 객체

@Getter
@Setter
public class BasketsWithProduct {
   private Baskets baskets;
   private Product product;
   public BasketsWithProduct(Baskets baskets, Product product) {
      this.baskets = baskets;
      this.product = product;
   }
}

Basket 테이블 

@Entity
@Table(name = "Baskets")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Baskets {

    @EmbeddedId
    private BasketId basketId;

    //status 장바구니 B, 삭제 D, 결재 C
    @NotEmpty
    @Column(name = "STATUS")
    private String status;

    //produtnumber + userid
    @NotNull
    @Column(name = "BIND_NUMBER")
    private String bindNumber;

    @ManyToOne
    @JoinColumn(name = "product_id", referencedColumnName = "ID")
    private Product product;

}

Product 테이블 

@Entity
@Getter
@Table(name = "PRODUCT")
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Product {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PRODUCT_SEQ")
    @SequenceGenerator(name = "PRODUCT_SEQ", sequenceName = "PRODUCT_SEQ", allocationSize = 1)
    @Column(name = "ID")
    private Long id; //key
    
    @NotEmpty
    @Setter
    @Column(name = "PRODUCT_NAME")
    private String productName;

    @NotNull
    @Setter
    private BigDecimal price;

    @NotEmpty
    @Setter
    @Column(name = "IMAGE_URL")
    private String imageUrl;

    @NotEmpty
    @Setter
    @Column(name = "VIDEO_URL")
    private String videoUrl;

    @NotNull
    @Setter
    @Column(name = "DESCRIPTION")
    private String description;
}