Spring Boot JPA @Column(name)으로 인한 user_name & userName 문제 해결
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가 자동 변환하지 않도록 설정 가능