스프링

Spring Boot JPA @Column(name)으로 인한 user_name & userName 문제 해결

148june 2025. 4. 3. 17:18

Spring Boot + JPA 프로젝트에서 필드명은 userName으로 사용했지만, DB 컬럼명이 user_name으로 생성되면서 발생한 문제를 해결한 과정을 정리합니다.


🛑 문제 상황

JPA 엔터티에서 필드명을 userName(camelCase)으로 정의했지만,
데이터베이스(MySQL)에는 user_name(snake_case)으로 컬럼이 자동 생성되었습니다.

이로 인해 JPA가 올바르게 매핑되지 않아 쿼리 실행 시 오류가 발생했습니다.

🚨 발생한 오류 로그

No property 'userName' found for type 'Member'; Did you mean 'user_name'?

✔ JPA가 userName을 찾지 못하고, user_name을 추천함

또한, Hibernate가 실행될 때 다음과 같은 경고가 출력되었습니다.

Table [member] contains logical column name [userName] referring to multiple physical column names: [username], [user_name]

✔ userName을 user_name으로 매핑할 수 없다는 오류


🔍 원인 분석

1. JPA가 기본적으로 snake_case로 변환

Spring Boot의 Hibernate 설정에서는 기본적으로 camelCase 필드명을 snake_case 컬럼명으로 변환합니다.
즉, userName → user_name으로 자동 변환됨.

🚨 잘못된 코드

@Entity
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String userName; // ❌ JPA가 자동으로 user_name 컬럼을 생성
}

엔터티에는 userName이 있지만, DB에는 user_name으로 저장됨
레포지토리에서 findByUserName()을 실행하면 user_name을 찾지 못함


2. 기존 테이블 컬럼이 user_name으로 설정됨

MySQL에서 테이블 구조를 확인했을 때, 컬럼명이 user_name으로 되어 있었음

SHOW CREATE TABLE member \G;

✔ user_name 컬럼이 생성된 것을 확인


✅ 해결 방법

1. @Column(name = "userName")을 명시적으로 추가

JPA가 자동 변환하지 않도록 DB 컬럼명을 camelCase 그대로 유지

✅ 수정된 코드

@Entity
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "userName") // ✅ DB 컬럼명을 userName으로 지정
    private String userName;
}

JPA가 userName 그대로 사용하도록 강제 설정
이제 findByUserName()도 정상 작동


2. MySQL에서 컬럼명 변경 (기존 DB 수정 필요할 경우)

컬럼명이 user_name으로 되어 있다면, JPA가 요구하는 userName으로 변경

✅ MySQL에서 컬럼명 변경

ALTER TABLE member CHANGE COLUMN user_name userName VARCHAR(255);

user_name을 userName으로 변경하여 JPA와 맞춤


3. MemberRepository에서 필드명 확인

레포지토리에서 userName 필드를 올바르게 조회하도록 수정

✅ 수정된 코드

public interface MemberRepository extends JpaRepository<Member, Long> {
    Optional<Member> findByUserName(String userName); // ✅ 필드명과 일치
}

✔ findByUserName() 메서드가 userName 필드를 조회하도록 변경


4. Hibernate Naming 전략을 수정 (대안)

application.yml에서 Hibernate의 컬럼 자동 변환을 막을 수도 있음

✅ application.yml 수정

spring:
  jpa:
    properties:
      hibernate:
        implicit_naming_strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl

✔ camelCase를 자동으로 snake_case로 변환하지 않도록 설정


🔥 최종 결론

JPA는 기본적으로 camelCase를 snake_case로 변환하므로, DB 컬럼명이 user_name으로 생성될 수 있음
명시적으로 @Column(name = "userName")을 추가하면 자동 변환을 막을 수 있음
기존 DB 컬럼이 user_name으로 되어 있다면 ALTER TABLE로 변경 가능
Hibernate Naming 전략을 수정하면 JPA가 자동 변환하지 않도록 설정 가능