메인프로젝트의 DB는 관계형데이터베이스로 진행하기로 해서,
로컬 개발환경에서는 H2를, 배포 환경에서는 MySQL를 RDBMS로 정해서 하기로 했다.
그런데, 분명 개발환경에서는 잘 돌아가던 프로젝트가, 배포환경에서는 에러가 나는 것이다.
Table [db명. 테이블명] doesn't exist
에러 발생
각, RDBMS 관련하여 들어가기 전에 JPA에서 Entity를 만들고 실제 만들어지는 Table이 어떻게 생성되는지 부터 알아보자
테스트해볼 DB는 H2, MySQL 이며, 환경설정을 다시 만들기 귀찮아서, 기존 MainProject에다가 임의로 만들었다.
package mainproject.nosleep.entitytest.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import java.io.Serializable;
import java.math.BigDecimal;
import java.security.Timestamp;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Time;
import java.sql.Date;
import java.util.Calendar;
import java.util.Currency;
import java.util.Locale;
import java.util.TimeZone;
@Entity
public class TestEntity {
@Id
private Long id;
@Column private String testString;
@Column private Character testCharacter;
@Column private Integer testInteger;
@Column private Long testLong;
@Column private Short testShort;
@Column private Float testFloat;
@Column private Double testDouble;
@Column private Byte testByte;
@Column private Byte[] testBytes;
@Column private Boolean testBoolean;
@SuppressWarnings("rawtypes")
@Column private Class testClass;
// java.sql
@Column private Timestamp testTimestamp;
@Column private Date testDate;
@Column private Time testTime;
@Column private Clob testClob;
@Column private Blob testBlob;
// java.math
@Column private BigDecimal testBigDecimal;
// java.io
@Column private Serializable testSerializable;
// java.util
@Column private Calendar testCalendar;
@Column private Locale testLocale;
@Column private TimeZone testTimeZone;
@Column private Currency testCurrency;
}
CamelCase
는 대문자를 중심으로 SnakeCase
로 전환되어 있다.SELECT * FROM TEST_entity
로 조회해도 조회가 된다.CamelCase
는 대문자를 중심으로 SnakeCase
로 전환되어 있다.SELECT * FROM TEST_entity
로 조회해도 조회가 된다.예상과는 다르게, 테스트해본 결과 H2, MySQL 둘다 대소문자를 구분하지 않았다.
그럼 대체 왜, 나는 대소문자를 구분하지 않고 조회하지 못하는Table [db명. 테이블명] doesn't exist
에러가 발생했을까?
Windows
로 사용하고 있다. 하지만 배포환경에서는 Ubuntu
즉, 리눅스 환경에서 배포한 것이다.Windows
는 대소문자 구분을 하지 않는 게 기본 설정이지만,name
조차도 파일로 관리하기 때문에 대소문자를 구분하는 게 기본 설정입니다.해당 운영체제에서 Mysql
에 접속한다.
Variable이라는 곳에 설정들이 보관되어 있는데, 대소문자 구분관련된 설정을 보기위해선
show variables like 'lower%';
로 조회하면 된다.리눅스의 경우
Windows의 경우
확실히, Windows의 MySQL과 리눅스의 MySQL은 기본 세팅부터 차이가 있음을 알 수 있었다.
이 값을 변경 시킬라고 하면 Read
만 가능한 파일이기에, 변경이 되질 않는다. Error Code: 1238. Variable [설정명] is aread only variable
/etc/mysql/my.cnf
파일을 들어가서 아래와 같이 입력해주면 된다.# Mysql server
[mysqld]
lower_case_table_names=1
하지만 여기서 의문점은, MySQL이 Windows에서는 대소문자를 구분하지 않지만, 굳이 리눅스에서는 대소문자를 구분하는 이유는 무엇일까?
database
와 table
이 Directory
와 File
명이기 때문이다.Windows
에서는 디렉토리와 파일에 접근할때 대소문자 구분을 하지 않으나, Linux/Unix
는 구분하므로 select 나 insert 시에 테이블의 대소문자를 구분해야되는 것이다.