본문 바로가기

JPA 실전

(7)
[JPA] JPA 실전 - 분석 스프링 데이터 JPA 구현체 분석스프링 데이터 JPA는 공통 인터페이스의 구현체로 SimpleJpaRepository를 제공합니다. 이 클래스는 기본적인 CRUD 연산을 포함한 다양한 메서드를 구현하고 있습니다. SimpleJpaRepository 클래스@Repository@Transactional(readOnly = true)public class SimpleJpaRepository implements JpaRepository { // ... other methods ... @Transactional public S save(S entity) { if (entityInformation.isNew(entity)) { em.persist(entity); ..
[JPA] JPA 실전 - 확장 기능 사용자 정의 리포지토리 구현 스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동 생성스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많음다양한 이유로 인터페이스의 메서드를 직접 구현하고 싶다면?JPA 직접 사용( `EntityManager` ) 스프링 JDBC Template 사용 MyBatis 사용데이터베이스 커넥션 직접 사용 등등... Querydsl 사용 1. 사용자 정의 리포지토리 인터페이스 정의먼저, 사용자 정의 리포지토리 인터페이스를 정의합니다. 이 인터페이스는 추가하고자 하는 커스텀 메서드를 선언합니다.public interface MemberRepositoryCustom { List findCustomMembers();}..
[JPA] JPA 실전 - 쿼리 메소드 (3) 하이버네이트 6의 최적화 설명하이버네이트 6에서는 JPQL 쿼리에서 의미 없는 left join을 최적화하여 제거합니다. 의미 없는 left join이란, 조인된 테이블(team)이 select 절이나 where 절에서 전혀 사용되지 않는 경우를 말합니다. 이러한 경우 조인을 수행할 필요가 없으므로, 하이버네이트는 최적화를 통해 불필요한 조인을 제거합니다.@Query(value = "select m from Member m left join m.team t") Page findByAge(int age, Pageable pageable); 이 쿼리는 Member와 Team을 left join 하지만, team은 select 절이나 where 절에서 전혀 사용되지 않습니다. 따라서 하이버네이트는 le..
[JPA] JPA 실전 - 쿼리 메소드 (2) -페이징과 정렬 순수 JPA 페이징과 정렬JPA에서 페이징을 어떻게 할 것인가?다음 조건으로 페이징과 정렬을 사용하는 예제 코드를 보자. 검색 조건: 나이가 10살정렬 조건: 이름으로 내림차순페이징 조건: 첫 번째 페이지, 페이지당 보여줄 데이터는 3건 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") .setParameter("age", age) .setFirstResult(offset) .setMaxRe..
[JPA] JPA 실전 - 쿼리 메소드 (1) 쿼리 메소드 기능 3가지메소드 이름으로 쿼리 생성메소드 이름으로 JPA NamedQuery 호출@Query 어노테이션을 사용해서 리파지토리 인터페이스에 쿼리 직접 정의 이름과 나이를 기준으로 회원을 조회하려면? 순수 JPA 리포지토리 public List findByUsernameAndAgeGreaterThan(String username, int age){ return em.createQuery("select m from Member m where m.username = :username and m.age > :age") .setParameter("username", username) .setParameter("age", age) ..
[JPA] JPA 실전 - 공통 인터페이스 JPA에서는 엔티티의 변경을 감지하는 기능(Dirty Checking)을 통해 엔티티를 수정할 수 있습니다. 트랜잭션 내에서 엔티티를 조회하고 필드 값을 변경하면, 트랜잭션 종료 시점에 JPA가 자동으로 변경된 엔티티를 감지하고 데이터베이스에 UPDATE 쿼리를 실행합니다. 순수JPA 기반 리포지토리package com.example.jpaspring.repository;import com.example.jpaspring.domain.Member;import jakarta.persistence.EntityManager;import jakarta.persistence.PersistenceContext;import org.springframework.stereotype.Repository;import jav..
[JPA] JPA 실전 - 개발 기본 Member 엔티티package com.example.jpaspring.domain;import jakarta.persistence.*;import lombok.*;@Entity@Getter @Setter@NoArgsConstructor(access = AccessLevel.PROTECTED)@ToString(of = {"id", "username", "age"})public class Member { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private int age; @ManyToOne(fetch = FetchType.LAZY) @Jo..