aws 연동 중 발생했던 에러 2가지
spring boot + jsp + spring data Jpa 를 사용하여 게시판을 만들고 배포를 수행하던 도중 발생했던 두가지 에러
1. 서버애서 run이 되었고, url로 접속시 jpa의 select쿼리가 날아가지만 화면이 출력되지 않는 에러가 발생했다.
=> 패키징을 war방식으로 바꾸니 해결 되었다. 뷰 템플릿으로 jsp를 사용하였기 때문에 발생한 에러인것 같다.
plugins {
id 'war' // 추가
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-tomcat'
}
build.gradle파일에 다음과 같은 코드를 추가하고 git 푸쉬를 한뒤, ec2에서 pull하여 다시 빌드를 하면 된다.
chmod +x gradlew
빌드를 위해서 먼저 gradlew파일에 수정권한을 주고,
sudo ./gradlew bootwar
bootwar 명령어를 이용하면 war파일을 빌드 할 수 있다. 빌드가 성공하면 프로젝트 내부의 build폴더의 libs내부에 war파일이 생성된다. war파일 실행시에는 jar파일을 실행할 때와 같이
java -jar 프로젝트명.war
위 몀령어를 수행하면 된다.
2. 로컬 pc에서 테스트를 할 때는 잘 동작하던 프로젝트가, aws의 rds를 이용하니
Table xxx doesn't exist 에러가 발생하였다.
=> 찾아보니 aws의 rds를 이용할 때, mysql의 설정 값 때문에 발생하는 문제였다.
(mysql의 변수 lower_case_table_names 라는 값)
- lower_case_table_names = 0 // 테이블 생성 및 조회 시 대·소문자 구분한다.
- lower_case_table_names = 1 // 입력 값이 대·소문자든 소문자로 인식 소문자 인식 파일 생성
- lower_case_table_names = 2 // 윈도우에서 대·소문자를 구분해서 테이블생성
=> 대소문자 구분때문에 테이블 명이 다르게 인식되어 JPA가 만들어주는 쿼리문이 제대로 실행될 수 없던 것이다.
ec2 와 연결 후 db와 연결하려면 다음과 같이 입력하면 된다.
검색해서 나온 수정 방식 (내 경우엔 변경되지 않았음)
$ mysql -u {마스터 사용자 이름} -p -h {RDS 인스턴스 엔드포인트}
> 비밀번호 입력
그리고 현재 설정 되어 있는 값을 보기 위해서 다음 코드를 입력한다.
show variables like 'lower_case_table_names';
현재 변수 값이 0으로 되어 있다는 것을 알 수 있다.
이를 해결하기 위해서 /etc 내부의 my.cnf를 열어 저 값을 변경해주어야 한다.
#리눅스
/etc/my.cnf
를 입력 후 mysqld라고 되 있는 부분에 설정 값을 추가 해준다.
[mysqld]
lower_case_table_names = 1
이를 입력하고 서버를 재시작하면 값이 바뀐다고 하는데, 나의 경우는 바뀌지 않았다.
그래서 파라미터 그룹에 lower_case_table_names를 1로 설정해서 rds에 새로운 데이터베이스를 만들었더니 다음과 같이 해결되었다.
참고
https://bizadmin.tistory.com/entry/mysql-테이블-이름-대소문자-변경 [Happy Resource]