2025년 7월 23일 수요일(41일차)

Jeonghoon·2025년 7월 23일

jeonghoon's Study

목록 보기
43/128

💾 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 {
        // 1️⃣ MySQL 드라이버 로드
        Class.forName("com.mysql.cj.jdbc.Driver");
        
        // 2️⃣ DB 서버 연결
        conn = DriverManager.getConnection(DB_URL, DB_ID, DB_PWD);
        System.out.println("✅ DB 연결 성공");
    } catch (Exception e) {
        System.out.println("❌ DB 연결 실패 : " + e);
    }
}
항목설명
🧩 DB_URLjdbc: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()intDML (INSERT / UPDATE / DELETE) 실행 결과로 영향받은 행의 수 반환
.executeQuery()ResultSetSELECT 실행 결과 반환 (결과 집합 반복은 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()컬럼명 또는 인덱스로 값 가져오기

0개의 댓글