오늘 하루, develop

1. JDBC 이해 본문

DB

1. JDBC 이해

toZoe 2025. 7. 20. 21:06

회사에서 일을 하면서, DB에 대해 모르는 게 너무 많다는 생각이 들어 DB 공부를 시작한다!

김영한님의 스프링 DB 1편을 듣고, 또 관련해서 찾아보면서 공부한 내용을 정리하려고 한다.


 

# JDBC

애플리케이션 서버와 DB가 연결할 때 크게 3가지 과정을 거친다.

1. 커넥션 연결 : 주로 TCP/IP를 사용해서 커넥션을 연결한다.

2. SQL 전달: 애플리케이션 서버는 DB가 이해할 수 있는 SQL을 연결된 커넥션을 통해 DB에 전달한다.

3. 결과 응답: DB는 전달된 SQL을 수행하고 그 결과를 응답한다. 애플리케이션 서버는 응답 결과를 활용한다.

 

그러나, 각각의 데이터베이스마다 이 3가지를 수행하는 방법이 다르다는 것이다.

그러면 DB가 변경될 때마다 관련 소스를 모두 수정해야 하고, 그때마다 개발자는 해당 DB의 연결방법에 대해 새롭게 공부해야 한다.

 

이런 문제를 해결하기 위해 JDBC라는 자바 표준이 등장한다!

JDBC (Java Database Connectivity) : 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API (표준 인터페이스)

 

대표적으로 다음 3가지 기능을 표준 인터페이스로 정의해서 제공한다.

  • java.sql.Connection : 연결
  • java.sql.Statement : SQL을 담은 내용
  • java.sql.ResultSet : SQL 요청 응답



# JDBC 드라이버

이러한 JDBC 인터페이스를 각각의 DB벤더(회사)에서 자신의 DB에 맞도록 구현해서 라이브러리로 제공하는데, 이것을 JDBC 드라이버라 한다. (인터페이스를 제공하는 건 JDBC, 결국 구현하는 건 각 DB 벤더!)

 

* 이후에 나오지만 이 JDBC를 더욱 편리하게 쓸 수 있도록 SQL Mapper와 ORM 기술이 등장한다.

  그러나 결국엔 SQL Mapper와 ORM 모두 내부적으로는 JDBC를 사용한다.

 

# DriverManager

데이터베이스에 연결하려면 JDBC가 제공하는 DriverManager.getConnection(..)을 사용하면 된다. 이렇게 하면 라이브러리에 있는 데이터베이스 드라이버를 찾아서 해당 드라이버가 제공하는 커넥션을 반환해준다.

DriverManager은 라이브러리에 등록된 DB 드라이버들을 관리하고, 커넥션을 획득하는 기능을 제공한다.

 

1. 애플리케이션 로직에서 커넥션이 필요하면 DriverManager.getConnection()을 호출한다.

2. DriverManager는 라이브러리에 등록된 드라이버 목록을 자동으로 인식한다. 이 드라이버들에게 순서대로 다음 정보를 넘겨서 커넥션을 획득할 수 있는지 확인한다.

3. 여기서 각각의 드라이버는 URL 정보를 체크해서 본인이 처리할 수 있는 요청인지 확인한다.

4-1. 처리할 수 있으면 DB에 연결해서 커넥션을 획득하고 이 커넥션을 클라이언트에 반환한다. 

4-2. 본인이 처리할 수 없으면 다음 드라이버에게 순서를 넘긴다.

 

# 코드

public class MemeberRepository{
	public Member save(Member member) throws SQLException {
    	String sql = "insert into member(member_id, money) values(?, ?)";
        
        Connection con = null;
        PreparedStatement pstmt = null;
        
        try {
            con = getConnection();
            pstmt = con.prepareStatement(sql);
            pstmt.setString(1, member.getMemberId());
            pstmt.setInt(2, member.getMoney());
            pstmt.executeUpdate(); // 데이터를 변경하는 경우
            
            return member;     
        } catch(SQLException e) {
        	log.error("db error", e);
        	throw e;        
        } finally {
        	close(con, pstmt, null);        
        }
    }
    
    private void close (Connection con, Statement stmt, ResultSet rs){
    	if(rs != null) {
            try{
            	rs.close();
            } catch (SQLException e){
            	log.info("error", e);
            }
    	}
        
        if(stmt != null) {
            try{
            	stmt.close();
            } catch (SQLException e){
            	log.info("error", e);
            }
    	}
        
        if(con != null) {
            try{
            	con.close();
            } catch (SQLException e){
            	log.info("error", e);
            }
    	}
    }
    
    private Connection getConnection(){
    	return DBConnectionUtil.getConnection();
    }
    
}

 

쿼리를 실행하고 나면 리소스를 정리해야 한다. 정리할 때는 언제나 역순으로!

Connection을 획득하고 이를 통해 PreparedStatement를 만들고 이를 통해 ResultSet을 가져오므로 리소스 정리는 반대로 해야 한다.

 

* 데이터를 조회하는 경우에는 pstmt.executeUpdate()가 아닌,  pstmt.executeQuery()를 사용한다. executeQuery()는 결과를 ResultSet에 담아서 반환한다.

 

# ResultSet

  • ResultSet 내부에는 커서가 있다. 이 커서가 이동해서 다음 데이터(row)를 조회할 수 있다.
  • 커서는 rs.next() 를 통해 이동할 수 있다.
  • 최초의 커서는 데이터를 가리키고 있지 않기 때문에 rs.next()를 최초 한번은 호출해야 데이터를 조회할 수 있다.
  • 사용 예시) rs.getString("member_id), rs.getInt("money")

 


출처

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1/dashboard

 

스프링 DB 1편 - 데이터 접근 핵심 원리| 김영한 - 인프런 강의

현재 평점 5점 수강생 18543명인 강의를 만나보세요. 백엔드 개발에 필요한 DB 데이터 접근 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 DB 접근 기술의 원리와 구조를 이해하고, 더 깊

www.inflearn.com