Java

2024.06.18 JDBC ์‹ค์Šต ์˜ˆ์ œ (๊ฐ™์ด ๋งŒ๋“ค์–ด๋ณด๊ธฐ)

์ •ํ›ˆ5 2024. 6. 18. 09:16

 

๐Ÿ’ก ํ•™์Šต ๋ชฉํ‘œ 

 JDBC๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ  ํ•™์ƒ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•ด ๋ณด์ž.

- ํ•™์ƒ์˜ ์ •๋ณด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค.
- ํ•™์ƒ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€, ์กฐํšŒ, ์ˆ˜์ •, ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

 

  1. ๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ
    • ํ•™์ƒ ์ •๋ณด ์ถ”๊ฐ€
    • ํ•™์ƒ ์ •๋ณด ์กฐํšŒ
    • ํ•™์ƒ ์ •๋ณด ์ˆ˜์ •
    • ํ•™์ƒ ์ •๋ณด ์‚ญ์ œ
  2. ๋น„๊ธฐ๋Šฅ ์š”๊ตฌ์‚ฌํ•ญ
    • ์‚ฌ์šฉ์ž ์นœํ™”์ ์ธ ์ฝ˜์†” ์ธํ„ฐํŽ˜์ด์Šค ์ œ๊ณต
    • ์ ์ ˆํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐ ๋กœ๊ทธ ๊ธฐ๋ก
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ํ’€ ์‚ฌ์šฉ(HikariCP)

 

>> ํ”„๋กœ์ ํŠธ ์„ค๊ณ„ <<

  1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค๊ณ„ ๋ฐ ํ…Œ์ด๋ธ” ์ƒ์„ฑ
  2. ํ…Œ์ด๋ธ” - tbstudent ์ปฌ๋Ÿผ - id, name, age, email
create database studentdb;

CREATE TABLE students (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    age INT NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE
);

 

๋งŒ๋“ค์–ด ๋ณด๊ธฐ

 

DBConnectionManager

package ver2;

import java.sql.Connection;
import java.sql.SQLException;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

/*
 * ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด - ๋‹จ ํ•˜๋‚œ์˜ ๊ฐ์ฒด๋งŒ ํ•„์š”ํ•จ์„ ๋ณด์žฅํ•ด์•ผ ํ•œ๋‹ค๋ฉด
 * ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์œผ๋กœ ์„ค๊ณ„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
 */
public class DBConnectionManager {
	
	// ์ž๊ธฐ ์ž์‹ ์˜ ์ฐธ์กฐ ์ฃผ์†Œ๊ฐ’์„ ๋‹ด์„ ๋ณ€์ˆ˜ ์ƒ์„ฑ ๋‹จ, private
	private static DBConnectionManager instance;
	private HikariDataSource dataSource;
	
	// ์ƒ์„ฑ์ž๋ฅผ <--- ์™ธ๋ถ€์—์„œ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ ๋ชป ํ•˜๊ฒŒ ๋ง‰์•„์•ผ ํ•œ๋‹ค.
	private DBConnectionManager() {
		HikariConfig config = new HikariConfig(); // ๊ฐ์ฒด์ƒ์„ฑ
		config.setJdbcUrl(" jdbc:mysql://localhost:3306/studentdb?serverTimezone=Asia/Seoul ");
		config.setUsername("root");
		config.setPassword("asd123");
		config.setMaximumPoolSize(10);
		dataSource = new HikariDataSource(config);
	} // end of DBConnectionManager()
	
	// ์™ธ๋ถ€์—์„œ ํด๋ž˜์Šค์ด๋ฆ„.getxxx ๋ฉ”์„œ๋“œ๋ฅผ ๋งŒ๋“ค์–ด ์ฃผ๋ฉด ๋œ๋‹ค.
	// ํ•œ๋ฒˆ์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์ ‘๊ทผํ•˜๋„๋ก ๋™๊ธฐํ™” ์ ์šฉ 
	public synchronized DBConnectionManager getInstance() {
		if (instance == null) {
			instance = new DBConnectionManager();
		}
		return instance;
	} // end of getInstance()
	
	// Connection ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ (๊ตฌํ˜„์ฒด - HikariCP ์ด๋‹ค.)
	public Connection getConnection() throws SQLException{
		return dataSource.getConnection();
	} // end of getConnection()
	
} // end of class

 

 StudentDTO 

package ver2.model;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

// DTO์˜ ๊ธฐ๋Šฅ์€ ๋‹จ์ง€ ๋ฐ์ดํ„ฐ๋งŒ ๋‹ด๋Š” ์—ญํ• ์„ ํ•˜๋Š”๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
// ๊ธฐ๋Šฅ๋„ ์ถ”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

@Data  // getter setter ๋™์‹œ์— ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ๋‹ค.
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
public class StudentDTO {
	
	private int id;
	private String name;
	private int age;
	private String email;

} // end of class

 

