💾 DB - Java 연동 (DAO 구성 완벽 가이드)
🧠 [ DAO란? ]
DAO (Data Access Object) 는 데이터베이스와 직접 통신하는 계층으로, DB 연결과 CRUD 기능을 수행한다.
| 항목 | 설명 |
|---|
| 📘 역할 | 데이터베이스에 접근하여 데이터의 조회, 저장, 수정, 삭제 수행 |
| 🧩 위치 | MVC 패턴에서 Model 계층에 속함 |
| ⚙️ 구성 요소 | JDBC 연결, SQL 실행, 결과 반환 |
🧱 [ 1️⃣ 싱글톤 패턴 구성 ]
DAO 클래스는 하나의 인스턴스만 존재하도록 싱글톤(Singleton) 으로 구성한다.
private 클래스명() {
connectDB();
}
private static final 클래스명 instance = new 클래스명();
public static 클래스명 getInstance() { return instance; }
| 항목 | 설명 |
|---|
| 🧩 private 생성자 | 외부에서 객체 생성을 막고 내부에서만 생성 |
| 🔁 static 인스턴스 | 클래스 로딩 시 단 1회만 생성 |
| ⚙️ getInstance() 메소드 | 외부에서 객체를 얻는 유일한 접근 통로 |
🧠 사용 계층 구분
| 계층 | 싱글톤 사용 여부 | 이유 |
|---|
| 🧭 View | ✅ 사용 | UI는 1개만 존재해도 충분 |
| 🧩 Controller | ✅ 사용 | 제어 기능은 공통으로 재사용 가능 |
| 💾 DAO | ✅ 사용 | DB 접근 로직은 공통 사용 가능 |
| 📦 DTO | ❌ 미사용 | 각 요청마다 다른 데이터를 가져야 함 |
🔌 [ 2️⃣ 데이터베이스 연동 메소드 구성 ]
DAO가 생성될 때 자동으로 DB와 연결되도록 설정한다.
private String DB_URL = "jdbc:mysql://IP주소:PORT번호/DB명";
private String DB_ID = "DB계정명";
private String DB_PWD = "DB비밀번호";
private Connection conn;
public void connectDB() {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection(DB_URL, DB_ID, DB_PWD);
System.out.println("✅ DB 연결 성공");
} catch (Exception e) {
System.out.println("❌ DB 연결 실패 : " + e);
}
}
| 항목 | 설명 |
|---|
| 🧩 DB_URL | jdbc:mysql://IP:PORT/DB명 형태의 접속 주소 |
| 🧑💻 DB_ID / DB_PWD | 데이터베이스 로그인 계정 정보 |
| 🔗 Connection 객체 | DB와 Java를 연결하는 통로 |
| ⚙️ Class.forName() | JDBC 드라이버를 메모리에 로드 |
| ⚡ DriverManager.getConnection() | DB 연결을 생성하고 Connection 반환 |
📜 [ 3️⃣ DB 연동 후 기능 구현 순서 ]
DAO 내 모든 기능은 DB와 통신하며 SQL → 실행 → 결과 반환 순으로 진행된다.
⚙️ 전체 흐름 요약
| 단계 | 코드 | 설명 |
|---|
| ① | SQL 작성 | SQL 문법에 맞게 쿼리 작성 (?는 매개변수로 표시) |
| ② | SQL 객체 생성 | PreparedStatement ps = conn.prepareStatement(SQL); |
| ③ | 매개변수 대입 | ps.setXXX(1, 값); |
| ④ | SQL 실행 | executeUpdate() or executeQuery() |
| ⑤ | 결과 반환 | 결과 처리 후 return |
💻 예시 코드
public boolean insertData(String name, int age) {
try {
String SQL = "INSERT INTO member (name, age) VALUES (?, ?)";
PreparedStatement ps = conn.prepareStatement(SQL);
ps.setString(1, name);
ps.setInt(2, age);
int result = ps.executeUpdate();
return result > 0;
} catch (Exception e) {
System.out.println("❌ SQL 오류: " + e);
return false;
}
}
🔍 [ SQL 실행 메소드 비교 ]
| 메소드 | 반환 타입 | 설명 |
|---|
.executeUpdate() | int | DML (INSERT / UPDATE / DELETE) 실행 결과로 영향받은 행의 수 반환 |
.executeQuery() | ResultSet | SELECT 실행 결과 반환 (결과 집합 반복은 rs.next()) |
🧩 [ ResultSet 활용 예시 ]
String SQL = "SELECT * FROM member";
PreparedStatement ps = conn.prepareStatement(SQL);
ResultSet rs = ps.executeQuery();
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println(id + " : " + name);
}
| 항목 | 설명 |
|---|
| 🧱 rs.next() | 다음 행으로 이동 (없으면 false 반환) |
| ⚙️ getInt(), getString() | 컬럼명 또는 인덱스로 값 가져오기 |