-
[김영한 스프링] 04. JDBC 이해 - JDBC 개발 등록Spring/스프링 DB 1편 - 데이터 접근 핵심 원리 2023. 10. 17. 19:50
JDBC 개발 - 등록
여기서는 JDBC를 사용해서 회원(Member) 데이터를 데이터베이스에 관리하는 기능을 개발해 보자.
주의!
H2 데이터베이스 설정 마지막에 있는 테이블과 샘플 데이터 만들기를 통해서 member 테이블을 미리 만들어 두어야 한다.schema.sql
drop table member if exists cascade;
create table member (
member_id varchar(10),
money integer not null default 0,
primary key (member_id)
);Member
package hello.jdbc.domain; import lombok.Data; @Data public class Member { private String memberId; private int money; public Member() { } public Member(String memberId, int money) { this.memberId = memberId; this.money = money; } }
main/java/hello/jdbc/domain/Member 생성
회원의 ID와 해당 회원이 소지한 금액을 표현하는 단순한 클래스이다. 앞서 만들어둔 member 테이블에 데이터를 저장하고 조회할 때 사용한다.
가장 먼저 JDBC를 사용해서 이렇게 만든 회원 객체를 데이터베이스에 저장해 보자.
MemberRepositoryV0 - 회원 등록
main/java/hello/jdbc/repository/MemberRepository 생성
package hello.jdbc.repository; import hello.jdbc.connection.DBConnectionUtil; import hello.jdbc.domain.Member; import lombok.extern.slf4j.Slf4j; import java.sql.*; /** * JDBC - DriverManager 사용 */ @Slf4j public class MemberRepositoryV0 { 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.error("error", e); } } if (stmt != null) { try { stmt.close(); } catch (SQLException e) { log.error("error", e); } } if (con != null) { try { con.close(); } catch (SQLException e) { log.error("error", e); } } } private Connection getConnection() { return DBConnectionUtil.getConnection(); } }
커넥션 획득
- getConnection() : 이전에 만들어둔 DBConnectionUtil를 통해서 데이터베이스 커넥션을 획득한다.
save() - SQL 전달
- sql : 데이터베이스에 전달할 SQL을 정의한다. 여기서는 데이터를 등록해야 하므로 insert sql을 준비했다.
- con.prepareStatement(sql) : 데이터베이스에 전달할 SQL과 파라미터로 전달할 데이터들을 준비한다.
- sql : insert into member(member_id, money) values(?, ?)"
- pstmt.setString(1, member.getMemberId()) : SQL의 첫번째 ?에 값을 지정한다. 문자이므로 setString을 사용한다.
- pstmt.setInt(2, member.getMoney()) : SQL의 두번째 ?에 값을 지정한다. Int형 숫자이므로 setInt를 지정한다.
- pstmt.executeUpdate() : Statement를 통해 준비된 SQL을 커넥션을 통해 실제 데이터베이스에 전달한다. 참고로 executeUpdate()은 int를 반환하는데 영향받은 DB row 수를 반환한다. 여기서는 하나의 row를 등록했으므로 1을 반환한다.
executeUpdate()
int executeUpdate() throws SQLException;
리소스 정리
쿼리를 실행하고 나면 리소스를 정리해야 한다. 여기서는 Connection, PreparedStatement를 사용했다. 리소스를 정리할 때는 항상 역순으로 해야 한다. Connection을 먼저 획득하고 Connection을 통해 PreparedStatement를 만들었기 때문에 리소스를 반환할 때는 PreparedStatement를 먼저 종료하고, 그다음에 Connection을 종료하면 된다. 참고로 여기서 사용하지 않은 ResultSet은 결과를 조회할 때 사용한다. 조금 뒤에 조회 부분에서 알아보자.
주의
리소스 정리는 꼭! 해주어야 한다. 따라서 예외가 발생하든, 하지 않든 항상 수행되어야 하므로 finally 구문에 주의해서 작성해야 한다. 만약 이 부분을 놓치게 되면 커넥션이 끊어지지 않고 계속 유지되는 문제가 발생할 수 있다. 이런 것을 리소스 누수라고 하는데, 결과적으로 커넥션 부족으로 장애가 발생할 수 있다.참고
PreparedStatement는 Statement의 자식 타입인데, ?를 통한 파라미터 바인딩을 가능하게 해준다.
참고로 SQL Injection 공격을 예방하려면 PreparedStatement를 통한 파라미터 바인딩 방식을 사용해야 한다.MemberRepositoryV0Test - 회원 등록
package hello.jdbc.repository; import hello.jdbc.domain.Member; import org.junit.jupiter.api.Test; import java.sql.SQLException; import static org.junit.jupiter.api.Assertions.*; class MemberRepositoryV0Test { MemberRepositoryV0 repository = new MemberRepositoryV0(); @Test void crud() throws SQLException { Member member = new Member("memberV0", 10000); repository.save(member); } }
test/java/hello/jdbc/repository/MemberRepositoryV0Test 생성
결과
출처 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1
'Spring > 스프링 DB 1편 - 데이터 접근 핵심 원리' 카테고리의 다른 글
[김영한 스프링] 06. 커넥션풀과 데이터소스 이해 - 커넥션 풀, DataSource 이해 (0) 2023.10.18 [김영한 스프링] 05. JDBC 이해 - JDBC 개발 조회, 수정, 삭제 (1) 2023.10.18 [김영한 스프링] 03. JDBC 이해 - 데이터베이스 연결 (1) 2023.10.17 [김영한 스프링] 02. JDBC 이해 - JDBC 이해 & 최신 데이터 접근 기술 (1) 2023.10.17 [김영한 스프링] 01. JDBC 이해 - 프로젝트 생성 & 세팅 & H2 데이터베이스 설정 (0) 2023.10.17