Java/ORM
JAVA ORM - Spring Data JPA(사용자 정의 리포지토리, Auditing의 두가지 방법)
티코딩
2024. 8. 25. 17:49
사용자 정의 리포지토리
Spring data Jpa는 사용자가 인터페이스만 정의하고 구현체는 스프링이 자동생성해줘서 편하지만, 사용자가 직접 정의해야 할 상황도 발생한다. JPA, 스프링 JDBC, MyBatis...등등
public interface CustomUserRepository {
List<User> findUsersByCustomQuery(String customParameter);
}
1. 이런 인터페이스를 하나 만든다.
2. 그다음 방금 만든 인터페이스를 구현할 클래스를 만들어야 하는데, 이름은 그 인터페이스이름 뒤에 'Impl'을 붙혀줘야 한다.
@RequiredArgsConstructor
public class CustomUserRepositoryImpl implements CustomUserRepository {
private EntityManager entityManager;
@Override
public List<User> findUsersByCustomQuery(String customParameter) {
String jpql = "SELECT u FROM User u WHERE u.customField = :customParameter";
return entityManager.createQuery(jpql, User.class)
.setParameter("customParameter", customParameter)
.getResultList();
}
}
3. 기존리포지토리가 1에서 만든 CustomUserRepository를 확장하게 한다.
public interface UserRepository extends JpaRepository<User, Long>, CustomUserRepository {
}
이렇게 되면 사용자 정의 리포지토리를 사용할 수 있게 된다.
Auditing 2가지 방법
1. JPA표준
@MappedSuperclass
@Getter
@Setter
public class JpaBaseEntity {
@Column(updatable = false)
private LocalDateTime createdDate;
private LocalDateTime updatedDate;
@PrePersist
public void prePersist() {
LocalDateTime now = LocalDateTime.now();
createdDate = now;
updatedDate = now;
}
@PreUpdate
public void preUpdate() {
updatedDate = LocalDateTime.now();
}
}
@PrePersist, @PreUpdate 애너테이션을 이용해 엔티티의 생성,수정시간을 관리하는 방법이다.
이렇게 base엔티티를 구현하고 기존엔티티들이 extends하게 하면 된다.
이 방법은 다른 ORM 구현체와 호환하기 좋다는 장점이 있지만, 확장성이 부족하다는 단점이 존재한다.
2. Spring Data Jpa 사용
스프링부트 애플리케이션에 @EnableJpaAuditing을 붙혀주고,
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {
@CreatedDate
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime lastModifiedDate;
@CreatedBy
private String createdBy;
@LastModifiedBy
private String lastModifiedBy;
}
위의 방법과 마찬가지로 필요한 엔티티에 BaseEntity를 상속받게 하면 된다.
Spring Data Jpa를 사용한다면 후자를 사용하자!