[이슈해결][jpa] 테이블 콜롬명에 여러 스타일이 섞였을 때..
환경: springboot2.5+, mysql
일반적으로 테이블은 아래와 같이 camel case 사용한다.
그래서 spring에 아래의 설정을 적용하고 엔티티에 camel case로 콜롬을 받는다.
(springboot3 기준)
spring.jpa.properties.hibernate.physical_naming_strategy=org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy
spring.jpa.properties.hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
(springboot2 기준)
spring.jpa.properties.hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
spring.jpa.properties.hibernate.implicit_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
(entity)
@Id
private BigInteger idSeq;
private String configType;
private String configName;
private LocalDateTime startDate;
private LocalDateTime endDate;
private String data;
private Short active;
private String regAdmin;
private String modAdmin;
private LocalDateTime regDate;
private LocalDateTime modDate;
근데 진짜 간혹 가다 아래와 같이.. camel case가 든 테이블이 섞여있는 경우가 있다.
이 entity의 column은 어떻게 정의해야 할까?
그래서 제일 먼저 생각나는 @Column을 이용해 재정의를 해본다.
@Column(name = "startTimeMillis")
private BigInteger startTimeMillis;
@Column(name = "expiryTimeMillis")
private BigInteger expiryTimeMillis;
@Column(name = "autoRenewing")
private String autoRenewing;
하지만 physical 설정은 맨 마지막에 적용되기 때문에..
startTimeMillis로 가져오라고 명명한 콜롬 역시 start_time_millis로 디비를 조회하여 에러가 난다.
그럼 어떻게 하지? 이 몇 개의 테이블 때문에 위 hibernate strategy를 포기하자니,, 모든 콜롬명을 재정의할 자신이 없다..
(PhysicalNamingStrategyStandardImpl 로 사용해야 할 것 같은데 이러면 기존 자바 속성값을 다 @Column(name= 언더스코어네임)으로 지정해야 하는 불편함이 생긴다..)
해결
쿼리를 짤 때 대소문자 구분이 없다는 사실이 떠올랐다.
즉, rewardCount, rewardcount, REWARDCount 건 쿼리는 잘 실행된다.
디비의 camel case 또한 사람의 눈에는 camel case 지만 컴퓨터한테는 별 의미 없는 구분인 것이다.
그래서 아래와 같이 @Column을 명명하고 사람의 눈에는 보기 좋아야 하니까 변수명에는 camel case로 구분하였다.
@Column(name = "starttimemillis")
private BigInteger startTimeMillis;
@Column(name = "expirytimemillis")
private BigInteger expiryTimeMillis;
@Column(name = "autorenewing")
private String autoRenewing;
별문제 없이 쿼리가 실행되는 것 확인하였다.