@Column의 columnDefinition

박민주·2024년 1월 31일

spring-JPA

목록 보기
4/5

JPA관련 테스트 코드를 작성해보던 중

@Data
@MappedSuperclass
@EntityListeners(value = AuditingEntityListener.class)
public class BaseEntity implements Auditable {
    @CreatedDate
    @Column(nullable = false, updatable = false)
    private LocalDateTime createdAt;
    @LastModifiedDate
    @Column(nullable = false)
    private LocalDateTime updatedAt;
}

@Column(nullable = false, updatable = false)을 지정한 속성들때문에 에러가 발생했다. 이유는 Data.sql의

insert into book(`id`,`name`,`publisher_id`, `deleted`) values(1, 'JPA 초격차 패키지', 1, false);
insert into book(`id`,`name`,`publisher_id`, `deleted`) values(2, 'Srping Security 초격차 패키지', 1, false);
insert into book(`id`,`name`,`publisher_id`, `deleted`) values(3, 'SpringBoot 올인원 패키지', 1, true);

와 같은 쿼리들에서 nullable=flase인 값을 넣어주지 않았기 때문이다. 1차적인 대안으로 Data.sql들의 쿼리에 속성들을 추가해서 수정할 수 있겠지만 추후 Data.sql에 또 다른 쿼리들이 추가 되거나 엔티티의 속성이 수정되면 유지보수에 어려움이 생길 듯 하였다. 그래서 찾아낸것이 columnDefinition 속성이다

ColumnDefinition

ColumnDefinition은 DB 컬럼 정보를 직접 줄 수 있음. 기본값은 필드의 자바 타입과 방언 정보를 사용해 적절한 컬럼 타입을 생성(DDL)하는 속성이다.
columnDefinition지정을
해주면 data.sqlAuditingListener나 동일하게 작동을 하게 된다.

@Column(columnDefinition = "datetime(6) default now(6)", nullable = false, updatable = false)
private LocalDateTime createdAt;

위 와같이 사용하면 된다. 여기서는 날짜의 속성에 대해 적용하여 설명하자면 default now()앞의 datetime(6)과 동일한 사이즈를 맞춰줘야만 정상적으로 실행된다. 여기서 now()의 괄호안 숫자는 초의 소수점 자리이다.

하지만 여기서 주의할점은 @Column의 각각 속성들이 상호 validation이나 치환로직이 없고, 각각의 속성들을 붙여서 ddl이 생성 되고있다. 그래서 많이 default null , nullable = false와 같이 작성하게 되면 에러가 발생하게 된다.

profile
개발자 되고싶다..

0개의 댓글