JPA 사용기

이동언·2024년 11월 13일

new world

목록 보기
61/62

11.13 (수)

JPA를 사용해봤었지만, 다시 사용을 하면서 이해가 어느정도 되었다. 하여, 정리하기위해 JPA벨로그를 작성한다. JPA는 곧 SQL과 연동이되는것이므로 나는 이번프로젝트에서 MyBatis와 JPA를 사용하는데

  • Select는 Mybatis를 사용
  • Create, Delete, Update, Insert등 JPA사용

1. Domain

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


2. Repository

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


3. search / searchImpl

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

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


4. Service

👉 jpa에서 list를 제외한 대부분이 service에서 진행이 된다.

  • insert, update - save 메소드
  • delete - deleteById 메소드

4-1. insert

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에 대한 객체를 예시로 생성하였다.

4-2. delete

    public void deleteProductDetail(Long pno) {

        productRepository.deleteById(pno);

    } // delete test

👉 매개변수로 pno값을 받아서, deleteById를 통해 값을 삭제한다.

4-3. update

    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한다.


5. Fk연계된 Entity / ManyToOne

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

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

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

0개의 댓글