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 생성해 처리
** 상세한 메소드 명명규칙 참고
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 |