티스토리 뷰

자바와 스프링에 대한 기본 지식을 기르기 위해 토이 프로젝트를 시작했습니다.

 

토이 프로젝트로 배우는 자바 스프링 [0]. prologue

자바와 스프링에 대한 기본 지식을 기르기 위해 토이 프로젝트를 시작했습니다. 프론트 코드 : https://github.com/laboratory-kkoon9/connector_front GitHub - laboratory-kkoon9/connector_front Contribute to laboratory-kkoon9/co

kkoon9.tistory.com

프론트 코드 : https://github.com/laboratory-kkoon9/connector_front

 

GitHub - laboratory-kkoon9/connector_front

Contribute to laboratory-kkoon9/connector_front development by creating an account on GitHub.

github.com

백엔드 코드 : https://github.com/laboratory-kkoon9/connector_back

 

GitHub - laboratory-kkoon9/connector_back

Contribute to laboratory-kkoon9/connector_back development by creating an account on GitHub.

github.com

배경

엔티티에 생성 시각을 JPA에서 제공하는 기능으로 처리해보려고 합니다.

보통 엔티티에는 다음과 같은 공통 필드가 존재할 수 있습니다.

  • 생성 시각
  • 수정 시각
  • 활성화 여부

엔티티마다 추가해주는 방법도 있지만, 하나의 클래스로 관리할 수 있는 방법이 있습니다.

BaseEntity

저는 그 클래스를 BaseEntity로 부르고 있습니다.

다음은 BaseEntity의 코드입니다.

import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.*;
import java.time.LocalDateTime;

import static javax.persistence.EnumType.ORDINAL;

@Getter
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
public class BaseEntity {
    @Column(name = "activated", columnDefinition = "tinyint")
    protected Boolean activated;

    @CreatedDate
    @Column(name = "created_at", updatable = false)
    protected LocalDateTime createdAt;

    @LastModifiedDate
    @Column(name = "updated_at", insertable = false)
    protected LocalDateTime updatedAt;
}

여기서 살펴볼 키워드입니다.

  • @MappedSuperclass
  • @CreatedDate, @LastModifiedDate

하나하나 살펴보겠습니다.

@MappedSuperclass

매핑 정보가 해당 클래스에서 상속되는 엔티티에 적용되는 클래스를 지정합니다.

매핑된 슈퍼클래스에는 해당 클래스에 대해 정의된 별도의 테이블이 없습니다.

매핑된 슈퍼클래스 자체에 대한 테이블이 없으므로 매핑이 해당 서브클래스에만 적용된다는 점을 제외하고는 @MappedSuperclass으로 지정된 클래스를 엔티티와 동일한 방식으로 매핑할 수 있습니다.

@MappedSuperclass 어노테이션이 붙은 클래스를 상속한 엔티티 클래스의 컨텍스트에 적용됩니다.

보통, 공통적으로 사용되는 컬럼을 모아 @MappedSuperclass로 선언하고, 여러 엔티티에서 상속받는 구조로 사용됩니다.

@CreatedDate, @LastModifiedDate

@CreatedDate는 필드를 포함하는 엔티티가 작성된 날짜를 나타내는 필드로 선언합니다. 

@LastModifiedDate는 필드를 포함하는 엔티티가 최근에 수정된 날짜를 나타내는 필드로 선언합니다.

이 밖에 @CreatedBy나 @LastModifiedBy 어노테이션도 존재합니다.

@EnableJpaAuditing

@CreatedDate와 @LastModifiedDate 어노테이션이 동작하게 하려면 다음 구성이 필요합니다.

@EnableJpaAuditing 어노테이션을 포함한 Configuration을 통해서 JPA에서 일어나는 일들을 감사(auditing)할 수 있게 해줍니다.

감사(auditing)

https://docs.spring.io/spring-data/jpa/reference/auditing.html

위 링크에 따르면 감사(auditing)는 다음과 같은 의미를 가집니다.

Spring Data는 누가 엔티티를 생성하거나 변경했는지, 변경이 언제 발생했는지를 추적할 수 있도록 정교한 지원을 제공합니다.

auditing 기능을 활용하려면 엔티티 클래스에 어노테이션을 사용하거나 인터페이스를 구현하여 정의할 수 있는 auditing 메타데이터를 준비해야 합니다.

또한 필요한 인프라스트럭처 구성 요소를 등록하려면 @configuration 또는 XML configuration을 통해 auditing를 활성화해야 합니다.

저는 보통 다음과 같이 configuration을 선언해놓습니다.

import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@Configuration
@EnableJpaAuditing
public class JpaAuditingConfig {
}

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함