본문 바로가기
공부/프로그래밍

[jpa] 테이블에 입력, 수정일시 컬럼 공통으로 하기

by demonic_ 2022. 2. 23.
반응형

테이블을 만들다 보면 입력, 수정일시를 모든 테이블에 적용해야할때가 있는데, 이런걸 JPA와 클래스를 이용해 공통으로 만들기 좋은 방법이 바로 @MappedSuperclass 를 설정하는 것이다.

 

다음과 같다(mysql 기준. 오라클이나 ms-sql등은 columnDefinition 내용이 다를 수 있다.)

@MappedSuperclass
public class CommonEntity {
    @CreationTimestamp
    @Column(name = "REG_DT", columnDefinition = "timestamp default CURRENT_TIMESTAMP not null comment '최초 등록 일자' ")
    private ZonedDateTime regDt;

    @UpdateTimestamp
    @Column(name = "MOD_DT", columnDefinition = "timestamp default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '최종 변경 일자' ")
    private ZonedDateTime modDt;
}

 

이제 이것을 상속받아 Entity를 생성한다

@Entity
@Table(name = "member")
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@DynamicInsert @DynamicUpdate
public class Member extends CommonEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name", length = 50, columnDefinition = "varchar(50) not null comment '이름' ")
    private String name;

    @Column(name = "email", length = 100, columnDefinition = "varchar(100) comment '이메일' ")
    private String email;

    @Column(name = "mobile_no", length = 200, columnDefinition = "varchar(200) comment '전화번호' ")
    private String mobileNo;
}

 

jpa 설정중 스키마를 수정할 수 있는 옵션을 update나 create 했다면(spring.jpa.hibernate.ddl-auto=update) 실행 시 다음처럼 스키마가 생성되는 걸 확인할 수 있다.

create table member (
	id bigint not null auto_increment, 
	mod_dt timestamp default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '최종 변경 일자', 
	reg_dt timestamp default CURRENT_TIMESTAMP not null comment '최초 등록 일자', 
	email varchar(100) comment '이메일', 
	mobile_no varchar(200) comment '전화번호', 
	name varchar(50) not null comment '이름', 
	primary key (id)
) engine=InnoDB;

mod_dt, reg_dt 등 등록된걸 확인할 수 있다.

 

 

끝.

 

반응형

댓글