Spring Boot에 MySQL & JPA 연동할 때 에러폭탄 해결(feat. gradle)
미친에러
에러 아니고 그냥 연동하는건 build.gradle
에 MySQL, JPA 의존성 넣어주고 리로드하고 application.properties
에 설정 해주면 된다.
근데 나는 무수한 에러의 손짓을 받아서 에러정리를 해보려 한다.
에러 얘기하기 전에 내 MySQL 설정 어케했나
이름 root. 비번 대충. test table 삭제…(이게 원흉이었던 것 같기도,,).. 암튼 남들과 다를 바 없었다.
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 에러
application.properties에 넣어주는 설정값들 중 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
이 있었다.
여러 블로그들에 공통적으로 나와 있는 코드를 복사 붙여넣기 했는데 com.mysql.cj.jdbc.Driver
에 빨간줄이 싸악 떠서 당황.,,
버전에 따라 이름이 다르다고 하는데 구버전에선 cj
가 빠진다. 근데 나는 구버전이 아니었고…
외않되? 하고 혹시나 싶어 External Libraries 봤더니 mysql 없음,.,,
build.gradle
들어가서 코끼리 다시 돌려주니 정상적으로 도라왔다.
Could not find mysql:mysql-connector-java:
이젠 되겠지 하고 돌려보니 또 에러 폭탄.
구글링 돌려보니 mysql-connector-java 잘 설치됐는지 확인하란다,,, 나 방금 그거 해결한 것 같은데..?
근데 기가막히게 봤는데 없다. 귀신이 곡할 노릇,,,
그래서 여차저차 찾다가 버전 명시를 안 해줘서 그런가 하고 dependency에 버전을 넣어줬다.
implementation 'mysql:mysql-connector-java:8.0.31'
그랬더니 됨.. 도대체 뭔데.. 기준이 뭔데…1!!
Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when ‘hibernate.dialect’ not set
이…. 이게 뭐여
바로 구글링 ㄱ
여기서 등장하는 hibernate
는 데이터베이스에 접근할 때 쓰는 친구라고 한다.
hibernate.dialect가 설정이 안되어있어서 생기는 에러같은데, 이게 뭔데?
데이터베이스와 통신을 하기 위에 사용하는 언어라고 한다. 나는 MySQL을 쓸거니까 MySQL 쿼리 쓸거임~ 하고 명시해줘야 한다는 뜻.
그래서 application.properties에 해당 부분을 추가해줬다.
spring.jpa.database=mysql
이 에러에 대해 정말 잘 정리해둔 블로그 발견. 자고로 블로그 글은 이정도 되어야하는 듯 하고,,, 나는 또 반성의 시간,,,
Caused by: com.mysql.cj.exceptions.UnableToConnectException: Public Key Retrieval is not allowed
산 넘어 산.
Public Key Retrieval이 허용되지 않았다고? 뭔데요 ㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜ
이쯤되니 이해하려는 생각보다 에러 없는 로그를 보고 싶은 생각으로 무지성 구글링. 는 쩌는 글 참고.
MySQL 8.0 버전부터 보안 이슈로 useSSL 옵션에 대한 추가 설정이 필요해졌다고 한다. 그래서 위와 같은 에러가 발생하면 다음 옵션을 확인하자.
useSSL: DB에 SSL로 연결
allowPublicKeyRetrieval: 서버에서 RSA 공개키를 검색하거나 가져와야하는지
나는 무지성 긁어오기로 useSSL=false는 설정을 했는데 allowPublicKeyRetrieval은 설정을 하지 않아서 생긴 문제였다.
역시나 application.properties에 있는 url에 다음 쿼리를 추가했다
# allowPublicKeyRetrieval=true 설정
spring.datasource.url=jdbc:mysql://localhost:3306/world?useSSL=false&allowPublicKeyRetrieval=true&useUnicode=true&serverTimezone=Asia/Seoul
unknown database ‘world’
최종보스.
아니 얘는 딱 봐도 world라는 데이터베이스가 없어서 생긴 문제같은데 나는 MySQL 설정할 때 그 어떤 데이터베이스도 만들어두지 않았다…….고……..
그게 문제였던듯. (근데 도대체 어디서 world라는 애가 있던걸까 도대체 어디에..?)
갓택오버플로우 선생님들의 말에 따라 해당 이름의 데이터베이스를 생성해줬더니 해결..~~…..ㅠ
결론
살려줘.
댓글남기기