JPA18 [Querydsl] 적용 방법 //Querydsl 추가implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"annotationProcessor "jakarta.annotation:jakarta.annotation-api"annotationProcessor "jakarta.persistence:jakarta.persistence-api"clean { delete file('src/main/generated')}Gradle clean 작업이 실행될 때 src/main/gener.. 2024. 12. 30. [Spring Data JPA] Projection Projection데이터베이스에서 필요한 속성만 조회하는 것을 projection 이라고 한다.예를 들면 필드 하나만 조회하거나 DTO로 조회를 하는 경우를 뜻한다.Spring Data JPA는 projection 기능을 어떻게 할까? 1. 인터페이스 기반 - 조회하고 싶은 필드를 getter 형식으로 지정public interface UsernameOnly { String getUsername();}public interface MemberRepository ... { List findProjectionsByUsername(String username);}메서드 이름은 자유롭게 지정해도 되며, Spring Data JPA는 반환 타입을 보고 인지한다.public interface Nested.. 2024. 12. 30. [Spring Data JPA] 새로운 엔티티 구별 방법 JPA에서 제공하는 save() 메서드는 아래와 같이 동작한다.새로운 엔티티면 저장(persist)새로운 엔티티가 아니면 병합(merge)여기서 새로운 엔티티의 판단 기준은 다음과 같다.식별자가 객체이고 null일 경우식별자가 자바 기본타입이고 0일 경우Persistable 인터페이스만약 엔티티의 키 생성 전략이 자동 생성 전략이라면 save()가 호출될 때 식별자가 존재하지 않는다.이는 새로운 엔티티로 인식해서 persist로 동작하므로 문제가 발생하지 않는다.하지만 ID를 직접 할당하는 경우 이미 식별자가 존재하므로 새로운 엔티티가 아니라고 판단하고 merge를 하게 된다.merge()는 주로 준영속 상태의 엔티티를 영속 상태로 변경할 때 사용되는데, 동작 과정은 다음과 같다.merge(member).. 2024. 12. 30. [Spring Data JPA] 도메인 클래스 컨버터 도메인 클래스 컨버터Spring Data Jpa에서 제공하는 컨버터로 엔티티의 Id를 엔티티로 변환하거나, 엔티티를 Id 로 변환하는 기능을 제공한다. 다음과 같은 컨트롤러가 있다고 하자./members/{id}로 요청이 오면 repository 에서 id를 통해 멤버를 조회 후 해당 멤버의 이름을 반환한다.@RestController@RequiredArgsConstructorpublic class MemberController { private final MemberRepository memberRepository; @GetMapping("/members/{id}") public String findMember(@PathVariable("id") Long id) { .. 2024. 12. 30. [Spring Data JPA] Auditing AuditingJPA의 Auditing은 엔티티의 생성 및 수정 정보를 자동으로 기록하는 기능이다.이를 통해 데이터베이스의 변경 이력을 관리하고, 누가 언제 데이터를 수정했는 지를 추적할 수 있다.Spring Data JPA에서는 해당 기능을 쉽게 사용할 수 있도록 지원한다. 설정 방법1. 스프링 부트 설정 클래스에 @EnableJpaAuditing 어노테이션을 추가하여 Auditing 기능을 활성화@SpringBootApplication@EnableJpaAuditingpublic class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); .. 2024. 12. 30. [Spring Data JPA] @EntityGraph @EntityGraph해당 애노테이션은 JPA에서 연관관계가 있는 엔티티를 조회 시 fetch join으로 한 번에 로드할 수 있도록 한다.일반적으로 jpql을 사용하면 fetch join을 아래와 같이 사용할 수 있다.@Query("select m from Member m left join fetch m.team")List findMemberFetchJoin();Spring Data JPA는 @EntityGraph 애노테이션은 통해 JPQL 없이 Fetch join이 가능하도록 할 수 있다.LEFT OUTER JOIN을 사용하며, attributePaths = {”함께 로드할 연관된 엔티티”} 처럼 사용한다.// JPA가 지원하는 공통 메서드와 함께 사용@Override@EntityGraph(attri.. 2024. 12. 30. [Spring Data JPA] @Modifying @ModifyingSpring Data JPA에서 데이터베이스의 데이터를 수정하는 쿼리를 정의할 때 사용되는 애노테이션으로 @Query 애노테이션과 함께 변경이 일어나는 작업을 수행하는 메서드에 사용한다. 이는 벌크 연산 시 사용한다. 벌크 연산데이터베이스에서 대량의 데이터를 Update, Delete 하기 위한 작업으로 이는 JPA에서 변경 감지를 통해 변경되는 것이 아니라 한 번에 Update 쿼리를 날리는 작업을 의미한다.즉 Entity의 Life-cycle을 무시하고 쿼리가 실행되므로 영속성 컨텍스트 관리에 주의해야 한다.(jdbc 템플릿, mybatis 처럼 jdbc를 직접 날리는 것도 Jpa는 인식하지 못하므로 영속성 컨텍스트를 플러시나 초기화를 해주어야 한다.) 앞서 말했다 시피 벌크 연산은.. 2024. 12. 30. [Spring Data JPA] Page, Slice 먼저 페이징을 위해선 메서드에서 Pageable을 인자로 받아야 한다.Pageable은 인터페이스로 페이징을 위한 정보를 저장하는데 대표적인 구현체인 PageRequest의 생성자를 보면 다음과 같다.protected PageRequest(int page, int size, Sort sort) { super(page, size); Assert.notNull(sort, "Sort must not be null"); this.sort = sort;}page : 페이지 번호 (0부터 시작)size : 해당 페이지의 데이터의 개수sort : 정렬 기준Spring Data JPA는 페이징을 처리할 때 컨트롤러에서 파라미터로 인터페이스인 Pageable을 받을 수 있다.@GetMapping("/me.. 2024. 12. 29. [JPA] OSIV(Open Session In View) OSIV최초 데이터베이스 커넥션 시작 시점(트랜잭션 시작)부터 API 응답이 끝날 때 까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지시키는 기능이다.이로 인해 View Template이나 API 컨트롤러에서 지연 로딩이 가능해진다.(지연 로딩은 영속성 컨텍스트가 살아있어야 하고, 영속성 컨텍스트는 기본적으로 데이터베이스 커넥션을 유지)하지만 해당 기능은 오랜 시간 데이터베이스 커넥션 리소스를 사용하므로 실시간 트래픽이 중요한 애플리 케이션에서는 커넥션이 모자라 장애로 이어지는 문제가 발생할 수 있다. OSIV를 끄면 트랜잭션을 종료할 때 영속성 컨텍스트를 닫고, 데이터베이스 커넥션도 반환.즉 View template에서는 지연 로딩이 동작하지 않기에 모든 지연 로딩을 트랜잭션 끝나기 전에 강제로 호출해.. 2024. 12. 29. 이전 1 2 다음