문제 상황
- 요청 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문에서 제외시킨다.
'개발' 카테고리의 다른 글
permitAll()로 요청한 api들이 JwtFilter를 거쳐서 가는 문제 (0) | 2024.04.29 |
---|---|
예외 처리시 원하는 예외 응답값이 안오는 경우 (4) | 2024.04.29 |
코틀린을 사용한 스프링 프로젝트에서 자바를 사용 할 때 자바 파일을 못 찾는 오류 (1) | 2024.02.24 |
스프링부트 프로젝트를 도커를 이용하여 배포해 보자! (1) | 2023.12.29 |
에러 - Unknown return value type: java.lang.Integer (0) | 2023.05.14 |