Local에 MySQL Community Server을 설치하여 Local을 DB 서버로 만든다. 설치는 해당 블로그를 참고한다.
1) 프로젝트의 클래스패스에 MySQL DB와 상호작용을 위한 라이브러리 추가
- 프로젝트가 MySQL DB에 접근할수 있게 하기 위한 과정이다.
mysql-connector-j-8.2.0
폴더 > mysql-connector-j-8.2.0.jar
파일 복사apache-tomcat-9.0.83
폴더 > lib
폴더(= 클래스패스 내부의 폴더)에 붙여넣기👉
mysql-connector-j-8.2.0.jar
파일
- MySQL DB와 Java 프로그램 간의 연결을 지원하는 MySQL Connector/J의 라이브러리 파일이다.
- Java 프로그램이 MySQL DB에 접근하고 상호 작용할 수 있도록 필요한 클래스 및 메서드를 제공한다. (ex. import java.sql.*)
2) MySQL DB 연결 코드 작성
🚩 필드
mysqlService
: MysqlService 인스턴스를 저장하는 필드, 싱글톤 패턴 구현에 사용url
,id
,password
: MySQL DB 연결/접속에 필요한 JDBC URL(DB명까지 작성), 아이디, 비밀번호를 저장하는 필드conn
: Connection 객체를 저장하는 필드, DB 연결에 사용statement
: Statement 객체를 저장하는 필드, 쿼리를 실행하는데 사용res
: ResultSet 객체를 저장하는 필드, 쿼리 실행 결과를 반환하는 데 사용
🚩 메소드
getInstance()
: MysqlService 인스턴스 생성 메소드(싱글톤 패턴)connect()
: DB 접속 메소드disconnect()
: DB 접속 해제 메소드update()
: CUD 메소드select()
: R 메소드
🟢 src/main/java/com/test/common/MysqlService.java
package com.test.common;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class MysqlService {
// 🚩 필드
private static MysqlService mysqlService = null;
private static final String url = "jdbc:mysql://localhost:3306/test_230914"; // 접속할 DB명까지 작성
private static final String id = "root";
private static final String password = "root";
private Connection conn = null; // DB 연결에 사용(connect, disconnect)
private Statement statement; // 쿼리 실행에 사용(connect, disconnect, update, select)
private ResultSet res; // 쿼리 실행 결과를 나타내는데 사용(select)
// 🚩 메소드
// ⭐️ MysqlService 인스턴스 생성(싱글톤 패턴)
// MysqlService 인스턴스가 하나만 생성되도록 하여 DB가 여러 MysqlService 인스턴스에 연결되지 않도록 한다.
public static MysqlService getInstance() {
if (mysqlService == null) {
mysqlService = new MysqlService();
}
return mysqlService;
}
// ⭐️ DB 접속
public void connect() {
try {
// 1. MySQL JDBC 드라이버를 메모리에 로딩
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
// 2. DB와 연결
conn = DriverManager.getConnection(url, id, password);
// 3. Statement 객체 생성
statement = conn.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
}
// ⭐️ DB 접속 해제
public void disconnect() {
try {
statement.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
// ⭐️ CUD
public void update(String query) throws SQLException {
statement.executeUpdate(query);
}
// ⭐️ R
public ResultSet select(String query) throws SQLException {
res = statement.executeQuery(query);
return res;
}
}
👉 싱글톤 패턴(Singleton Pattern)
- 어떤 클래스가 최대 하나의 인스턴스만을 가지도록 하고, 그 인스턴스에 대한 전역적인 접근을 제공하는 패턴이다.
- 특정 클래스의 인스턴스가 어플리케이션 내에서 오직 하나만 존재하도록 보장할 수 있다.
👉 Exception 처리
connect()
,disconnect()
: try-catch문. 일반적으로 해당 메소드에서 발행하는 예외는 DB와의 상호 작용(접속/해제)에서 발생할 수 있는 예외이므로, DB와의 상호 작용을 처리하는 클래스(MysqlService)에서 처리한다.update()
,select()
: throw. 일반적으로 해당 메소드에서 발행하는 예외는 쿼리 실행 시 발생할 수 있는 예외이므로, 쿼리를 작성한 클래스(메소드를 호출한 클래스)에서 처리하도록 위임한다.
3) 연동 잘 되었는지 테스트 - Servlet에서 DB 데이터 가져오기
update()
,select()
사용 시, try-catch문으로 예외 처리를 한다.- 인터페이스 ResultSet의
next()
를 사용하여 데이터의 행을 순회할 수 있다.- 인터페이스 ResultSet의
get자료형()
을 사용하여 ResultSet 객체의 현재 행에서 지정된 열의 값을 Java 프로그래밍 언어의자료형
으로 가져올 수 있다.
// 🟢 src/main/java/com/test/lesson04/Lesson04Ex01.java
package com.test.lesson04;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.test.common.MysqlService;
@WebServlet("/lesson04/ex01")
public class Lesson04Ex01 extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
// ⭐️ 헤더 설정(setCharacterEncoding은 Filter에서 처리)
response.setContentType("text/plain");
// ⭐️ MysqlService 인스턴스 생성 & DB 연결
MysqlService ms = MysqlService.getInstance();
ms.connect();
// ⭐️ 쿼리 실행
PrintWriter out = response.getWriter();
String query = "select * from `real_estate`;";
try {
ResultSet res = ms.select(query);
while(res.next()) {
out.println(res.getString("address"));
}
} catch (SQLException e) {
e.printStackTrace();
}
// ⭐️ DB 연결 해제
ms.disconnect();
}
}
👉 ResultSet 인터페이스의
next()
- Java의 JDBC(Java Database Connectivity) API에 속한 인터페이스 ResultSet의 메소드이다.
- 커서를 현재 행에서 다음 행으로 이동한다.
- 다음 행으로 이동할 수 있으면 true를 반환하고, 더 이상 다음 행이 없으면 false를 반환한다.
자세한 설명 감사합니다. 종종 보러올게요^^