스프링/프로젝트

aws 연동 중 발생했던 에러 2가지

이째형 2021. 11. 25. 10:08

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]

https://m.blog.naver.com/dogspecial/221436368729