본문 바로가기
Java/ORM

JAVA ORM - Spring Data JPA(사용자 정의 리포지토리, Auditing의 두가지 방법)

by 티코딩 2024. 8. 25.

사용자 정의 리포지토리

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를 사용한다면 후자를 사용하자!