1️⃣ 개요
요즘 캡스톤 디자인 발표 전 막바지 작업을 한다고 블로그 관리를 거의 못했다.
대신 그동안 프로젝트를 하며 공부한 내용, 알게된 내용이 굉장히 많았고, 모두 블로그에 올릴 생각이다.
우선 현재 하고 있는 프로젝트의 경우 DB 테이블이 세 개밖에 나오지 않는다.
user, reservation, room 으로 간단하게 구성했다.
만약 테이블이 많아져 DB가 복잡해진다면, 생각보다 column이 중복되는 경우가 많다고 한다.
이를 방지하기 위해 등록 날짜 (create_date), 업데이트 날짜 (update_date)를 자동으로 추가할 수 있는 방법이 있다.
2️⃣ BaseTimeEntity
가장 먼저 'BaseTimeEntity' 라는 추상 클래스를 생성해야 한다.
그리고 다음과 같은 어노테이션을 추가한다.
1. @MappedSuperclass : JPA Entity 클래스들이 BaseTimeEntity 클래스를 상속할 경우, 해당 클래스들의 필드들도 칼럼으로 인식하도록 한다.
2. @EntityListeners(AuditingEntityListener.class) : BaseTimeEntity 클래스에 Auditing 기능을 넣어줌으로써, 엔티티가 생성되거나 값이 변경될 때의 시간 등이 자동으로 저장되게 한다.
...
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity{
@CreatedDate
@Column(name = "create_date")
private LocalDateTime createdDate;
@LastModifiedDate
@Column(name = "update_date")
private LocalDateTime modifiedDate;
}
코드를 보면 'BaseTimeEntity' 라는 추상 클래스 (abstract class) 를 생성한 뒤, 다음의 어노테이션을 적용했다.
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
이후에 나오는 어노테이션들도 살펴보겠다.
- @CreatedDate : Entity 가 생성되어 저장될 때의 시간이 자동으로 저장된다.
- @LastModifiedDate : Entity 의 값이 변경될 때의 시간이 자동으로 저장된다.
- @JsonIgnore : 필수는 아니다. HTTP 통신을할 때 json 형식의 결과값에서 보이지 않도록 한다.
- @Column : 컬럼명을 지정한다.
이렇게 BaseTimeEntity 클래스를 만든 뒤, 이를 적용할 Entity 클래스에서 상속받으면 된다.
다음 코드는 예시이다.
@Getter
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "users")
public class User extends BaseTimeEntity {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Long id;
...
}
'User' 라는 Entity 클래스이다. 여기서 BaseTimeEntity를 사용하기 위해선 상속만 받으면 된다.
즉, extends BaseTimeEntity 를 붙여주기만 하면 끝이다.
마지막으로 JPA Auditing 을 사용할 수 있도록 @EnableJpaAuditing 어노테이션을 추가해야 한다.
따로 'JpaAuditingConfig' 와 같은 클래스를 따로 만들어도 되지만, Application 클래스에 추가해도 된다.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
@EnableJpaAuditing
@SpringBootApplication
public class KmouReserveAppApplication {
public static void main(String[] args) {
SpringApplication.run(KmouReserveAppApplication.class, args);
}
}
여기까지가 BaseTimeEntity 를 사용하기 위한 준비 단계이다. 생각보다 간단하다.
이후 DB에 몇 개의 데이터를 집어 넣어 어떻게 저장되는지 보겠다. DB는 MySQL 을 사용하였다.
해당 테이블에서 직접 설정해준 'create_date' 와 'update_date' 컬럼이 잘 생성 되었다.
이는 따로 값을 넣는 것이 아니라 자동으로 생성되기 때문에 매우 편리하다.