본문 바로가기

Spring/JPA

(48)
[Spring Data JPA] Custom Repository 이번 장에서는 사용자 정의 리포지토리에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 있다. Spring Data JPA 리포지토리는 인터페이스만 정의하고 구현체는 Spring이 생성해준다. 만약 우리가 인터페이스를 구현하려 한다면 구현해야 하는 기능이 많다. 예를 들어 findAll()과 같이 Data JPA에서 기본으로 제공하는 메소드 또한 직접 구현을 해주어야한다. 만약 여러가지 이유 때문에 인터페이스의 일부분만 직접 구현하고 싶은 경우에 어떻게 해야하는지 알아보도록 한다. 다양한 이유가 있겠지만 필자가 참고한 강의에서 예를 들은 것과 필자의 경험에 의하면 아래 정도의 예시가 있을 듯하다. E..
[Spring Data JPA] Hint & Lock 이번 장에서는 JPA의 Hint와 Lock에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 있다. Hint DB에 적용되는 Hint가 아닌 JPA 구현체에게 제공하는 힌트이다. ReadOnly 옵션을 true로 주어 JPA에게 읽기 전용으로 조회할 것이라는 힌트를 주는 방법에 대해서 알아본다. 아래는 일반적으로 이름으로 SoccerPlayer를 조회하는 메서드와 이를 검증하는 테스트 코드이다. SoccerPlayerDataRepository public interface SoccerPlayerDataRepository extends JpaRepository { SoccerPlayer findUpda..
[Spring Data JPA] @EntityGraph 이번 장에서는 @EntityGraph 어노테이션에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 있다. 우리는 지금까지 모든 연관관계를 Lazy로 설정하였다. 이번에는 이렇게 Lazy로 설정되어있는 Entity까지 한 번에 조회하기 위해 순수 JPA의 경우 명시적으로 Fetch Join을 사용하고 Data JPA의 경우 @EntityGraph를 통해 Fetch Join을 사용해본다. 조회 대상 Entity인 SoccerPlayer 클래스는 아래와 같다. @Entity @NamedQueries(value = { @NamedQuery( name = "SoccerPlayer.findByName", que..
[Spring Data JPA] Bulk 이번 장에서는 벌크성 쿼리에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 있다. 순수 JPA의 벌크성 쿼리 SoccerPlayerPureRepository @Repository public class SoccerPlayerPureRepository { @PersistenceContext private EntityManager entityManager; public int bulkUpdate(int height) { return entityManager.createQuery( "UPDATE SoccerPlayer SP SET SP.weight = SP.weight + 10 " + "WHERE SP...
[Spring Data JPA] Paging 이번 장에서는 NamedQuery에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 있다. 순수 JPA 기반의 Paging SoccerPlayerPureRepository @Repository public class SoccerPlayerPureRepository { @PersistenceContext private EntityManager entityManager; public Page findAllPage(int page, int size) { int offset = size * page; List content = entityManager.createQuery( "SELECT SP " + "FR..
[Spring Data JPA] Parameter binding 이번 장에서는 Parameter 바인딩과 반환 타입에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 있다. 파라미터 바인딩 SoccerPlayerDataRepository 코드를 확인해보면 위치 기반 파라미터 바인딩과 이름 기반 바인딩이 존재한다. public interface SoccerPlayerDataRepository extends JpaRepository { @Query(value = "SELECT SP " + "FROM SoccerPlayer SP " + "WHERE " + " SP.name = ?1 " + " AND SP.height > ?2 ") List findByNameAndHei..
[Spring Data JPA] @Query 이번 장에서는 @Query 어노테이션을 사용한 조회에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 있다. NamedQuery가 Entity에 존재하였다면 @Query를 사용하여 직접 쿼리를 작성하는 방식은 @NamedQuery의 내용이 @Query 어노테이션 안으로 들어온 방식이다. SoccerPlayer가 가지는 속성은 아래와 같으며 Entity가 아닌 DTO로 조회하기위해 ResponseDTO를 추가하였다. SoccerPlayer @Entity @NamedQueries(value = { @NamedQuery( name = "SoccerPlayer.findByName", query = "SELE..
[Spring Data JPA] Named Query 이번 장에서는 NamedQuery에 대해서 알아본다. 글의 하단부에 참고한 강의와 공식문서의 경로를 첨부하였으므로 자세한 사항은 강의나 공식문서에서 확인한다. 모든 코드는 깃허브 (링크)에 있다. SoccerPlayer가 가지는 속성은 아래와 같으며 @NamedQuery 어노테이션으로 Named Query를 적용할 수 있다. @Entity @NamedQueries(value = { @NamedQuery( name = "SoccerPlayer.findByName", query = "SELECT SP FROM SoccerPlayer SP WHERE SP.name = :name"), @NamedQuery( name = "SoccerPlayer.findByHeightGreaterThan", query = "SE..