Spring/Spring Data JPA
-
Spring Data JPA - 페이징과 정렬Spring/Spring Data JPA 2022. 3. 21. 14:26
페이징과 정렬 페이징과 정렬 파라미터로 Pageable을 받을 수 있다. Pageable은 인터페이스, 실제로는 PageRequest 구현체가 생성된다. 요청 파라미터 - page : 현재 페이지, 0부터 시작 - size : 한 페이지에 노출할 데이터 건수 - sort : 정렬 조건을 정의 예시 : /members?page=0&size=3&sort=id,desc&sort=username,desc @GetMapping("/members") public Page list(Pageable pageable) { Page page = memberRepository.findAll(pageable); return page; } @Qualifier 페이징 정보가 둘 이상인 경우 사용 @Qualifier에 접두사명 추..
-
Spring Data JPA - 도메인 클래스 컨버터Spring/Spring Data JPA 2022. 3. 21. 11:46
도메인 클래스 컨버터 Spring이 내부적으로 HTTP 파라미터로 엔티티의 PK가 넘어오면 엔티티 객체를 찾아서 바인딩해준다. 도메인 클래스 컨버터를 사용하기 전 @RestController @RequiredArgsConstructor public class MemberController { private final MemberRepository memberRepository; @GetMapping("/members/{id}") public String findMember(@PathVariable("id") Long id) { Member member = memberRepository.findById(id).get(); return member.getUsername(); } } 도메인 클래스 컨버터 사용..
-
Spring Data JPA - 엔티티의 생성, 변경한 사람과 시간을 추적(Auditing)Spring/Spring Data JPA 2022. 3. 21. 11:34
엔티티의 생성, 변경한 사람과 시간을 추적(Auditing) 기본적으로 운영할 때는 등록일, 수정일, 등록자, 수정자를 모든 테이블에 적용하는 것이 좋다. 누가 등록했고, 누가 수정했는지 추적하기가 쉽다. 유지보수에 용이 순수 JPA 사용의 Auditing @MappedSuperclass : 해당 필드들을 사용할 수 있도록 맵핑해주는 어노테이션 @PrePersist : 저장할 때 이벤트 실행 @PreUpdate : 수정할 때 이벤트 실행 1. 모든 Entity에 적용하는 공통 Entity 생성 @MappedSuperclass @Getter public class JpaBaseEntity { @Column(updatable = false) private LocalDateTime createdDate; pr..
-
Spring Data JPA - 사용자 정의 리포지토리 구현Spring/Spring Data JPA 2022. 3. 21. 10:47
사용자 정의 리포지토리 구현 Spring Data JPA에서 제공하는 JpaRepository 인터페이스는 스프링이 구현체를 자동으로 생성해준다. Spring Data JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 메서드들이 너무 많다. 사용자 정의 리포지토리 구현 - JpaRepository의 메서드들을 오버라이드 안 해도 된다. 인터페이스의 메서드를 직접 구현 - 사용자 정의 리포지토리 사용 - JPA 직접 사용 - 스프링 JDBC Template 사용 - MyBatis 사용 - 데이터베이스 커넥션 직접 사용 등 - Querydsl 사용 사용자 정의 리포지토리 구현 1. 사용자 정의 인터페이스 생성 public interface MemberRepositoryCustom { List fin..
-
Spring Data JPA - @EntityGraphSpring/Spring Data JPA 2022. 3. 20. 19:51
@EntityGraph @EntityGraph를 이용하여 연관된 엔티티들을 SQL 한번에 조회할 수 있다. 주 엔티티에서 연관 관계를 맺고 있는 엔티티를 fetch join 해준다. JPQL fetch join @Query("select m from Member m left join fetch m.team") List findMemberFetchJoin(); @EntityGraph @EntityGraph는 fetch join을 간단하게 쓸 수 있는 방법이다. LEFT OUTER JOIN 사용 //공통 메서드 오버라이드 @Override @EntityGraph(attributePaths = {"team"}) List findAll(); //JPQL + 엔티티 그래프 @EntityGraph(attribute..
-
Spring Data JPA - 벌크성 수정 쿼리Spring/Spring Data JPA 2022. 3. 20. 19:46
벌크성 수정 쿼리 벌크성 수정, 삭제 쿼리는 @Modifying 어노테이션을 사용한다 @Modifying 어노테이션을 사용하지 않으면 QueryExcutionRequestException 발생 벌크성 쿼리를 실행한 이후 영속성 컨텍스트 초기화해줘야 한다 @Modifying(clearAutomatically = true), default는 false이므로 설정해줘야 한다. 주의! : 벌크 연산은 영속성 컨텍스트를 무시하고 실행하기 때문에, 영속성 컨텍스트에 있는 엔티티의 상태와 DB에서의 엔티티 상태가 달라질 수 있다. 따라서 꼭 벌크 연산이후 영속성 컨텍스트 초기화 해주자 순수 JPA의 벌크성 수정 쿼리 public int bulkAgePlus(int age) { int resultCount = em.c..
-
Spring Data JPA - 페이징과 정렬Spring/Spring Data JPA 2022. 3. 20. 18:43
페이징과 정렬 순수 JPA 페이징과 정렬 스프링 데이터 JPA 페이징과 정렬 순수 JPA의 페이징과 정렬 public List findByPage(int age, int offset, int limit) { return em.createQuery("select m from Member m where m.age = :age order by m.username desc", Member.class) .setParameter("age", age) .setFirstResult(offset) .setMaxResults(limit) .getResultList(); } public long totalCount(int age) { return em.createQuery("select count(m) from Member..
-
Spring Data JPA - 쿼리 메서드 사용과 @QuerySpring/Spring Data JPA 2022. 3. 19. 20:29
Spring Data JPA에서 제공하는 공통 인터페이스는 우리가 기본적으로 사용하는 CRUD를 제공해준다. 즉, 순수하게 JPA를 이용한 Repository 클래스를 생성하여 CRUD 메서드들을 작성해왔던 번거로운 작업들을 Spring Data JPA에서 제공하는 공통 인터페이스인 JpaRepository를 이용하면 대신 구현 클래스를 생성해줘서 기본적인 CRUD를 작성하지 않아도 된다. JpaRepository의 상속 관계는 다음과 같다. 주요 메서드 메서드 주요 메서드 설명 save(S entity) 새로운 엔티티는 저장하고 이미 있는 엔티티는 병합 void delete(T entity) 엔티티 하나를 삭제한다. EntityManager.remove() 호출 Optional findById(ID i..