500 에러 (네이밍 전략)

순두누나·2025년 5월 15일

트러블슈팅

목록 보기
7/8

로그인 API를 개발하던 중 계속 500 에러 발생


문제상황

UserId 형식 변환

하던 중에 userId는 int 형식이 아니라 long 형식으로 하는 것이 좋겠다고 판단!

  1. 우선 ERD 수정

  2. java 파일 수정

  3. DB 파일 수정 (여기서 long을 BIGINT라고 적는 것을 처음 알았다)

500 에러 트러블슈팅

그러고 나서 우선 회원가입 API를 포스트맨에서 테스트 했을 때. 500 에러 발생

intellij 콘솔에서 확인한 결과

Unknown column 'u1_0.user_id' in 'field list'

라는 오류 발생.

이는 User 엔티티에서는 userId라고 정의했는데, 실제 DB 테이블의 컬럼 이름은 user_id로 되어 있지 않다는 뜻.

하지만..DB를 다시 확인해도

정상적으로 userId로 작성된 것 확인.

그래에서 엔티티에 @Column(name = "userId") 이 코드를 추가했지만 또 안됨.

다시 콘솔을 확인하니

Hibernate:
    select
        u1_0.user_id,
        u1_0.birth_date,
        u1_0.gender,
        u1_0.name,
        u1_0.phone_number,
        u1_0.profile_url,
        u1_0.reading_taste,
        u1_0.user_email,
        u1_0.user_nickname,
        u1_0.user_password
    from
        user u1_0
    where
        u1_0.user_email=?

이런 코드가 나온다.

이거는 JPA가 네이밍 전략을 자동으로 적용하고 있기 때문!

Spring Boot는 기본적으로

org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

이 전략을 사용하는데 이는 하이픈 방식으로 자동 변환시킨다.

해결방법 : Hibernate 네이밍 전략 끄기

application.yml 파일에

spring:
  jpa:
    hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

이 코드 수정

여기서 질문! 그러면 JPA는 스네이크 케이스 방식을 기본으로 가져가는 걸까?

Java: 카멜케이스 → userId

데이터베이스: 보통 스네이크케이스 → user_id

Hibernate는 이 차이를 맞춰주기 위해 다음과 같은 자동 네이밍 전략을 사용

userId → user_id
userEmail → user_email
방법설명권장 여부
DB 컬럼도 스네이크케이스 (user_id)로 만들기JPA 기본 전략과 일치함일반적으로 권장
Java에 @Column(name=...)로 명시하기DB 컬럼명을 따로 쓰고 싶을 때 사용추천
하이픈(user-id)SQL/DB에서 지원 안 됨절대 비추천

왜 Java와 DB 스타일이 다를까?

Java는 camelCase가 표준 스타일이고,

SQL은 snake_case가 가독성 측면에서 일반적.

그래서 JPA는 이 둘의 차이를 자동으로 변환해주는 네이밍 전략을 사용한다.

“하나로 통일”하기 위한2가지 방법

1. JPA가 자동 변환하도록 맡기기 (관례 따르기)

DB는 snake_case (user_id)

Java는 camelCase (userId)

JPA가 자동으로 변환해줌 → 가장 관리 쉬움

2. @Column 애노테이션으로 명시적으로 하나하나 맞추기 (통일감 있음, 하지만 번거로움)

예: Java와 DB 모두 카멜케이스로 통일하고 싶다면:

  • DB에 userId라는 컬럼을 만들고
  • JPA에 다음처럼 명시
@Column(name = "userId")
private Long userId;
  • 이러면 Hibernate는 user_id 대신 userId를 찾음

실무에서는 JPA의 자동 네이밍 전략을 그대로 사용하는 방식 선호!

❓ 다시 DB는 스네이크 케이스, java 파일

profile
순두의 누나입니다

0개의 댓글