[java] Querydsl을 사용하여 데이터베이스 테이블 변경 추적하기

데이터베이스 테이블의 변경 이력을 추적하는 것은 애플리케이션의 안정성과 유지보수를 위해 중요한 요소입니다. Querydsl은 데이터베이스와 자바 코드를 연결해주는 유용한 라이브러리입니다. 이번 블로그 포스트에서는 Querydsl을 사용하여 데이터베이스 테이블의 변경 이력을 추적해보겠습니다.

1. Querydsl 설정하기

먼저 Querydsl을 프로젝트에 추가하기 위해 의존성을 설정해야 합니다. Maven을 사용하는 경우 pom.xml 파일에 다음 의존성을 추가합니다:

<dependencies>
    <!-- Querydsl -->
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-core</artifactId>
        <version>${querydsl.version}</version>
    </dependency>
    <dependency>
        <groupId>com.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>${querydsl.version}</version>
    </dependency>
    <!-- other dependencies -->
</dependencies>

${querydsl.version}은 사용하고자 하는 Querydsl 버전으로 대체해야 합니다.

2. 변경 추적용 엔터티 클래스 생성하기

변경 추적을 위해 엔터티 클래스에 변경 이력을 저장할 필드를 추가해야 합니다. 예를 들어, 다음과 같은 AuditEntity 클래스를 생성할 수 있습니다:

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import java.time.LocalDateTime;

@Entity
public class AuditEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String entityName;

    @Column(nullable = false)
    private Long entityId;

    @Column(nullable = false)
    private LocalDateTime createdAt;

    @Column(nullable = false)
    private LocalDateTime updatedAt;

    // getters and setters

    @PrePersist
    public void prePersist() {
        createdAt = LocalDateTime.now();
        updatedAt = LocalDateTime.now();
    }

    @PreUpdate
    public void preUpdate() {
        updatedAt = LocalDateTime.now();
    }
}

AuditEntity는 엔터티 변경 이력을 저장하기 위한 필드와 생성 및 수정 이벤트를 처리하는 메소드가 포함되어 있습니다.

3. Querydsl을 사용한 변경 이력 추적

이제 Querydsl을 사용하여 변경 이력을 추적하는 방법을 살펴보겠습니다.

import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.jpa.impl.JPAQueryFactory;

import javax.persistence.EntityManager;
import java.util.List;

public class AuditLogRepository {

    private final JPAQueryFactory queryFactory;

    public AuditLogRepository(EntityManager entityManager) {
        queryFactory = new JPAQueryFactory(entityManager);
    }

    public List<AuditEntity> getEntityChanges(String entityName, Long entityId) {
        QAuditEntity auditEntity = QAuditEntity.auditEntity;
        BooleanExpression condition = auditEntity.entityName.eq(entityName).and(auditEntity.entityId.eq(entityId));
        return queryFactory.selectFrom(auditEntity).where(condition).fetch();
    }
}

위의 코드는 AuditEntity에 대한 변경 이력을 추적하기 위한 AuditLogRepository 클래스입니다. getEntityChanges 메소드를 사용하여 특정 엔터티의 변경 이력을 조회할 수 있습니다.

마무리

이번 포스트에서는 Querydsl을 사용하여 데이터베이스 테이블의 변경 이력을 추적하는 방법을 알아보았습니다. Querydsl을 활용하면 데이터베이스와 자바 코드를 간편하게 연결할 수 있으며, 변경 이력을 추적하는 등의 다양한 기능을 구현할 수 있습니다.

더 많은 Querydsl 사용법에 대해서는 공식 문서를 참고해주세요.