[5] 스프링 데이터 JPA (6) - 확장 기능 1 (사용자 정의 repository / Auditing-@CreatedDate, @LastModifiedDate)

김정욱·2021년 4월 15일
0
post-thumbnail

사용자 정의 Repository 구현

[ 설명 ]

  • 스프링 데이터 JPA에서는 JpaRepository상속받은 인터페이스사용
  • @Query해결할 수 없는 메소드를 만들려면 구현체를 만들어야 하는데, 그렇다고 해당 인터페이스를 직접 상속받아서 모든 메소드를 구현할 수는 없다
    (구현체인터페이스에 정의된 모든 메소드반드시 구현해야 하기 때문)
  • 스프링 데이터 JPA에서는 이러한 한계점을 극복하여 사용자 정의 Repository 구현지원한다
  • 순서
    • Custom 인터페이스 생성
    • Custom 인터페이스구현체 생성 후 원하는 메소드 작성
    • 기존 인터페이스 repository에서 Custom 인터페이스상속
      (인터페이스다중상속허용)

[ 사용 ]

1. Custom 인터페이스 생성

  • 이름자유롭게 작성 가능

2. Custom 인터페이스 구현체 생성 (이름 형식 필요)

  • 주의
    • 구현체생성할 때 반드시 Custom 인터페이스 + Impl이름으로 생성
    • (기존 인터페이스 repository + Impl 도 가능하지만 위 방법이 더 최신이며 직관적)

3. 기존 repository에서 상속

  • JpaRepository상속하는 MemberRepository에서 추가 상속해주면 된다
    (인터페이스라서 다중상속가능)

[ 언제 사용 ? ]

  • 일반적으로 항상 사용자 정의 Repository만들어야 하는것은 아님!
  • QueryDSL이나 SpringJdbcTemplate함께 사용할 때 필요
  • 아마 QueryDSL사용해서 동적쿼리 등을 처리할 때 앞으로 사용할 예정

Auditing

[ 설명 ]

  • 엔티티생성 / 변경하는 시점저장하고, 변경한 사람시간추적하기 위한 것
  • 등록일 / 수정일 / 등록자 / 수정자 를 갖는 공통 클래스를 만든 뒤 필요한 Entity에서 상속받아 사용

[ 순수 JPA 사용 ]

  • @MappedSuperclass : 객체에서 공통 필드 목적으로 사용하는 class 임을 명시
  • 필드
    • createdDate : Entity 생성 날짜
    • lastModifiedDate : 최근 수정 날짜
  • 메소드
    • prePersist
      : @PrePersist 어노테이션을 이용해서 최초 persist될 때 수행
    • preUpdate
      : @PreUpdate 어노테이션을 이용해서 값이 변경될 때 마다 수행
  • Entity 생성lastModifiedDate 함께 갱신?
    : 보통 lastModifiedDate생성하며 함께 생신하는 것이 좋은데,
      바로 DB 조회null값이면 따로 처리를 해줘야 하기 때문이다

[ 스프링 데이터 JPA 사용 ]

  • @EntityListeners(AuditingEntityListener.class)
    : 이벤트에 반응하는 클래스임을 알리기 위한 설정에 대한 어노테이션
  • @CreatedDate
    • 생성 날짜를 관리하는 필드에 적용하는 어노테이션
    • 현재 날짜를 구해서 넣어주는것 모든 작업을 대신해줌
  • @LastModifiedDate
    • 최근 수정 날짜를 관리하는 필드에 적용하는 어노테이션
    • 엔티티가 수정될 때 마다 자동으로 갱신된다
  • 만약 Entity 등록수정일null값으로 두고싶다면?
    : 스프링 부트 설정 클래스(최상단)@EnableJpaAuditing(modifyOnCreate = false) 옵션 추가!

[ 스프링 데이터 JPA - 등록자 / 수정자 ]

  • 등록자수정자추가하는 것을 자동화 하기 위한 과정이 필요
    • @CreateBy / @LastModifiedBy로 해당 필드 추가
    • 등록자 / 수정자처리해주는 AuditorAware 스프링 빈 등록

1. @CreateBy / @LastModifiedBy 해당 필드 추가

  • @CreatedBy
    • 등록자관리하는 필드에 적용하는 어노테이션
  • @LastModifiedDate
    • 수정자관리하는 필드에 적용하는 어노테이션

2. AuditorAware 스프링 빈 등록

  • 최상위 애플리케이션AuditorAware추가
  • 현재 코드는 UUID.randomUUID()랜덤한 값을 넣게 했지만, 실제로는 현재 등록하거나 수정하는 유저의 id값파싱해서 넣어주어야 한다

[ BaseEntity / BaseTimeEntity 분리 ]

  • 대부분 Entity 생성일 / 수정일 필드는 필요한 경우많다
  • 하지만 등록자 / 수정자 필드특정 필드에서만 사용된다
  • 각 특성에 맞춰 2개의 클래스분리하여 유연하게 사용할 수 있다
  • 분리
    • BaseTimeEntity : 생성일 / 수정일
    • BaseEntity : 등록자 / 수정자 + BaseTimeEntity 상속

BaseTimeEntity

  • 생성날짜 / 최근 수정 날짜 필드를 가진 클래스
  • 대부분의 DB에서 상속받아 쓰게 되는 경우가 많다

BaseEntity

  • BaseTimeEntity상속
    --> 등록자 / 수정자 정보가 함께 필요하면 BaseEntity를 상속받아 사용하면 됨

[ 추가 ]

  • @EntityListeners(AuditingEntityListener.class)생략하고 글로벌하게 설정할수도 있음
  • META-INF/orm.xml 에 추가
  • 이러한 방법이 있다는 정도만 인지
<?xml version=1.0” encoding="UTF-8?>
<entity-mappings xmlns=“http://xmlns.jcp.org/xml/ns/persistence/orm”
                  xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
                  xsi:schemaLocation=“http://xmlns.jcp.org/xml/ns/persistence/orm http://xmlns.jcp.org/xml/ns/persistence/orm_2_2.xsd”version=2.2">
      <persistence-unit-metadata>
          <persistence-unit-defaults>
              <entity-listeners>
                  <entity-listenerclass="org.springframework.data.jpa.domain.support.AuditingEntityListener/>
              </entity-listeners>
          </persistence-unit-defaults>
      </persistence-unit-metadata>
</entity-mappings>
profile
Developer & PhotoGrapher

0개의 댓글