StudentDAO

package ver2;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import ver2.model.StudentDTO;

// ๋ฌผ๋ก  ๊ธฐ๋Šฅ ์„ค๊ณ„๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๊ณ  ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
public class StudentDAO {
	
	// ํ•™์ƒ ์ •๋ณด ์ถ”๊ฐ€ ๊ฐ€๋Šฅ ๋งŒ๋“ค๊ธฐ
	public void addStudent(StudentDTO dto) throws SQLException {
		String query = " INSERT INTO students (name, age, email) values(?, ?, ?) ";
		try(
				Connection conn = DBConnectionManager.getInstance().getConnection()
				) {
			PreparedStatement pstmt = conn.prepareStatement(query);
			pstmt.setString(1, dto.getName());
			pstmt.setInt(2, dto.getAge());
			pstmt.setString(3, dto.getEmail());
			pstmt.executeUpdate();
		} 
	}
	
	// ํ•™์ƒ์˜ ์•„์ด๋””๋กœ ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ (id ๋˜๋Š” ์ด๋ฆ„์œผ๋กœ ๋งŽ์ด ํ•œ๋‹ค.)
	public StudentDTO getStudentbyId(int id) throws SQLException {
		
		String query = " SELECT * FROM students WHERE id = ? ";
		
		try(
				Connection conn = DBConnectionManager.getInstance().getConnection()
				) {
			PreparedStatement pstmt = conn.prepareStatement(query);
			pstmt.setInt(1, id);
			
			try(ResultSet rs = pstmt.executeQuery()) {
				if (rs.next()) {
					return new StudentDTO(rs.getInt("id"), rs.getString("name"), rs.getInt("age"), rs.getString("email"));
				}
				
			}
			
		} 
		
		// todo ์ˆ˜์ •ํ•˜๊ธฐ
		return null;
	}
	
	// ํ•™์ƒ ์ „์ฒด ์กฐํšŒ ๊ธฐ๋Šฅ
	public List<StudentDTO> getAllStudents() throws SQLException{
		// tip - ๋ฆฌ์ŠคํŠธ๋ผ๋ฉด ๋ฌด์กฐ๊ฑด ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ
		List<StudentDTO> list = new ArrayList<>();
		String query = " SELECT * FROM students ";
		
		try(
				Connection conn = DBConnectionManager.getInstance().getConnection()
				) {
			PreparedStatement pstmt = conn.prepareStatement(query);
			ResultSet rs = pstmt.executeQuery();
			
			while (rs.next()) {
				// ๋ฉ”์„œ๋“œ ์ฒด์ด๋‹ ๊ธฐ๋ฒ•
			 	StudentDTO dto = new StudentDTO().builder()
				.id(rs.getInt("id"))
				.name(rs.getString("name"))
				.age(rs.getInt("age"))
				.email(rs.getString("email"))
				.build();
			 list.add(dto);
			}
		} 
		// todo ์ˆ˜์ •ํ•˜๊ธฐ
		return list;
	}
	
	// ํ•™์ƒ ์ •๋ณด ์ˆ˜์ •ํ•˜๊ธฐ
	public void updateStudent(String name, StudentDTO dto) throws SQLException {
		String query = " UPDATE SET name = ?, age = ?, email = ? WHERE name = ? ";
		try(
				Connection conn = DBConnectionManager.getInstance().getConnection();
				) {
			PreparedStatement pstmt = conn.prepareStatement(query);
			pstmt.setString(1, dto.getName());
			pstmt.setInt(2, dto.getAge());
			pstmt.setString(3, dto.getEmail());
			pstmt.setString(4, name); // ์กฐ๊ฑด๊ฐ’ ์…‹ํŒ…
			pstmt.executeUpdate();
			
		} catch (Exception e) {
			// TODO: handle exception
		}
		
	}
	
	// ํ•™์ƒ ์ •๋ณด ์‚ญ์ œํ•˜๊ธฐ
	public void deleteStudent(int id) throws SQLException {
		String query = " DELETE FROM students WHERE id = ? ";
		try(
				Connection conn = DBConnectionManager.getInstance().getConnection();
				) {
			PreparedStatement pstmt = conn.prepareStatement(query);
			pstmt.setInt(1, id);
			pstmt.executeUpdate();
			
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	
} // end of class

 

 

StudentManagementSystem

package ver2;

import java.sql.SQLException;
import java.util.List;

import ver2.model.StudentDTO;

public class StudentManagementSystem {
	
	private static final StudentDAO studentDAO = new StudentDAO();
	
	public static void main(String[] args) {
		
		// ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” ๋ถ€๋ถ„ ๊พธ๋ฉฐ ์ค˜๋„ ๋œ๋‹ค.
		
		try {
			List<StudentDTO> list =  studentDAO.getAllStudents();
			System.out.println(list.size());
			System.out.println(list.toString());
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		
		
	} // end of main

} // end of class