728x90
반응형
생성시간/수정시간 관리와 자동화하기
스프링 웹 프로젝트 중 생성/수정시간(날짜)에 대해 관리를 하기 위해서는 어떻게 해야될까?
아래와 같이 ERD 설계를 했을 때
- 모든 테이블엔 createDateTime과 lastModifiedDateTime 컬럼이 존재
- 특정 테이블에만 status 컬럼이 존재한다.
위 테이블들에서 모두 해당되는 reateDateTime과 lastModifiedDateTime 컬럼을 모두 추가해줘도 상관은 없지만, 테이블이 많아질수록 관리도 어렵고 길어질 것이다. 그래서 아래와 같이 MemberEntity(Member테이블)로 예를 들어보자면,
Entity와 DTO에서 항상 선언해서 사용하는 것보다, 생성시간/수정시간만 따로 관리하는 BaseEntity를 만들어 MemberEntity가 상속을 받는 방법으로 사용했다.
예를 들어
기존 코드
MemberEntity
package www.wakuwakubackend.entity.member;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import www.wakuwakubackend.dto.MemberDTO;
import java.time.LocalDateTime;
@Entity
@Setter
@Getter
@Table(name = "member_table") // DB에 실제 테이블명 생성됨
public class MemberEntity{
@Id // PK 정의
@GeneratedValue(strategy = GenerationType.IDENTITY) // mySql에서는 auto_increment 지정
private Long id;
@Column(unique = true)
// aBC(카멜케이스) => a_b_c
private String memberId;
@Column
private String memberEmail;
@Column
private String memberPassword;
@Column
private String memberName;
@Column
private LocalDateTime createDateTime;
@Column
private LocalDateTime lastModifiedDateTime;
@Column
private String checkStatus;
수정 코드
BaseEntity
package www.wakuwakubackend.entity.base;
import jakarta.persistence.Column;
import jakarta.persistence.MappedSuperclass;
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDateTime;
@Getter
@Setter
@MappedSuperclass
public class BaseEntity {
@Column(name = "create_date_time")
private LocalDateTime createDateTime;
@Column(name = "last_modified_date_time")
private LocalDateTime lastModifiedDateTime;
public BaseEntity() {
// this.createDateTime = LocalDateTime.now();
this.lastModifiedDateTime = LocalDateTime.now();
}
}
BaseEntity를 따로 만들어서 생성시간/수정시간에 관한 내용만 정리해둔다.
MemberEntity
package www.wakuwakubackend.entity.member;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import www.wakuwakubackend.dto.MemberDTO;
import www.wakuwakubackend.entity.base.BaseEntity;
@Entity
@Setter
@Getter
@Table(name = "member_table") // DB에 실제 테이블명 생성됨
public class MemberEntity extends BaseEntity {
@Id // PK 정의
@GeneratedValue(strategy = GenerationType.IDENTITY) // mySql에서는 auto_increment 지정
private Long id;
@Column(unique = true)
// aBC(카멜케이스) => a_b_c
private String memberId;
@Column
private String memberEmail;
@Column
private String memberPassword;
@Column
private String memberName;
@Column
private String checkStatus;
/* 아래 코드는 지워도 됨.
@Column
private LocalDateTime createDateTime;
@Column
private LocalDateTime lastModifiedDateTime;
*/
그리고 그 내용을 사용할 수 있게 MemberEntity에서 상속받는다.
(Member뿐만 아니라 해당 컬럼을 공통으로 사용하는 코드에선 모두 상속받아 사용하면 된다.)
728x90
반응형