본문 바로가기

JPA/스프링 DATA JPA15

Data JPA 11 Auditing Auditing 엔티티를 생성, 변경할 때 변경한 사람과 시간을 추적하고 싶을 때 - 등록일 - 수정일 - 등록자 - 수정자 먼저 순수 JPA를 사용하여 등록일, 수정일을 추가할 수 있도록 해보자. 먼저 아래와 같이 수정일과 등록일을 위한 엔티티가 필요하다. (@MappedSuperclass 사용 ) @Getter @MappedSuperclass public class JpaBaseEntity { @Column(updatable = false)//생성일은 변경될 수 없다. private LocalDateTime createdDate; private LocalDateTime updatedDate; @PrePersist//Persist하기 전에 호출 public void prePersist(){ LocalD.. 2022. 1. 8.
Data JPA 10 사용자 정의 리포지토리 구현 사용자 정의 리포지토리 구현 • 스프링 데이터 JPA 리포지토리는 인터페이스만 정의하고 구현체는 스프링이 자동 생성 • 스프링 데이터 JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 기능이 너무 많음 • 다양한 이유로 인터페이스의 메서드를 직접 구현하고 싶다면? (아래는 5가지 다양한 이유) - 1. JPA 직접 사용 (EntityManager) - 2. 스프링 JDBC Template 사용 - 3. MyBatis 사용 - 4. 데이터베이스 커넥션 직접 사용 - 5. Query dsl 사용 등등... 이렇게 사용자가 정의한 리포지토리를 사용하기 위해서는 아래와 같이 해준다. 1. 인터페이스를 만들고, 본인이 직접 구현하고 싶은 추상 메서드를 만든다. (이때 인터페이스명과 메서드명은 본인 마음대.. 2022. 1. 8.
Data JPA 09 JPA Hint JPA Hint JPA 쿼리 힌트는 SQL이 아닌 JPA구현체에게 제공하는 힌트이다. 만약 JPA로 특정 엔티티를 조회한다면 영속성 컨텍스트에는 조회한 데이터의 스냅샷을 남겨두기 때문에 하나의 엔티티 대해 두개의 객체가 존재하게 된다. 예를 들어 username이 "userA"라는 멤버를 조회했을 경우에 영속성 컨텍스트에는 "userA"라는 멤버 객체와 그 스냅샷이 같이 저장되는 것이다. ( JPA 영속성 컨텍스트 이해하기 Dirty Checking참고 ) 이러한 기능은 조회한 데이터를 수정할 때는 용이하겠지만 그냥 단순히 수정하지 않고, 조회만을 한다면 쓸데없는 메모리 낭비로 이어진다. 하여 이러한 경우 스냅샷을 찍어두지 않도록 하는 방법을 하이버네이트가 제공하는데, JPA인터페이스는 제공하지 않는다... 2022. 1. 8.
Data JPA 08 @EntityGraph @EntityGraph 연관된 엔티티들을 SQL한번에 조회하는 방법 현재 Member와 Team엔티티는 다대일 연관관계를 가지고 있는데, fetch=FetchType.LAZY로 되어 있어 지연 로딩 전략을 하고있다. Member엔티티 @Entity public class Member { @Id @GeneratedValue @Column(name="member_id") private Long id; private String username; private int age; @ToString.Exclude//연관관계 필드는 toString을 안하는 것이 좋다. @JoinColumn(name="team_id") @ManyToOne(fetch=FetchType.LAZY) private Team team; /* .. 2022. 1. 7.