반응형

토비의 스프링을 본격적으로 공부하기 위해 첫 장을 펼치고 DAO 예제 코드를 따라치고 있었는데 오류가 났다.(참고로 카테고리를 Java로 한 이유는 아직 Spring에 대한 내용을 배우지 않았기 때문이다.)
첫 오류는 이랬다. 바로 Exception in thread "main" java.lang.ClassNotFoundException: org.mariadb.jdbc.Drive였다.

찾아보니 MariaDB Connector를 설치해야 했다. 정확한 명칭은 'MariaDB Connector/J'였다. 이것은 너무나 당연했는데 오랜만에 기초부터 다시 하다보니 멍청하게도 잊고 있었다.

2024.06.09 - [개발일기/Java] - [Java]Java와 mariaDB 연결하기_'MariaDB Connector/J'

 

[Java]Java와 mariaDB 연결하기_'MariaDB Connector/J'

java와 db(Database)를 연결하기 위해서는 JDBC(Java Database Connectivity)라는 API가 필요하다. 구체적으로 말하면 JDBC는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바API이다.현재 나는 mariaDB를 쓰

jobkid.tistory.com

모듈을 다운받아 설치를 했음해도 똑같은 오류가 났다.

원인이 무엇일까 고민하다가 mariaDB 공식문서를 천천히 읽어나갔다. 그런데 새로운 사실을 발견했다. 이 사실이 오류 해결의 실마리가 됐다.

https://mariadb.com/kb/en/about-mariadb-connector-j/

공식문서에 따르면 Java와 mariaDB를 연결하기 위해서는 두 가지 표준 방법이 있다는 것이다.

먼저 DriverManager의 getConnection 메소드를 사용하는 것과 두 번째는 Class.forName("org.mariadb.jdbc.Drive")를사용하는 것이다. 즉 둘 중에 하나만 사용하라는 것이었다.

Using DriverManager 내용을 구글 번역기로 돌려보면 다음과 같다. "MariaDB Connector/J와 연결하는 가장 좋은 방법은 DriverManager 클래스를 사용하는 것입니다. DriverManager 클래스를 사용하여 MariaDB 커넥터/J를 찾고 로드하는 경우 애플리케이션에 추가 구성이 필요하지 않습니다. DriverManager 클래스는 MariaDB Connector/J를 ​​자동으로 로드하여 다른 JDBC 드라이버와 동일한 방식으로 사용할 수 있도록 합니다." 밑의 하늘색 상자에 적힌 글이 Class.forName을 사용하는 두 번째 방법이다.

나는 두 가지 방법을 동시에 코딩했던 것이다. 책에서는 동시에 작성돼있는데 말이다. 현재 책은 mysql 기준으로 DAO에 대해서 설명하고 있어서 mariaDB도 똑같다고 판단했다. 아마 내 기억에도 mysql은 동시에 다 사용하는 것 같았다.

실제 책의 내용은 이렇다.

Class.forName("com.mysql.jdbc.Driver");
Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/springbook?, "spring", "book");

하지만 나는 이 부분을 아래와 같이 바꿨다. DriverManager 클래스의 getConnection 메소드를 사용하기로 했다.

//		Class.forName("com.mysql.jdbc.Driver");
		Connection c = DriverManager.getConnection("jdbc:mariadb://localhost:3306/toby_spring_study?user=DB접속계정&password=DB접속비밀번호");
// 참고로 DB접속계정과 비밀번호는 여러분 자신의 계정과 비밀번호로 설정해줘야 한다.

전체적인 DAO 소스를 보면 다음과 같다.

package springbook.user.dao;

import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import springbook.user.domain.User;


public class UserDao {
	

	public void add(User user) throws ClassNotFoundException, SQLException{
//		Class.forName("org.mariadb.jdbc.Drive");
		Connection c = DriverManager.getConnection("jdbc:mariadb://localhost:3306/toby_spring_study?user=DB접속계정&password=DB접속비밀번호");
		
		PreparedStatement ps = c.prepareStatement("insert into users(id, name, password) values (?, ?, ?)");
		ps.setString(1, user.getId());
		ps.setString(2, user.getName());
		ps.setString(3, user.getPassword());
		
		ps.executeUpdate();
		ps.close();
		c.close();
		
	}
	
	public User get(String id) throws ClassNotFoundException, SQLException{
//		Class.forName("com.mysql.jdbc.Driver");
		Connection c = DriverManager.getConnection("jdbc:mariadb://localhost:3306/toby_spring_study?user=DB접속계정&password=DB접속비밀번호");
		PreparedStatement ps = c.prepareStatement("SELECT * FROM users WHERE id = ?");
		ps.setString(1, id);
		
		ResultSet rs = ps.executeQuery();
		rs.next();
		User user = new User();
		user.setId(rs.getString("id"));
		user.setName(rs.getString("name"));
		user.setPassword(rs.getString("password"));
		
		rs.close();
		ps.close();
		c.close();
		
		return user;
	}
	
}

참고로 자바 빈과 Test main 메소드도 올려보겠다.

package springbook.user.domain;

public class User {
	String id;
	String name;
	String password;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}
package springbook.user.test;

import java.sql.SQLException;
import springbook.user.dao.UserDao;
import springbook.user.domain.User;

public class Test {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// TODO Auto-generated method stub
		UserDao dao = new UserDao();
		
		User user = new User();
		user.setId("jobkid");
		user.setName("잡키드");
		user.setPassword("1111");
		
		dao.add(user);
		System.out.println(user.getId() + " : 등록 성공");
		
		User user2 = dao.get(user.getId());
		System.out.println(user2.getName());
		System.out.println(user2.getPassword());
		System.out.println(user2.getId()+" : 조회 성공");
	}

}

main에서 RunTime을 실행한 결과 eclipse 콘솔 창에 다음과 같은 결과가 나온다.

아직 토비의 스프링의 가장 맨 처음 단계를 공부하고 있지만 하루에 소단원 한 개씩 나가면서 돌발 문제가 생기면 해결하는 과정을 올려봐야 겠다.

토비의 스프링 책을 산지 1년이 지났는데 바쁘다는 핑계로 미루다가 올해 상반기 말이 돼서야 처음 펼쳤다. 아직 내 갈 길은 멀지만 천리길도 한 걸음 부터다.

반응형

+ Recent posts