JPA 핵심 : Persistence 클래스

 

EntityManager에서 제공하는 API 사용

 

ex)

@Repository
@RequiredArgsConstructor
public class OrderRepository {

    private final EntityManager em;

    public void save(Order order){
        em.persist(order);
    }

    public Order findOne(Long id){
        return em.find(Order.class, id);
    }

    public List<Order> findAll() {
        return em.createQuery("select o from Order o", Order.class)
                .getResultList();
    }
    
    public List<Order> findAllWithItem() {
        return em.createQuery(
                "select distinct o from Order o" +
                        " join fetch o.member m" +
                        " join fetch o.delivery d" +
                        " join fetch o.orderItems oi" +
                        " join fetch oi.item i", Order.class)
                .getResultList();
    }
}

 

위의 OrderRepository는 Spring Data Jpa가 제공하는 JpaRepository를 상속하지 않고 

@Repository만 활용하여 EntityManager가 제공하는 API를 활용하여 CRUD 구현

 

 

Hibernate ??

JPA의 구현체 중 하나

 

 

Hibernate의 SessionFactory, Session, Transaction 을 살펴보면, 

JPA 인터페이스인 EntityManagerFactory, EntityManager, EntityTransaction을 상속받아 구현되어 있음

 

 

 

 

 

Spring Data Jpa

Spring에서 제공하는 모듈 중 하나

개발자가 JPA를 더 쉽고 편하게 사용할 수 있도록 도와주는 라이브러리

JPA를 추상화 시킨 Repository 인터페이스를 제공하여 개발자가 JPA를 더 편하게 사용할 수 있게 하는 모듈

사용자가 Repository 인터페이스에 정해진 규칙대로 메소드 입력 시,

Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어 Bean 으로 등록

 

Spring Data Jpa 사용하지 않는다면, 클래스에 @Repository 어노테이션 작성, EntityManager의 API를 직접 호출해야 함

 

Spring Data Jpa 사용 시, JpaRepository 인터페이스를 상속받아 메소드 명으로만 CRUD 구현 가능

 

 

JpaRepository 메소드 작성 예시

public interface AccountRepository extends JpaRepository<Account, Long> {

    boolean existsByUsername(String username);

    Optional<Account> findById(Long id);

    Optional<Account> findByUsername(String username);

    Optional<Account> findByUsernameAndPassword(String username, String password);
}

 

Repository 인터페이스에 정해진 규칙대로 메소드 입력 시, 해당 메소드에 적합한 JPQL 생성해 처리

 

** 상세한 메소드 명명규칙 참고

https://docs.spring.io/spring-data/jpa/docs/1.10.1.RELEASE/reference/html/#jpa.sample-app.finders.strategies

 

Spring Data JPA - Reference Documentation

Example 11. Repository definitions using Domain Classes with mixed Annotations interface JpaPersonRepository extends Repository { … } interface MongoDBPersonRepository extends Repository { … } @Entity @Document public class Person { … } This example

docs.spring.io

https://docs.spring.io/spring-data/jpa/docs/2.4.3/reference/html/#jpa.query-methods.query-creation

 

Spring Data JPA - Reference Documentation

Example 109. Using @Transactional at query methods @Transactional(readOnly = true) public interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") v

docs.spring.io

 

 

 

 

------------------------------------------------------------------------------------------------------------------------------

 

요약하자면

Jpa 활용하기 위해서는 Persistence 의 API (EntityManager), Hibernate와 같은 구현체 활용

 

Spring Data Jpa는 Jpa를 사용하기 쉽게 미리 구현된 인터페이스 (JpaRepository)를 제공

JpaRepository 상속받은 클래스는 메소드 명으로 CRUD 구현 가능

 

'끄적 > BE' 카테고리의 다른 글

Persistence Context (영속성 컨텍스트)  (0) 2023.01.01
Spring MVC  (0) 2022.12.29
JPA  (0) 2022.12.28
Token을 사용한 로그인 인증  (0) 2022.12.28
JWT  (0) 2022.12.28

+ Recent posts