스프링 데이터 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
을사용
해서동적쿼리
등을 처리할 때앞으로 사용할 예정
엔티티
를생성 / 변경
하는시점
을저장
하고,변경한 사람
과시간
을추적
하기 위한 것등록일
/수정일
/등록자
/수정자
를 갖는공통 클래스
를 만든 뒤필요한 Entity
에서상속
받아 사용
@MappedSuperclass
: 객체에서공통 필드 목적으로 사용하는 class
임을명시
- 필드
createdDate
:Entity 생성 날짜
lastModifiedDate
:최근 수정 날짜
- 메소드
prePersist
:@PrePersist
어노테이션을 이용해서최초 persist
될 때 수행preUpdate
:@PreUpdate
어노테이션을 이용해서값이 변경될 때 마다
수행
Entity 생성
시lastModifiedDate
함께 갱신?
: 보통lastModifiedDate
는생성
하며함께 생신
하는 것이 좋은데,
바로DB 조회
시null값
이면따로 처리
를 해줘야 하기 때문이다
@EntityListeners(AuditingEntityListener.class)
:이벤트에 반응하는 클래스
임을 알리기 위한설정
에 대한어노테이션
@CreatedDate
생성 날짜
를 관리하는필드
에 적용하는 어노테이션현재 날짜를 구해서 넣어주는것 모든 작업
을 대신해줌@LastModifiedDate
최근 수정 날짜
를 관리하는필드
에 적용하는 어노테이션엔티티가 수정될 때 마다 자동으로 갱신
된다
- 만약
Entity 등록
시수정일
은null값
으로 두고싶다면?
:스프링 부트 설정 클래스(최상단)
에@EnableJpaAuditing(modifyOnCreate = false)
옵션추가!
등록자
와수정자
를추가
하는 것을자동화
하기 위한과정이 필요
@CreateBy
/@LastModifiedBy
로 해당필드 추가
등록자 / 수정자
를처리
해주는AuditorAware 스프링 빈 등록
1. @CreateBy / @LastModifiedBy 해당 필드 추가
@CreatedBy
등록자
를관리
하는 필드에 적용하는 어노테이션@LastModifiedDate
수정자
를관리
하는 필드에 적용하는 어노테이션
2. AuditorAware 스프링 빈 등록
최상위 애플리케이션
에AuditorAware
를추가
- 현재 코드는
UUID.randomUUID()
로랜덤한 값
을 넣게 했지만,실제
로는현재 등록하거나 수정하는 유저의 id값
을파싱
해서넣어주어야 한다
대부분 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>