[스프링부트, JPA] 컬럼의 기본값 default value 설정하기 (@ColumnDefault, @Builder.Default 차이)

minji·2022년 9월 11일
6
post-thumbnail

프로젝트를 하는 중 엔티티의 첫 생성시에는 값이 지정되지 않는 컬럼에 대해 기본값을 설정해야하는 상황이 있었다.

이와 관련해서 내가 잘못알고있던 부분들이 있어 기록해두려고 한다
(나는 @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 또는 @ColumncolumnDefinition을,
객체 생성시 기본값을 지정하려면 @Builder.Default를 사용하자

profile
SW Engineer

0개의 댓글