JPA/Spring Data JPA 8

[SpringDataJPA] Auditing

등록날짜, 등록자, 수정날짜, 수정자 데이터는 유지보수에 중요한 요소이다. 그러므로 엔티티는 위 요소를 담고 있어야 한다. 그러나 모든 엔티티에 이를 동일하게 생성한다면 엄천난 중복코드를 만들어 내게 된다. 그래서 JPA는 @MappedSuperclass를 제공하여 문제를 해결한다. @MappedSuperclass가 선언된 클래스에 공통속성을 생성하고 엔티티가 이를 상속하면 DB에 레코드가 생성될 때, 공통속성의 컬럼이 생성된다. JPA가 제공하는 Auditing @MappedSuperclass @Getter public class JpaBaseEntity { @Column(updatable = false) //수정 불가 private LocalDateTime createdDate; private Loc..

JPA/Spring Data JPA 2023.07.20

[SpringDataJPA] 사용자정의 인터페이스

스프링데이터JPA의 철학은 개발자가 작성한 리포지토리 인터페이스를 토대로 그 구현체를 자동생성하여 전달함에 있다. 그러나 스프링데이터JPA가 자동생성할 수 있는 구현체 로직은 JPA에 국한되어 있다. 동적쿼리를 위한 QueryDSL을 사용하거나 JPA가 아닌 MyBatis를 사용하거나 Spring JDBC Template을 사용하는 등의 스프링데이터JPA가 지원할 수 없는 로직을 담은 리포지토리 구현체는 자동생성 할 수 없다. 이런 경우, 개발자가 구현체를 직접 구현해야 한다. 스프링데이터JPA는 개발자가 구현한 구현체를 토대로 구현체 객체를 프록시로 자동생성하여 Bean으로 제공한다. 예를 들어보자. 개발자가 MemberRepository 인터페이스를 작성하고 JpaRepository를 상속하면 스프링..

JPA/Spring Data JPA 2023.07.18

[SpringDataJPA] @EntityGraph

JPA는 연관된 엔티티를 두 가지 전략으로 로딩한다. 1. LAZY 전략 2. EAGER 전략 LAZY 전략은 한 엔티티를 메모리에 로딩할 때, 연관된 엔티티 로딩은 지연시키는 것이다. 그리고 연관된 엔티티가 호출될 때, 그때 쿼리를 날려 DB에서 로딩하는 전략이다. EAGER 전략은 한 엔티티를 메모리에 로딩할 때, 연관된 엔티티도 같이 메모리에 로딩하는 전략이다. 그런데 두 가지 전략에는 문제가 있다. 연관된 엔티티를 로딩하기 위해 추가적인 쿼리문이 수행되어야 한다. 쿼리문이 반복 수행되면 성능에 좋지 못하다. JPA는 이 문제를 해결하기 위해 '페치 조인'을 제공한다. [JPA] 페치 조인 ( JOIN FETCH ) 엔티티의 연관 엔티티를 로드하는 전략은 두 가지가 있다. 1. 지연로딩 ( Lazy..

JPA/Spring Data JPA 2023.07.13

[SpringDataJPA] 벌크성 수정쿼리 ( @Modifying )

https://lordofkangs.tistory.com/404 [JPA] 벌크(Bulk) 연산 [JPA] 영속성 컨텍스트의 이점 [JPA] JPA 동작원리 ( 영속성 컨텍스트 ) [JPA] 패러다임의 불일치 어플리케이션 개발은 주로 객체지향언어로 이루어진다. 객체지향언어는 현실의 많은 문제를 코드로 lordofkangs.tistory.com JPA는 변경감지(DirtyChecking)로 UPDATE문을 생성하지만 한 번의 변경에 하나의 쿼리만 생성한다. 그래서 여러 건의 수정을 하나의 쿼리로 실행하려면 JPQL을 만들어야 한다. JPQL은 영속성 컨텍스트를 패싱하고 바로 DB에 실행되기에, 영속성 컨텍스트는 변경된 최신 데이터를 갖지 못한다. 그래서 JPQL로 수정쿼리를 실행한 뒤에는 항상 영속성 컨텍..

JPA/Spring Data JPA 2023.07.13

[SpringDataJPA] 페이징 ( Pageable, Page, Slice )

[JPA] 페이징 APIMySQL, ORACLE의 페이징 처리는 복잡하기로 유명하다. JPA는 API 2개만 알면 페이징 구현이 가능하다. 그리고 JPA가 알아서 DB에 맞추어 복잡한 페이징 SQL을 자동 생성한다. 페이징 쿼리 1) String jpql = "sellordofkangs.tistory.com  JPA는 페이징 할 수 있는 페이징API를 제공한다. 페이징API를 사용하려면 개발자가 리포지토리 구현체를 직접 구현해야 한다. SpringDataJPA의 철학은 개발자는 리포지토리 인터페이스만 구현하고 구현체는 SpringDataJPA가 알잘딱깔센하게 자동 생성함에 있다. 개발자는 직접 페이징API를 사용하지 않고 페이징에 필요한 데이터만 넘기면 된다.  이를위해, SpringDataJpa는 페이..

JPA/Spring Data JPA 2023.07.12

[SpringDataJPA] @Query

[SpringDataJPA] 메소드 이름으로 쿼리생성하기https://lordofkangs.tistory.com/430 [JPA] SpringDataJPA란? Spring Data란? Spring Data란, Spring 프레임워크가 제공하는 추상화된 데이터 접근 기술이다. 데이터베이스나 ORM프레임워크의 종류에 따라 데이터접근방lordofkangs.tistory.com 지난 포스팅에서 메소드 이름으로 쿼리를 생성해보았다. 메소드 이름만으로 모든 쿼리를 커버할 수 없다. 복잡하고 자세한 쿼리를 생성하려면 직접 JPQL을 작성해야 한다. 그러나 스프링데이터JPA는 개발자가 직접 리포지토리 구현체를 작성하지 않고 SpringDataJPA가 구현체를 프록시 객체로 생성하여 제공한다. 그러므로 개발자는 스프링데..

JPA/Spring Data JPA 2023.07.11

[SpringDataJPA] 메소드 이름으로 쿼리생성하기

[JPA] SpringDataJPA란? Spring Data란? Spring Data란, Spring 프레임워크가 제공하는 추상화된 데이터 접근 기술이다. 데이터베이스나 ORM프레임워크의 종류에 따라 데이터접근방식은 다양하게 구현되지만... 사실, 기능은 거 lordofkangs.tistory.com 지난 포스팅에서 SpringDataJPA의 개념을 다루어 보았다. SpringDataJPA는 데이터엑세스 계층의 핵심로직인 Repository를 자동생성하여 제공하는 모듈이다. Repository는 CRUD를 구현하기 위한 모듈로, 여러 Repository는 로직이 서로 중복되는 경우가 많다. 그래서 SpringDataJPA는 공통된 기능을 모아 JpaRepository 인터페이스와 SimpleJpaRepo..

JPA/Spring Data JPA 2023.07.11

[SpringDataJPA] SpringDataJPA란?

Spring Data란? Spring Data란, Spring 프레임워크가 제공하는 추상화된 데이터 접근 기술이다. 데이터베이스나 ORM프레임워크의 종류에 따라 데이터접근방식은 다양하게 구현되지만... 사실, 기능은 거의 동일하다. 데이터를 CRUD하고 페이징 및 정렬과 같이, 기능은 동일하지만 In-Memeory DB이냐 Non-Relational DB이냐 Relational DB이냐 Cloud 기반이냐 혹은 JPA framework이냐 Map-Reduce Framework이냐에 따라 구체적인 구현만 다를뿐이다. 그래서 구체적인 구현은 구현체로 넘기고 기능은 인터페이스로 추상화한 모듈을 스프링이 제공하는데, 그것이 Spring Data이다. Spring Data를 활용하면, 데이터 엑세스 환경이 다르더..

JPA/Spring Data JPA 2023.07.06