프로젝트를 하는 중 엔티티의 첫 생성시에는 값이 지정되지 않는 컬럼에 대해 기본값을 설정해야하는 상황이 있었다.
이와 관련해서 내가 잘못알고있던 부분들이 있어 기록해두려고 한다
(나는 @Builder.Default가 지정한 값으로 테이블 초기화를 해주는걸로 알고있었는데 아니었다)
책(Book)
테이블이 있고, bookScore
컬럼을 초기값 -1 로 지정하고자 한다. 이 경우 어떻게 해야할까?
@Builder.Default
public class Book {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long bookId; //pk
private String bookIsbn; //isbn
private String bookTitle; //제목
private String bookAuthor; //작가
private String bookSummary; //줄거리
//초기화하고자 하는 컬럼
@Builder.Default
private int bookScore=-1; //평점
,,,,
}
내가 기존에 생각했던 방식이다. 위와 같이 Book 엔티티 내에 bookScore=-1 로 설정한 후, @Builder.Default
어노테이션을 붙여주었다.
이 경우 생성되는 DDL은 다음과 같다
create table book (
book_id bigint not null auto_increment,
created_date datetime(6),
modified_date datetime(6),
book_author varchar(255),
book_end_dt date,
book_image_url varchar(255),
book_isbn varchar(255),
book_score integer not null, //주목 !!!
book_start_dt date,
book_summary varchar(255),
book_title varchar(255),
user_id bigint not null,
primary key (book_id)
)
내 예상과 달리 기본값은 지정되지 않은 채 그냥 DDL이 나가버린다..
사실 Builder.XXX인것만 봐도 당연한 거였는데, @Builder.Default
는 테이블 생성이 아니라 엔티티 객체가 생성될 때 관여하는 것이기 때문이다
Book book= Book.builder()
.bookTitle('어린왕자')
.bookIsbn('12345')
,,, // 나머지 컬럼 생략
,,,
.build();
즉, 위와 같이 Book 객체를 생성하는 시점에 bookScore 값을 지정하지 않아도 해당 값이 -1로 초기화되어 저장되는 것이다.
그렇다면 테이블이 생성되는 시점에 애초에 초기값을 지정하려면 어떻게 해야할까?
@ColumnDefalut
바로 @ColumnDefault
어노테이션을 사용해야한다. @ColumnDefalult("원하는값")
과 같이 원하는 값을 지정할 수 있다. 이렇게 지정해주고 다시 서버를 구동시켜보자.
create table book (
book_id bigint not null auto_increment,
created_date datetime(6),
modified_date datetime(6),
book_author varchar(255),
book_end_dt date,
book_image_url varchar(255),
book_isbn varchar(255),
book_score integer default -1 not null, //주목!!
book_start_dt date,
book_summary varchar(255),
book_title varchar(255),
user_id bigint not null,
primary key (book_id)
)
생성된 DDL이다. 9번째 줄을 보면 default -1
로 초기값이 잘 지정된 것을 볼 수 있다.
참고로 @Column(columnDefinition = "integer default -1")
로 대체할수도 있다. 두가지 모두 같은 DDL을 만든다.
두 가지 모두 지정한 경우?
그럼 다음과 같이 두 어노테이션 모두 붙어있는 경우, 어떻게 처리될까? 이렇게 설정한 후, Book 객체를 생성, bookScorer값을 지정하지 않은 채 저장했다고 하자.
이 때 bookScore의 값은 당연히 -1이 아닌 0으로 설정된다.
-1은 테이블 생성시의 초기값일 뿐이고, 이후에 객체 생성 후 insert될 때에는 Builder가 지정한 값인 0으로 삽입된다.
(사실 객체 생성 전후로 초기값이 달라져야할 경우는 잘 없을거기에.. 이렇게 사용할일은 없긴 하다)
결론
테이블 생성시 DDL에 포함될 컬럼의 기본값을 지정하고 싶다면 @ColumnDefault
또는 @Column
의 columnDefinition
을,
객체 생성시 기본값을 지정하려면 @Builder.Default
를 사용하자