오류가 발생하였습니다.
한참을 원인과 해결방법을 찾아보다가, 제가 해결한 방법은 따로 찾을 수 없어서 정리해보았습니다.
오류 내용 및 상황
오류 발생 프로젝트: Spring batch 시스템
발생 시점: Debug 실행 시 발생 -> Application Run에 실패
오류 메세지 내용:
java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110)
...
원인 탐색
원인 1 - MySQL 버전 업그레이드 관련
보통 해당 오류의 경우 MySQL 8.0 이상 버전에서 발생합니다.
이런 경우에는 jdbc url에 옵션을 추가하여 해결합니다.
하단 '문제 해결' 파트에 자세히 기재하였습니다.
원인 2 - DB 터널링 정보 관련
다만 저의 경우에는 버전 관련 에러가 아니어서 서버부터 DB관련된 부분을 모두 찾아봐야 했습니다.
먼저 저는 DB 서버를 별도로 사용하였습니다.
따라서 터널링을 통해 DB 커넥션을 맺어주는데요,
Spring Batch 프로젝트의 DB 터널링 정보 중 DB 커넥션 포트 번호가 터널링 정보와 일치하지 않아서 발생하였습니다.
즉, 프로젝트별로 따로 설정해 준 DB 터널링 정보에 맞게,
Putty를 사용한 DB 터널링 시 설정을 변경해주어야 했는데 변경하지 않아 발생한 것을 확인하였습니다.
# ex)
# Spring Batch 터널링 포트 18888
# Spring Application 터널링 포트 18080
#
# 현재 상황: Spring Batch 실행, DB 터널링 포트 : 18080 인 상황에서 오류 발생
문제 해결
해결 방법 1 - MySQL 버전 업그레이드 관련 옵션 추가
옵션 추가가 필요할 경우 기존 jdbc-url 뒤에 옵션 두 가지를 추가해야 합니다.
jdbc-url: {url}&allowPublicKeyRetrieval=true&useSSL=false
를 설정해서 해결이 가능합니다.
allowPublicKeyRetrieval=true
# 서버에서 RSA 공개키를 가져와야 하는 경우
useSSL=false
# DB에 SSL로 연결
다만 주의할 점은 위 두 가지 설정을 함께 설정할 경우 보안상 취약한 상태가 될 수 있습니다.
따라서 위 설정은 로컬 환경에서만 설정해주는 것이 좋겠네요..
만약 운영 환경에서 사용이 필요할 경우 아래와 같이 SSL설정을 해주고 필요한 추가 옵션을 추가하는 것이 권장됩니다.
useSSL=true&추가옵션설정
해결 방법 2 - DB 터널링 정보 확인
application.yml상에 있는 DB 정보와, 터널링 된 Port가 맞지 않았습니다.
아래 application.yml 예시입니다.
spring:
config.activate.on-profile: #{profile}
myServer:
datasource:
hikari:
jdbc-url: jdbc:mysql://localhost:{port}/mydb?characterEncoding=UTF-8&serverTimezone=Asia/Seoul
username: myName
password: ${spring.datasource.password}
driver-class-name: com.mysql.cj.jdbc.Driver
위의 jdbc-url에 있는 localhost:{port} 부분에 들어간 {port}의 값과,
DB 터널링에 사용된 port 값이 일치해야 DB 연결이 정상적으로 이뤄집니다.
이렇게 무사히 문제를 해결하였습니다.
다만 해당 오류 메세지가 port 정보와 관련이 있는 줄은 이번에 배웠습니다.
제가 다른 프로젝트도 병행하면서 DB 터널링 설정을 제 때 바꿔주지 않은 것이 원인이 되었는데요,
다른 DB 스키마에 연결을 시도하면서 해당 에러가 발생한 게 아닐까 싶습니다.
저와 비슷하게 MySQL 8.0 업데이트 이후 설정을 완료하였는데도 동일한 에러가 발생하는 분들께도 도움이 되었으면 좋겠습니다!