본문 바로가기
spring

@ColumnDefault 동작 안함(사실 동작함. 단지 적용이 안됐을 뿐.)

by kdozlo 2024. 4. 15.

@ColumnDefault 동작 안함(사실 동작함. 단지 적용이 안됐을 뿐.)

문제 상황

  • 요청 DTO를 받고 이를 통해 객체를 생성하여 save하는 과정에서 @ColumnDefault로 지정한 필드에 값이 들어가지 않는 상황이 발생했다. (요청 DTO에서는 @ColumnDefault로 지정한 필드가 없다)

  • DB에 넣고자 하는 객체

  • 에러 로그

문제 원인

  • 필드가 @Column(nullable = false)으로 지정되어 있고, @ColumnDefault는 사용하지 않도록 테이블을 생성한 상태에서, ddl-auto: update 를 하고 필드에 새로 @ColumnDefault를 해주어도 실제 테이블에는 반영이 되지 않았다. 이로 인해서 @DynamicInsert 를 하여 null인 필드는 insert문에 포함하지 않도록 했고, 이는 해당 필드에 아무런 값도 지정하지 않아서 “dosen’t hav a default value” 오류가 생겼다. @Column(nullable = true) 인 상황에서 아무런 값을 지정하지 않는 경우에는 null이 들어간다.

해결 방안

  • ddl-auto: create 를 하여 새로 테이블을 생성하여 @ColumnDefault가 적용될 수 있도록 하니 값이 제대로 들어갔다.

정리

  • 데이터베이스에 값을 insert할 때, 해당 필드가 null이 아니고 기본값을 자동으로 넣어 주어야 하는 상황에서 @DynamicInsert + @Column(nullable = false) + @ColumnDefault 를 사용하면 될 것 같다. 이때 주의할 점은 @Column(nullable = )@ColumnDefault의 경우 ddl-auto: update인 경우 해당 어노테이션을 변경해도 반영되지 않으므로 둘의 경우는 이미 테이블이 생성된 뒤 고친다면 drop하고 새로 데이블을 만들어줘야 반영된다.

참고

  • @ColumnDefault는 데이터베이스를 정의할 때(DDL 생성시) 해당 칼럼에 아무런 값도 지정하지 않는 경우(null값을 지정하면 기본값 안들어가고 null값 들어감)기본값을 지정하는 어노테이션이다.
  • @DynamicInsert는 데이터베이스에 값을 넣을 때(insert) 해당 필드가 null인 경우 해당 필드를 insert문에서 제외시킨다.