엔티티를 생성, 변경할 때 변경한 사람과 시간을 추적하고 싶으면 어떻게 해야 할까?등록일, 수정일, 등록자, 수정자.. 등이 있다고 생각하자. 순수 JPA를 사용한 BaseEntity 구현 JpaBaseEntity 클래스 JPA의 @MappedSuperclass를 사용하여 생성일과 수정일을 추적할 수 있다.@MappedSuperclass는 속성만을 상속하는 방법으로, 실제 상속과 구분된다.@MappedSuperclass@Getterpublic class JpaBaseEntity { @Column(updatable = false) private LocalDateTime createdDate; private LocalDateTime updateDate; @PrePersist pub..
이번 내용은 실무에서 정말 많이 사용한다. querydsl repository를 만들고 활용하기 좋다.실무에서는 다양한 상황에 맞추어 인터페이스와 메서드를 직접 구현할 필요가 있다.예를 들어, JPA를 사용하다가 Spring JDBC Template이나 MyBatis 등을 사용해야 할 때가 있다.Spring Data JPA의 기본 인터페이스만으로는 충분하지 않은 경우, 사용자 정의 리포지토리를 구현하여 해결할 수 있다. Spring Data JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많은데, 어떻게 해야 할까? 구현 절차1. 사용자 정의 인터페이스 생성 먼저, 구현할 메서드를 추상화한 사용자 정의 인터페이스를 생성한다.public interface MemberReposito..
JPA Hint개념JPA Hint는 JPA의 구현체, 예를 들어 Hibernate에게 제공하는 힌트다.이는 SQL 자체에 대한 힌트가 아니라, JPA 구현체에 특정 동작을 요구하는 힌트이다. JPA는 기본적으로 Entity를 조회해와서 값을 변경하면 Dirty Checking이 일어나고 트랜잭션 커밋 시점에 이를 DB에 반영한다.만약 값을 바꿔서 화면에 뿌려주는데 DB에는 반영하기 싫을 땐 어떡할까? JPA는 이러한 기능을 제공하지 않지만 Hibernate는 이를 제공한다. 그렇기 때문에 JPA Hint를 사용한다. // JpaRepository@QueryHints(value = @QueryHint(name = "org.hibernate.readOnly", value = "true"))Mem..
JPA의 Fetch Join 이해1. EntityGraph를 이해하기 위해서는 JPA의 fetch join에 대해서 이해해야 한다.2. fetch join에 대해서 이해하려면 N + 1 문제를 이해해야 하고,3. N + 1 문제를 이해하기 위해선 FetchType.(Lazy와 Eager)와 Proxy 개념에 대한 이해가 필요하다.차근차근 가보자FetchType.Lazy와 FetchType.EAGERJPA에서 연관관계 매핑을 할 때 @xxxToMany와 @xxxToOne으로 나뉜다.여기서 xxxToMany는 기본적으로 FetchType이 Lazy이다. xxxToMany는 FetchType이 기본적으로 EAGER이다. FetchType은 EAGER와 LAZY로 나뉜다. EAGER LoadingEAGER는 본..
벌크성 수정 쿼리의 필요성JPA는 데이터를 갖고 와서 데이터가 변경되었는지 확인하는 "Dirty Checking" 작업을 한다. 이것은 한 건 한 건의 데이터들에 대한 수정을 확인한다.하지만 특정 연산에 의하여 몇 개인지 몰라 Dirty Checking이 불가능한 상황에는 어떻게 할까? 예를 들어 나이가 20 보다 적은 회원들을 모두 1살 높여야 하는 상황이라고 해보자.이런 상황에는 나이가 20보다 적은 회원들을 모두 갖고와서 수정하는 것보다, Update Query 한 번 날리는 게 효율적이다.이를 벌크성 수정쿼리라고 한다 순수 JPA에서의 벌크성 수정 쿼리public int bulkAgePlus(int age) { return em.createQuery("update Member m set m...
Spring Data JPA는 데이터베이스의 페이징 처리를 추상화하여 개발자가 쉽게 페이징을 구현할 수 있도록 도와준다. 이는 기존에 데이터베이스마다 다르게 적용되던 페이징 처리 방식을 단순화시킨다.기존 페이징 처리의 어려움과거에는 데이터베이스별로 페이징 처리 방식이 달랐다.예를 들어, MySQL은 LIMIT과 OFFSET을 사용했고, Oracle은 ROWNUM을 사용했다.이러한 방식은 개발자가 직접 계산하고 구현해야 하는 어려움이 있었다.Spring Data Jpa는 이를 공통으로 추상화시켰다.Spring Data Jpa의 페이징 처리Spring Data JPA에서는 Pageable 인터페이스를 사용하여 페이징 처리를 추상화하고 간소화한다. // MemberRepositoryPage findByAge(..
Spring Data JPA의 QueryMethodSpring Data JPA를 사용하면 복잡한 쿼리를 작성하지 않고도, 메소드 이름만으로 데이터 조회를 쉽게 할 수 있다. 이러한 기능을 제공하는 것이 바로 QueryMethod이다. QueryMethod는 메소드 이름을 분석하여 적절한 JPQL 쿼리를 생성한다. 개발을 하며 JPA Repository interface를 상속받아 사용을 한 적이 자주 있다.하지만 SpringDataJpa의 기능은 제대로 써보지 못했다. 그중에 가장 충격적이었던 QueryMethod의 종류들을 작성해보려한다. findByUsername(String username);말 그대로 이름으로 객체를 찾는 쿼리이다. 이렇게 하나의 컬럼으로 찾는 것은 많이 해보았다. 예전에 JPA에..