AWS EC2 jar파일 배포 (FileZilla 사용) / Springboot "Exit 1", java.sql.SQLNonTransientConnectionException해결

YUNU·2023년 5월 23일
0

스프링

목록 보기
5/33
post-thumbnail

🟦 AWS EC2 Springboot jar 파일 배포


🔹문제 상황

EC2에 Springboot를 배포하려 하는데 계속하여 서버가 터지는 문제가 발생하였다.

DB연결에도 문제가 없고 로컬에서는 정상적으로 작동하여 FileZilla를 이용해 EC2에 jar파일만 배포하기로 하였다.

jar 파일 생성을 위해 intelliJ에서 build를 하자 Build Failed가 났고 에러는 test class에서 발생하였다.

🔹 해결 과정

이를 해결하기 위해 test 파일을 전부 주석처리 하였다.

test파일을 주석처리 한 후에 build하니 정상적으로 작동한다.

- jar파일 EC2 배포

그래도 FileZilla 쓰기로 했으니까 FileZilla를 통해 EC2에 배포하고자 한다.

배포 순서는 다음과 같다.

1. 파일질라에서 좌측 상단에 '사이트 관리자 열기' 버튼을 클릭한다.

2. 사이트 관리자에서 프로토콜, 호스트(EC2 IP), 로그온 유형, 사용자, 키 파일(키 파일 위치)를 입력한 후 확인 버튼을 누른다.

3. 보내려고 하는 파일을 더블클릭하면 EC2로 전송된다.

그러나 여전히 jar파일이 실행되지 않는다.

"Exit 1 nohup java -jar 파일명.jar" 이라는 에러메시지가 발생하였다.

이는 일반적으로 명령어나 스크립트 실행 중에 오류가 발생했을 때 반환되는 종료 코드인데

FileZilla를 보다 보니 jar 파일의 권한에 실행권한이 없어 실행권한을 부여해 주었다.

chmod +x 파일명.jar

혹은 파일질라에서 '파일 속성 바꾸기'를 통해 권한을 수정해준다.

그러나 여전히 실행이 되지 않아 'nohup.out'에서 log를 확인해 보았다.

java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed
        at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110) ~[mysql-connector-j-8.0.32.jar!/:8.0.32]
        at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-j-8.0.32.jar!/:8.0.32]
        at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:824) ~[mysql-connector-j-8.0.32.jar!/:8.0.32]
        at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:444) ~[mysql-connector-j-8.0.32.jar!/:8.0.32]
        at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:237) ~[mysql-connector-j-8.0.32.jar!/:8.0.32]
        at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198) ~[mysql-connector-j-8.0.32.jar!/:8.0.32]
        at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-4.0.3.jar!/:na]
        at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:364) ~[HikariCP-4.0.3.jar!/:na]
        at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-4.0.3.jar!/:na]
        at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476) ~[HikariCP-4.0.3.jar!/:na]
        at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561) ~[HikariCP-4.0.3.jar!/:na]
        at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115) ~[HikariCP-4.0.3.jar!/:na]
        at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112) ~[HikariCP-4.0.3.jar!/:na]
        at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[hibernate-core-5.6.15.Final.jar!/:5.6.15.Final]
        at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess.obtainConnection(JdbcEnvironmentInitiator.java:181) ~[hibernate-core-5.6.15.Final.jar!/:5.6.15.Final]
"nohup.out" 1225L, 165630B 

'java.sql.SQLNonTransientConnectionException' 예외가 발생하였고 이 오류는 MySQL 데이터베이스 연결 설정에 관련된 문제이다.

MySQL 이 8 로 업그레이드되면서 여러 가지 보안이 강화되었고 연결시 기본적으로 SSL 통신을 사용하도록 변경되었다.

이전에는 EC2에서 MySQL 5.7버전을 사용하여 문제가 없었으나 이번에는 MySQL 8.0버전을 사용하면서 문제가 발생하였다.

🔹 해결

1. JDBC URL에 'allowPublicKeyRetrieval=true' 파라미터를 추가

spring.datasource.url=jdbc:mysql://서버IP:3306/db_name?allowPublicKeyRetrieval=true

2. SSL 사용 비활성화

spring.datasource.url=jdbc:mysql://서버IP:3306/db_name?useSSL=false

예시
spring.datasource.url=jdbc:mysql://localhost:3306/ILILO?useSSL=false&allowPublicKeyRetrieval=true

이후 재배포를 하면 정상적으로 실행이 된다.

profile
DDeo99

0개의 댓글