부자 되기 위한 블로그, 머니킹

안녕하세요. 오늘도 열심히 개인 프로젝트를 개발하고 있습니다. spring이 확실히 was로서 많은 기능을 포함하고 있어 사용하기에는 편리하지만 gradle로 종속성을 추가할 때 버전 문제로 골치를 아프게 하는 경우가 많은 것 같습니다. 오늘도 같은 문제인데요. h2 에서는 naming이 대문자로 자동으로 변환되어 sql 작성시 문제가 없었는데 mariadb (aws ec2 서버에 설치하였습니다) 연동시에 이런 네이밍 떄문에 전체 쿼리 날리는데 문제가 있는 것 같습니다.

 

 

문제의 시작 및 첫 해결방법 시도

package com.jelly_develop.passprofile.domain.template;

import com.jelly_develop.passprofile.domain.member.Member;
import com.jelly_develop.passprofile.domain.profile.ProfileBlockComponent;
import com.jelly_develop.passprofile.domain.profile.ProfileBlockComponentContent;
import lombok.Getter;
import lombok.Setter;

import javax.persistence.*;
import java.util.List;

@Entity
@Table(name="`PROFILE_BLOCK_TEMPLATE`")
@Getter
@Setter
public class ProfileBlockTemplate {
    @Id
    @GeneratedValue
    @Column(name = "PROFILE_BT_ID")
    private Long id;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "MEMBER_ID")
    Member member;

//    @OneToMany(mappedBy = "profileBlockTemplate")
//    private List<ProfileTemplateComponent> profileTemplateComponents;

    @Column(name = "PROFILE_BT_NAME")
    private String name;

    @Column(name = "PROFILE_BT_CONTENTS")
    private String contents;

    @Column(name = "PROFILE_BT_TYPES")
    private String types;

    @Column(name = "PROFILE_BT_KINDS")
    private String kinds;

}

 

 

이런식으로 entity를 구성해주었을 때 오류가 났던 상황은 column 명이 모두 소문자였으며 Table 조차 안붙였습니다. h2를 연동시켰을 때는 네이밍이 자동으로 모두 대문자로 변환되고 table 명도 클래스 명을 대문자로 잘 가져와 주었는데 mariadb(5.5.68 ver)에서는 잘 안되더군요. 

 

 

Table 'main.PROFILE_BLOCK_TEMPLATE' doesn't exist

쿼리를 날리면 테이블을 제대로 찾지 못하는 경우가 많았습니다. 따라서 네이밍 문제라고 확신하고 먼저 entity의 name 속성을 모두 지정해주어 대문자로 하게 되었습니다.

 

(1) 해결방법 1 : name 속성으로 talbe 및 column 명을 모두 대문자로 작성한다

(2) 해결방법 2 : 네이밍 충돌일 수도 있기 때문에 `을 name에 붙여 @Table(name="`PROFILE_BLOCK_TEMPLATE`") 이런 형태로 만든다.

 

 

결과 : 그래도 안되더군요. 생각해보니 mariadb 연동시에만 문제가 되는거라면 application.properties 속성에 문제가 있을 수도 있다는 생각이 들었습니다. h2의 경우 드라이버만 로드시 이런 네이밍 문제를 해결해주지만 mariadb 같은 경우 따로 설정을 해주어야 하나 생각이 들어 찾아보았습니다.

 

두번째 해결방법 시작

spring.datasource.url=[주소]
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.username=[이름]
spring.datasource.password=[비밀번호]

spring.jpa.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=false

(3) 해결방법 3 : 먼저 dialect, name_startegy, physical-strategy를 수동으로 설정해주었습니다.

 

 

* 결과 : 이렇게 바꾸니깐 원래 소문자 형태로 나오던 테이블 및 컬럼이 정상적으로 대문자로 변환되어 나오고 쿼리를 날려도 제대로 가더군요. mariadb를 회사에서 사용했을 때는 문제가 없었는데 나중에 조금 더 찾아봐야곘습니다.

 

아무래도 aws rdb 서비스를 이용하는 것이 아닌 Ec2에 db를 설치하여 이용하다 보니 세부적인 설정은 개발자 본인이 생각해주어야 하는 것 같습니다.