1. MySQL Connector/J 다운로드 및 프로젝트 설정
Java 애플리케이션에서 MySQL 데이터베이스에 접근하기 위해서는 JDBC(Java Database Connectivity) 드라이버가 필요합니다. MySQL 공식 사이트에서 'Platform Independent' 버전을 선택하여 Connector/J JAR 파일을 다운로드합니다.
다운로드한 JAR 파일을 프로젝트에 연동하는 일반적인 단계는 다음과 같습니다.
- 프로젝트 루트 경로에
libs또는lib폴더를 생성합니다. - 다운로드한
mysql-connector-java-xxx.jar파일을 해당 폴더에 복사합니다. - IDE(Eclipse, IntelliJ 등)의 Build Path 설정에서 해당 JAR 파일을 라이브러리로 추가(Add to Build Path)합니다.
2. 데이터베이스 연결 관리 클래스 구현
데이터베이스 연결을 효율적으로 관리하기 위해 싱글톤 형태나 정적 메서드를 활용한 연결 클래스를 작성합니다. 최신 드라이버 클래스명인 com.mysql.cj.jdbc.Driver를 사용해야 합니다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DatabaseConnector {
private static final String URL = "jdbc:mysql://localhost:3306/demo?serverTimezone=UTC";
private static final String USER = "root";
private static final String PASSWORD = "your_password";
private static Connection connection = null;
static {
try {
// 드라이버 로드
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
System.err.println("JDBC 드라이버를 찾을 수 없습니다.");
e.printStackTrace();
}
}
public static Connection openConnection() throws SQLException {
if (connection == null || connection.isClosed()) {
connection = DriverManager.getConnection(URL, USER, PASSWORD);
}
return connection;
}
public static void closeConnection() {
try {
if (connection != null && !connection.isClosed()) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
3. 데이터 처리 모델(DTO) 정의
데이터베이스의 테이블 구조와 매핑되는 간단한 사용자 정보 클래스를 정의합니다.
import java.math.BigDecimal;
public class UserDTO {
private String userId;
private String userPw;
private BigDecimal balance;
public UserDTO(String userId, String userPw, BigDecimal balance) {
this.userId = userId;
this.userPw = userPw;
this.balance = balance;
}
// Getters and Setters
public String getUserId() { return userId; }
public String getUserPw() { return userPw; }
public BigDecimal getBalance() { return balance; }
}
4. SQL 실행 및 CRUD 기능 구현
Statement를 활용하여 테이블 생성, 데이터 삽입, 조회 및 수정 기능을 수행하는 로직입니다.
import java.sql.*;
import java.util.List;
public class UserRepository {
private Connection conn;
public UserRepository(Connection conn) {
this.conn = conn;
}
// 테이블 생성
public void initTable() {
String sql = "CREATE TABLE IF NOT EXISTS member (" +
"username VARCHAR(50) PRIMARY KEY, " +
"password VARCHAR(50) NOT NULL, " +
"point DECIMAL(15, 2) DEFAULT 0.00)";
try (Statement stmt = conn.createStatement()) {
stmt.execute(sql);
} catch (SQLException e) {
e.printStackTrace();
}
}
// 데이터 삽입
public void saveUsers(List<UserDTO> userList) {
try (Statement stmt = conn.createStatement()) {
for (UserDTO user : userList) {
String query = String.format(
"INSERT INTO member VALUES ('%s', '%s', %s)",
user.getUserId(), user.getUserPw(), user.getBalance()
);
stmt.executeUpdate(query);
}
} catch (SQLException e) {
System.err.println("데이터 삽입 중 오류 발생: " + e.getMessage());
}
}
// 사용자 정보 단건 조회
public UserDTO findUserById(String id) {
String query = "SELECT * FROM member WHERE username = '" + id + "'";
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(query)) {
if (rs.next()) {
return new UserDTO(
rs.getString("username"),
rs.getString("password"),
rs.getBigDecimal("point")
);
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
// 비밀번호 수정
public boolean updatePassword(String id, String oldPw, String newPw) {
UserDTO user = findUserById(id);
if (user != null && user.getUserPw().equals(oldPw)) {
String query = "UPDATE member SET password = '" + newPw + "' WHERE username = '" + id + "'";
try (Statement stmt = conn.createStatement()) {
stmt.executeUpdate(query);
return true;
} catch (SQLException e) {
e.printStackTrace();
}
}
return false;
}
}
5. 실행 및 연동 테스트
메인 메서드에서 전체 프로세스를 통합하여 테스트합니다.
import java.math.BigDecimal;
import java.util.Arrays;
public class DatabaseApp {
public static void main(String[] args) {
try {
Connection conn = DatabaseConnector.openConnection();
UserRepository repo = new UserRepository(conn);
// 1. 테이블 초기화
repo.initTable();
// 2. 데이터 저장
repo.saveUsers(Arrays.asList(
new UserDTO("kim", "p123", new BigDecimal("5000.00")),
new UserDTO("lee", "p456", new BigDecimal("7500.50"))
));
// 3. 데이터 조회
UserDTO kim = repo.findUserById("kim");
if (kim != null) {
System.out.println("조회 결과: " + kim.getUserId() + " / 잔액: " + kim.getBalance());
}
// 4. 데이터 수정
boolean isUpdated = repo.updatePassword("kim", "p123", "newPass789");
System.out.println("비밀번호 변경 성공 여부: " + isUpdated);
} catch (Exception e) {
e.printStackTrace();
} finally {
DatabaseConnector.closeConnection();
}
}
}
6. 주요 발생 예외 상황
연동 과정에서 다음과 같은 에러가 발생할 수 있으니 주의가 필요합니다.
- SQLException (Access denied): 계정 아이디 또는 비밀번호가 틀렸을 때 발생합니다.
- ClassNotFoundException: JDBC 드라이버 JAR 파일이 Build Path에 정상적으로 등록되지 않았을 때 발생합니다.
- UnknownHostException / CommunicationsException: 데이터베이스 서버 주소(localhost 등)가 잘못되었거나 서버가 구동 중이지 않을 때 발생합니다.