👉 도메인은 vo와 dto같은 느낌으로 실제 sql을 사용해서 create table이 되도록 만드는 구조이다.

👉 repository는 현재는 별내용이 없지만, repository안에 search, searchimpl이 중요하고 @query 문을 다이렉트로 작성하는 JPQL이라한다. JPQL은 Mybatis의 느낌을 생각하면 좋다.

👉 search는 MyBatis 의 mapper에서 먼저 메소드를 선언한다고 생각하면 된다.
👉 여기서 중요한점은 jpa에서 사용되는 모든 코드를 search에 정의하는것이 아니고, impl에 작성될 쿼리만 정의해야하는것이다.

👉 impl은 대부분 List에 대한 select같은 join의 내용이 들어가는 애들위주로 사용한다.

👉 jpa에서 list를 제외한 대부분이 service에서 진행이 된다.
public void saveProductDetail() {
Product product = Product.builder()
.pcategory_ko("demo")
.price(3000)
.ptitle_ko("cookie")
.pcontent_ko("ddd")
.build();
productRepository.save(product);
} // register test
👉 Product에 대한 객체를 예시로 생성하였다.
public void deleteProductDetail(Long pno) {
productRepository.deleteById(pno);
} // delete test
👉 매개변수로 pno값을 받아서, deleteById를 통해 값을 삭제한다.
public void updateProductDetail(Long pno, int price) {
Product product = productRepository.findById(pno).orElseThrow();
product.setPrice(price);
productRepository.save(product);
} // update test
👉 product의 id인 pno값을 찾고, 없으면 orElseThrow를 통해 optional 형태로 사용하고,
setPrice를 사용하여 가격변경후 save로 insert한다.

👉 현재 테이블 구조는 이러한 상태이다. cart table이 uno, pno를 fk로 사용하고있는중인데, cart에서 유저정보와 상품정보를 가져와야하기 떄문

👉 그렇다면 엔티티 설계를 해당내용처럼 설계를 해줘야 한다. ToString을 통해서 쿼리반복을 제어해주고, JoinColumn은 이름을 정확히 명명해주는데 이렇게 하지 않으면, 나중에 product의 pno를 사용하는 쿼리문을 java에서 만들때 product_pno를 사용하려면서 존재하지 않는 컬럼이라고 오류가 발생한다.

👉 service에서는 product와 user를 객체로 생성해줘서 cart에 객체로 넣어 cart객체를 만들어주고 이후에는 insert, update와 비슷하게 만들어준다.