[개요]
Spring을 통해 프로젝트를 진행하기 위해 로컬 DB인 MySQL을 연결하려 한다. Spring은 내부적으로 자체적인 DB 관련 애플리케이션이 존재한다. 그래서 미리 정의된 변수에 올바른 값만 넣어준다면 쉽게 DB와 연결할 수 있다. 해당 변수는 src/main/resources/application.properties 파일에서 할당할 수 있다. 그런데 값을 할당하는 과정에서 제대로 된 값을 넣었는데 연결을 실패하는 경우가 있다. 이들의 공통점을 분석해보고, 어떻게 하면 문제가 생기지 않을지 정리해보겠다.
[본문]
# MySQL
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/testDb
spring.datasource.username=test
spring.datasource.password=test
위는 정상적으로 동작하는 application.properties 파일이다.
# MySQL
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/testDb
spring.datasource.username='test'
spring.datasource.password='test'
그러나 이를 위와 같이 single quote를 붙이고 실행하면 다음과 같은 에러가 발생한다.
2024-02-14T17:23:29.185+09:00 ERROR 65057 --- [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization.
java.sql.SQLException: Access denied for user 'spring'@'localhost' (using password: YES)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:130) ~[mysql-connector-j-8.3.0.jar:8.3.0]
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-j-8.3.0.jar:8.3.0]
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:815) ~[mysql-connector-j-8.3.0.jar:8.3.0]
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:438) ~[mysql-connector-j-8.3.0.jar:8.3.0]
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241) ~[mysql-connector-j-8.3.0.jar:8.3.0]
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:189) ~[mysql-connector-j-8.3.0.jar:8.3.0]
at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-5.0.1.jar:na]
분명 아이디와 비밀번호는 올바르게 입력했는데 왜 에러가 발생하나 싶었다. 그래서 현재 root는 비밀번호가 설정 되어 있지 않아 password를 없애고 spring.datasource.username='root'로 변경하여 실행해보았다. 이렇게 하니 정상적으로 연결이 되는 것이다. 이로써 MySQL에 등록한 test라는 유저의 권한이 이상이 있을 것 같아 예전에 추가해둔 권한을 확인해보았다.
mysql> show grants for test@localhost;
+--------------------------------------------------------------+
| Grants for test@localhost |
+--------------------------------------------------------------+
| GRANT SELECT ON *.* TO `test`@`localhost` |
| GRANT ALL PRIVILEGES ON `testDb`.* TO `test`@`localhost` |
+--------------------------------------------------------------+
2 rows in set (0.05 sec)
이미 test라는 유저는 testDb라는 데이터베이스에 대해 모든 권한을 가지고 있다. 그렇기 때문에 권한 문제는 아니라 생각했다. 이로써 현재 상황을 정리하면 다음과 같다.
- username='test', password='test'로 하면 실패한다.
- 'test'는 testDb 데이터베이스의 테이블에 대한 모든 권한을 갖고 있다.
- username='root'로 하면 성공한다.
위 사실을 갖고 혹시 비밀번호가 잘못 되었나 싶어서 single quote를 제거하여 password=spring이라 해봤다. 이렇게 하자 바로 성공하게 되었다. password는 따옴표가 포함 되지 않은 상태로 해야 정상적으로 읽어갈 수 있는 것 같다.
[결론]
이후 실험을 더 해보니 아래와 같은 결과가 나왔다.
- username, password 둘 다 double quote는 지원하지 않는다.
- username만 single quote를 문자열을 감싸는 용도로 지원한다. password는 별도의 문자로 인식한다.
- 둘 다 따옴표를 사용하지 않아도 가능하다.
앞으로 application.properties 파일을 작성할 때 따옴표를 굳이 따로 붙이지 않아도 될 것 같다.
'Spring' 카테고리의 다른 글
cascade = CascadeType.ALL과 orphanRemoval = true 차이 (0) | 2024.02.27 |
---|---|
단위 테스트와 통합 테스트 (0) | 2024.01.25 |
Service 객체의 책임과 Facade 디자인 패턴 (2) | 2024.01.23 |
[개요]
Spring을 통해 프로젝트를 진행하기 위해 로컬 DB인 MySQL을 연결하려 한다. Spring은 내부적으로 자체적인 DB 관련 애플리케이션이 존재한다. 그래서 미리 정의된 변수에 올바른 값만 넣어준다면 쉽게 DB와 연결할 수 있다. 해당 변수는 src/main/resources/application.properties 파일에서 할당할 수 있다. 그런데 값을 할당하는 과정에서 제대로 된 값을 넣었는데 연결을 실패하는 경우가 있다. 이들의 공통점을 분석해보고, 어떻게 하면 문제가 생기지 않을지 정리해보겠다.
[본문]
# MySQL
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/testDb
spring.datasource.username=test
spring.datasource.password=test
위는 정상적으로 동작하는 application.properties 파일이다.
# MySQL
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/testDb
spring.datasource.username='test'
spring.datasource.password='test'
그러나 이를 위와 같이 single quote를 붙이고 실행하면 다음과 같은 에러가 발생한다.
2024-02-14T17:23:29.185+09:00 ERROR 65057 --- [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool initialization.
java.sql.SQLException: Access denied for user 'spring'@'localhost' (using password: YES)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:130) ~[mysql-connector-j-8.3.0.jar:8.3.0]
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-j-8.3.0.jar:8.3.0]
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:815) ~[mysql-connector-j-8.3.0.jar:8.3.0]
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:438) ~[mysql-connector-j-8.3.0.jar:8.3.0]
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241) ~[mysql-connector-j-8.3.0.jar:8.3.0]
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:189) ~[mysql-connector-j-8.3.0.jar:8.3.0]
at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-5.0.1.jar:na]
분명 아이디와 비밀번호는 올바르게 입력했는데 왜 에러가 발생하나 싶었다. 그래서 현재 root는 비밀번호가 설정 되어 있지 않아 password를 없애고 spring.datasource.username='root'로 변경하여 실행해보았다. 이렇게 하니 정상적으로 연결이 되는 것이다. 이로써 MySQL에 등록한 test라는 유저의 권한이 이상이 있을 것 같아 예전에 추가해둔 권한을 확인해보았다.
mysql> show grants for test@localhost;
+--------------------------------------------------------------+
| Grants for test@localhost |
+--------------------------------------------------------------+
| GRANT SELECT ON *.* TO `test`@`localhost` |
| GRANT ALL PRIVILEGES ON `testDb`.* TO `test`@`localhost` |
+--------------------------------------------------------------+
2 rows in set (0.05 sec)
이미 test라는 유저는 testDb라는 데이터베이스에 대해 모든 권한을 가지고 있다. 그렇기 때문에 권한 문제는 아니라 생각했다. 이로써 현재 상황을 정리하면 다음과 같다.
- username='test', password='test'로 하면 실패한다.
- 'test'는 testDb 데이터베이스의 테이블에 대한 모든 권한을 갖고 있다.
- username='root'로 하면 성공한다.
위 사실을 갖고 혹시 비밀번호가 잘못 되었나 싶어서 single quote를 제거하여 password=spring이라 해봤다. 이렇게 하자 바로 성공하게 되었다. password는 따옴표가 포함 되지 않은 상태로 해야 정상적으로 읽어갈 수 있는 것 같다.
[결론]
이후 실험을 더 해보니 아래와 같은 결과가 나왔다.
- username, password 둘 다 double quote는 지원하지 않는다.
- username만 single quote를 문자열을 감싸는 용도로 지원한다. password는 별도의 문자로 인식한다.
- 둘 다 따옴표를 사용하지 않아도 가능하다.
앞으로 application.properties 파일을 작성할 때 따옴표를 굳이 따로 붙이지 않아도 될 것 같다.
'Spring' 카테고리의 다른 글
cascade = CascadeType.ALL과 orphanRemoval = true 차이 (0) | 2024.02.27 |
---|---|
단위 테스트와 통합 테스트 (0) | 2024.01.25 |
Service 객체의 책임과 Facade 디자인 패턴 (2) | 2024.01.23 |