문제 상황
: 데이터베이스와 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의 컬럼을 없애주면 정상적으로 작동한다.
'Spring' 카테고리의 다른 글
Dispatcher Servlet이란? (0) | 2025.05.23 |
---|---|
JPA findById(), getReferenceById()데이터 조회에는 뭘 쓰는게 좋을까? (0) | 2025.05.16 |
JPA 데이터베이스의 데이터가 계속 사라진다면? (0) | 2025.05.15 |