[DB] MySQL DB와 Eclipse 연결하기

소이뎁·2023년 12월 8일
3

Database

목록 보기
6/7
post-thumbnail

📍 DB 서버 세팅

Local에 MySQL Community Server을 설치하여 Local을 DB 서버로 만든다. 설치는 해당 블로그를 참고한다.

📍 MySQL DB와 Eclipse 연결

1) 프로젝트의 클래스패스에 MySQL DB와 상호작용을 위한 라이브러리 추가

  • 프로젝트가 MySQL DB에 접근할수 있게 하기 위한 과정이다.
  • MySQL의 Connector/J(Operating System: Platform Independent) 다운로드
  • 다운받은 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를 반환한다.

1개의 댓글

comment-user-thumbnail
2023년 12월 10일

자세한 설명 감사합니다. 종종 보러올게요^^

답글 달기