동빈나 선생님의 JSP게시판 만들기 강의 4강을 학습하던 중 발생한 에러.
참고로, MySQL 8.0 버전을 사용했다.
JDBC Connector 역시 8.0.17 버전이다.
(댓글을 보니, MySQL 5.x 버전을 사용하니 해결이 되었다는 사람도 있었으니, 참고하시면 될 듯하다.)
* 문제 및 해결
아이디와 비밀번호를 입력해서
데이터베이스에 들어있는 정보와 일치하면, 로그인이 되도록 구현을 했다.
그리하여 실행을 하면,
다음과 같은 에러가 뜨는 것이다..
java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
우선, 구글링을 좀 해보니
원인은 데이터베이스에 사용자가 접근을 할 수가 없었다는 것이다.
root계정이 데이터베이스로 접근이 불가능하다는 사실이 이해가 안 되었다.
구글에서는 mysql에서 권한을 주라고 하는데, 도무지 어떻게 하는지 몰라서 더 알아보던 도중
bitnami서버가 문제가 될 수 있다고 한다.
이 서버가 구동중일 경우, 위와 같은 오류가 발생할 수 있다고 했다.
혹시 몰라서 검색을 해보니,
엥?
언제 설치했는지도 몰랐던 bitnami서버가 실행되고 있었다.
아래의 stop bitnami wamp stack service를 눌러서, 당장 서버를 종료했다.
서버는 즉시 종료되었고,
이것이 mysql과 관련이 있는지, mysql의 서버 환경이 바뀌었다는 메시지도 동시에 떴다.
다시, jsp를 실행시켜보니,
이번엔 또 다른 오류가 발생^^..
Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone
value '????α? ????' is unrecognized or represents more than one time zone.
MySQL의 타임존을 Connection과정에서 읽어오는데 실패한 것이 이유이다.
MySQL 5.1.X 이후 버전부터 빈번하게 발생하는 에러라고 한다.
해결방법은 접속할 데이터베이스 URL뒤에 serverTimezone=UTC 를 추가 작성해주는 것이다.
public UserDAO() {
try {
String dbURL = "jdbc:mysql://localhost:3306/BBS?serverTimezone=UTC";
String dbID = "id";
String dbPassword = "password";
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(dbURL, dbID, dbPassword);
} catch(Exception e) {
e.printStackTrace();
}
}
위와 같이, 접속 URL 뒤에 작성해 주면 해결된다.
정상적으로 작동되는 것을 볼 수 있다.