문제 상황

: 데이터베이스와 requestDto의 필드명을 Camel Case로 통일했었는데 로직 상 오류가 없는데도 계속해서 에러가 발생했다.

콘솔의 에러 문구를 확인해보니 다음과 같았다. 

Hibernate: 
    /* insert for
        com.example.taskmanagerapp.entity.Author */insert 
    into
        author (author_name, email, password, post_date, update_date) 
    values
        (?, ?, ?, ?, ?)
2025-05-15T21:07:04.410+09:00  WARN 14036 --- [taskManagerApp] [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1364, SQLState: HY000
2025-05-15T21:07:04.410+09:00 ERROR 14036 --- [taskManagerApp] [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : Field 'authorName' doesn't have a default value
2025-05-15T21:07:04.434+09:00 ERROR 14036 --- [taskManagerApp] [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.orm.jpa.JpaSystemException: could not execute statement [Field 'authorName' doesn't have a default value] [/* insert for com.example.taskmanagerapp.entity.Author */insert into author (author_name,email,password,post_date,update_date) values (?,?,?,?,?)]] with root cause

java.sql.SQLException: Field 'authorName' doesn't have a default value

 

원인

: 위의 에러코드를 확인해보면 insert 문에서 필드명이 authorName이 아니라 author_name으로 변환되어 있는 것을 확인할 수 있다. JPA는 기본적으로 필드명을 Snake Case로 자동 변환해서 테이블 컬럼에 매핑한다. 따라서 authorName이 author_Name으로 변환되어 DB에서 해당 컬럼을 찾고 있었던 것이다. 그러나 DB에는 Camel Case로 작성된 컬럼 authorName만 있기 때문에 에러가 발생했다. 

 

해결

 : application.properties에 Hibernate의 PhysicalNamingStrategy와 ImplicitNamingStrategy를 설정해 Snake Case로 변환하지 못하도록 할 수 있다. 

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl

 

추가 문제 상황 발생

: 위의 해결책을 통해 JPA가 자동으로 Snack Case로 변환하는 것은 방지했으나 에러가 계속해서 발생했다. 에러 코드 상에서

필드명은 Camel Case로 정상적인 상태였으나 그 외의 에러 메세지는 그대로였다. 

 

원인

: DB에서 author 테이블을 확인해보니 author_name 컬럼이 추가되어 있었다. Hibernate는 ddl-auto=update 또는 create 상태일 때 기존 테이블과 엔티티가 일치하지 않으면 컬럼을 만들어버린다. 따라서 author_name이 자동으로 생성된 것이다.

 

해결책

: 새로 생성된 Snake Case의 컬럼을 없애주면 정상적으로 작동한다. 

+ Recent posts