Spring DB - JDBC란?

SeungTaek·2022년 6월 29일
0
post-thumbnail

본 게시물은 스스로의 공부를 위한 글입니다.
잘못된 내용이 있으면 댓글로 알려주세요!

JDBC 이해

일반적으로 클라이언트가 데이터를 저장, 조회하면 다음과 같은 과정을 통해 DB를 사용하게 된다.

여기서 우리가 집중할 부분은 애플리케이션 서버와 DB와의 연결이다. 주로 TCP/IP를 이용해 커넥션 연결 후 SQL을 전달하여 DB에게 결과를 응답받는다.

하지만 문제는 각각의 데이터베이스마다 커넥션을 연결하는 방법, SQL을 전달하는 방법, 결과를 응답받는 방법이 다르다는 점이다.

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


JDBC(Java Database Connectivity)는 자바에서 DB를 사용할 수 있도록 지원하는 인터페이스 API다.

대표적으로 3가지 기능을 표준 인터페이스로 제공한다.
1. java.sql.Connection - 연결
2. java.sql.Statement - SQL을 담은 내용
3. java.sql.ResultSet - SQL 요청 응답

이 인터페이스의 구현체는 각각의 DB 회사들이 라이브러리로 제공한다. 이를 JDBC 드라이버라 한다.

즉, 개발자는 이 표준 인터페이스를 사용해서 개발하면 된다.


SQL Mapper, ORM

최근에는 이런 JDBC를 직접 사용하는 일 보다는, 다양한 편의를 제공하는 SQL Mapper나 ORM을 통해 JDBC를 사용하는 경우가 많다.

SQL Mapper란, 객체와 DB의 데이터를 매핑시켜주는 기술이다. SQL 응답 결과를 객체로 변환시켜주고, JDBC의 반복 코드를 제거해 주는 등의 장점이 있지만, 여전히 개발자가 SQL을 직접 작성해야 한다는 단점이 있다. 예시로 MyBatis, 스프링 JdbcTemplate이 이에 해당된다.

ORM이란 객체와 DB 테이블을 연결해주는 기술이다. 이를 사용하면 개발자는 SQL을 작성하지 않아도 되며, 따라서 각각의 데이터베이스마다 다른 SQL을 사용할 필요도 없다. Java ORM의 인터페이스 표준을 JPA라 하고, 이를 구현한 구현체가 하이버네이트와 이클립스링크이다. 주로 하이버네이트를 사용한다.


JDBC의 직접 사용 예시

1. 커넥션 얻기

  • Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);

  • DriverManager은 라이브러리에 등록된 DB 드라이버들을 관리하고, 커넥션을 리턴해준다.

  • 이때 URL, userName, password 등 접속에 필요한 추가 정보를 인자로 준다. 이 정보를 가지고 연결 가능한 DB의 커넥션을 리턴해준다.


2. insert 예시 (예외 처리 구문 생략)

public Member save(Member member) throws SQLException {
  String sql = "insert into member(member_id, money) values (?, ?)";

  // 1. 커넥션 얻기
  Connection con = DriverManager.getConnection(URL, USERNAME, PASSWORD);
  
  // 2. SQL 세팅 후 DB에 전달하기
  PreparedStatement pstmt = con.prepareStatement(sql);
  pstmt.setString(1, member.getMemberId()); // 첫 번째 ?에 string으로 세팅
  pstmt.setInt(2, member.getMoney()); // 두 번째 ?에 int로 세팅
  pstmt.executeUpdate();
        
  // 3. 연결 끊기 (역순으로)
  if (stmt != null) stmt.close();
  if (con != null) con.close();
  
  return member
}
  • PreparedStatement로 SQL 안에 있는 ?를 파라미터 바인딩을 통해 데이터를 세팅할 수 있다. 만약 모든 데이터들을 String으로 sql을 세팅하게 된다면, sql injection에 취약해진다. 따라서 pstmt.setString(? 순서, 데이터) 등을 통해 데이터를 세팅해준다.
  • pstmt.executeUpdate()를 통해 DB에 전달해준다. 해당 메소드는 영향받은 DB row 수를 int형으로 리턴해준다.

2. select 예시 (예외 처리 구문 생략)

public Member findById(String memberId) throws SQLException {
  String sql = "select * from member where member_id = ?";
  
  // 1. 커넥션 얻기
  Connection con = DriverManager.getConnection(URL, USERNAME, PASSWORD);
  
  // 2. SQL 세팅 후 DB에 전달하기 & 결과 받기
  PreparedStatement pstmt = pstmt = con.prepareStatement(sql);
  pstmt.setString(1, memberId);
  ResultSet rs = pstmt.executeQuery();
  
  if (rs.next()) {
    Member member = new Member();
    member.setMemberId(rs.getString("member_id")); // string으로 리턴
    member.setMoney(rs.getInt("money")); // int로 리턴
  }
  
  // 3. 연결 끊기 (역순으로), JdbcUtil 사용
  JdbcUtils.closeResultSet(rs);
  JdbcUtils.closeStatement(stmt);
  JdbcUtils.closeConnection(con);
  
  return member;
}
  • 데이터를 변경(insert, update, delete)시에는 pstmt.executeUpdate()를 사용하지만, 조회시에는 pstmt.executeQuery()를 사용한다.
  • ResultSet에는 결과가 반환된다. 내부에 있는 커서를 이동해서 다음 데이터를 조회할 수 있다. 최초의 커서는 데이터를 가리키고 있지 않기 때문에 최초 한번은 rs.next()를 최초 한번은 호출해야 데이터를 조회할 수 있다.
  • rs.next()==true라면 다음 데이터가 존재한다는 뜻이다. 따라서 조회한 데이터가 많을 경우 while을 통해 데이터들을 접근할 수 있다.
  • 스프링은 JDBC를 편리하게 다룰 수 있는 JdbcUtils라는 편의 메서드를 제공한다. 이를 사용하면 편리하게 close할 수 있다.




Reference

인프런 '스프링 DB - 데이터 접근 핵심 원리'(김영한)

profile
I Think So!

0개의 댓글