FullStack Study/9주차

JAVA 풀스택 37일차 - JDBC2

레몬팡777 2026. 5. 19. 08:59

1. JDBCTemplate

JDBC에서 반복되는 코드를 따로 모아두는 클래스 (반복되는 코드를 따로 빼기)

기존 JDBC는 

Class.forName(...)

DriverManager.getConnection(...)

con.close()

위 코드들을 항상 적어야 하기 때문에 코드가 길어지기에 이를 해결하기 위한 클래스

1-1 JDBCTemplate 안에 포함되는 기능

기능 역할
getConnection() DB 연결
close() 연결 종료

2. getConnection()

Oracle DB 연결 생성 메소드

public static Connection getConnection()

- 드라이버 등록

- DB 연결

- Auto Commit 설정

2-1 getConnection() 전체 코드

public class JDBCTemplate {

    // 1. DB 연결 메소드
    // 다른 클래스에서 getConnection()을 호출하면
    // Oracle DB와 연결된 Connection 객체를 반환해준다.
    public static Connection getConnection() {

        // Connection 객체를 담을 변수
        Connection con = null;

        // 1-1. Oracle JDBC 드라이버 등록
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            // Java가 Oracle DB와 연결할 수 있도록 드라이버를 불러오는 코드
        } catch (ClassNotFoundException e) {
            System.out.println("[Error] 드라이버 등록 실패");
            e.printStackTrace();
        }

        // 1-2. DB 연결 정보
        String url = "jdbc:oracle:thin:@localhost:1521/orcl";
        String id = "ID";
        String pw = "PW";

        // 1-3. DB 연결
        try {
            con = DriverManager.getConnection(url, id, pw);
            // url, id, pw를 이용해서 DB에 접속

            con.setAutoCommit(false);
            // 자동 커밋 해제
            // INSERT, UPDATE, DELETE 후
            // 직접 commit() 또는 rollback() 하기 위해 설정

        } catch (SQLException e) {
            System.out.println("[Error] 오라클 연결 실패");
            e.printStackTrace();
        }

        // 1-4. 연결된 Connection 객체 반환
        return con;
    }
 }

2-2 Auto Commit

자동 저장 기능 활성화 여부

con.setAutoCommit(false);

false : 비활성화

true : 활성화

직접 commit, rollback 처리 가능

3. close()

사용 끝난 DB 연결 종료

public static void close(Connection con)

- Connection 종료

- Statement 종료

- ResultSet 종료

3-1 close() 전체 코드

public class JDBCTemplate {
    // 2. Connection 종료 메소드
    // DB 연결 종료
    public static void close(Connection con) {
        try {
            if(con != null) {
                con.close();
            }
        } catch (SQLException e) {
            System.out.println("[Error] con close 실패");
            e.printStackTrace();
        }
    }

    // 3. Statement 종료 메소드
    // SQL 실행 도구 종료
    public static void close(Statement stmt) {
        try {
            if(stmt != null) {
                stmt.close();
            }
        } catch (SQLException e) {
            System.out.println("[Error] stmt close 실패");
            e.printStackTrace();
        }
    }

    // 4. ResultSet 종료 메소드
    // SELECT 결과 저장 객체 종료
    public static void close(ResultSet rs) {
        try {
            if(rs != null) {
                rs.close();
            }
        } catch (SQLException e) {
            System.out.println("[Error] rs close 실패");
            e.printStackTrace();
        }
    }
}

4. 다른 클래스에서 사용

4-1 static import

다른 클래스의 static 메소드를 클래스명 없이 바로 사용할 수 있게 해주는 기능

import static common.JDBCTemplate.*;

- 클래스명 없이 메소드 사용 가능

getConnection();

 해당 형식으로 클래스명을 생략하여 사용 가능

 

4-2 static 없이 import

import common.JDBCTemplate.*;
JDBCTemplate.getConnection();

메소드 앞에 클래스명이 항상 붙여야 한다.

5. executeUpdate()

데이터를 추가, 수정, 삭제하기 위해 사용하는 기

int res = stmt.executeUpdate(sql);

- res에 SQL 실행 결과로 몇 개의 행이 영향을 받았는지 저장

5-2 executeQuery()와 executeUpdate() 차이

메소드 사용 SQL 결과
executeQuery() SELECT ResultSet 반환
executeUpdate() INSERT, UPDATE, DELETE int 반환

SELECT 일 때

조회 결과가 필요하기에 ResultSet으로 결과를 받는다.

ResultSet rs = stmt.executeQuery(sql);

INSERT 일 때

몇 행이 추가되었는지 확인하기 때문에 int로 결과를 받는다.

int res = stmt.executeUpdate(sql);

 

5-3 executeUpdate() 반환

if(res > 0) {
    System.out.println("insert 성공");
} else {
    System.out.println("insert 실패");
}

res 반환값으로 추가/수정/삭제 성공 여부 출력 가능

6. PreparedStatement

SQL문을 미리 준비하고, 값을 나중에 넣는 방식

String sql = " INSERT INTO MYTEST VALUES(?,?,?) ";

- ? 는 나중에 값을 넣을 자리

7.  PreparedStatement 사용 순서

7-1 SQL 작성

String sql = " INSERT INTO MYTEST VALUES(?,?,?) ";

7-2 PreparedStatement 생성

pstm = con.prepareStatement(sql);

7-3 ?에 값 넣기

pstm.setInt(1, no);
pstm.setString(2, name);
pstm.setString(3, nickName);

7-4 실행

int res = pstm.executeUpdate();

8. Statement와 PreparedStatement 비교

  Statement PreparedStatement
SQL 작성 문자열 직접 연결 ? 사용
값 넣기 문자열에 직접 포함 setInt(), setString()
가독성 복잡함 깔끔함
실수 가능성 높음 낮음
보안 상대적으로 취약 더 안전함

9. Delete

테이블에서 데이터를 삭제하는 SQL

String sql = " DELETE FROM MYTEST WHERE MNAME=? ";

9-1 PreparedStatement로 DELETE 실행

String name = new Scanner(System.in).next();

pstm = con.prepareStatement(sql);
pstm.setString(1, name);

int res = pstm.executeUpdate();
1. 사용자가 이름 입력

2. ? 자리에 이름 넣기
3. DELETE 실행
4. 삭제된 행 개수 반환