[DB 접근 기술] JDBC 개발 - 등록, 조회

2022. 5. 25. 05:45Database/DB 접근 기술

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

 

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

백엔드 개발에 필요한 DB 데이터 접근 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 DB 접근 기술의 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., - 강의

www.inflearn.com

김영한 강사님의 인프런 강의를 수강 후 블로그에 정리해서 포스팅합니다. 


먼저 Member 테이블을 생성한다.

create table member (
 member_id varchar(10),
 money integer not null default 0,
 primary key (member_id)
);

DB와 매핑할 Member 클래스를 생성한다.

@Data
public class Member {
     private String memberId;
     private int money;
     public Member() {
     }
     public Member(String memberId, int money) {
     this.memberId = memberId;
     this.money = money;
     }
}

@Data 어노테이션은 Lombok 라이브러리로, Getter, Setter, toString, 생성자 등의 작성 코드를 줄여주는 라이브러리다. DTO에 필수다.

Member클래스에는 회원의 ID와 회원이 소지한 금액을 표현하는 단순한 클래스다.

먼저 JDBC를 이용해 회원 객체를 DB에 저장해보자.

public class MemberRepositoryV0 {
     public Member save(Member member) throws SQLException {  // 회원을 저장한다.
     String sql = "insert into member(member_id, money) values(?, ?)"; 
	 //DB에 전달할 SQL을 정의한다. 
     Connection con = null;
     PreparedStatement pstmt = null;
     
     try {
         con = getConnection();  // 이전에 만든 DBConnectionUtil을 통해 커넥션을 획득한다.
         					     // 위에 소스코드를 추가했다.
         pstmt = con.prepareStatement(sql);  
         pstmt.setString(1, member.getMemberId());  //파라미터 바인딩
         pstmt.setInt(2, member.getMoney());
         pstmt.executeUpdate();  // 준비된 SQL을 커넥션을 통해 실제 DB에 전달한다. 
         return member;
     } catch (SQLException e) {
     	log.error("db error", e);
    	throw e;
     } finally {
     	close(con, pstmt, null);
     }
     }
     
     //쿼리를 실행한 뒤 리소스를 정리한다. 정리는 사용한 역순으로 실행한다.
     // 정리는 반드시 해주어야 하므로 finally 블록에서 실행한다. 리소스 누수를 막아야 한다.
     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();
 }

다음은 저장한 회원을 조회하는 기능이다.

public Member findById(String memberId) throws SQLException {
     String sql = "select * from member where member_id = ?";
     Connection con = null;
     PreparedStatement pstmt = null;
     ResultSet rs = null;  //조회 결과가 담긴다.
     try {
         con = getConnection();
         pstmt = con.prepareStatement(sql);
         pstmt.setString(1, memberId);
         rs = pstmt.executeQuery();
         if (rs.next()) {
             Member member = new Member();
             member.setMemberId(rs.getString("member_id"));
             member.setMoney(rs.getInt("money"));
             return member;
         } else {
             throw new NoSuchElementException("member not found memberId=" +
            memberId);
         }
     } catch (SQLException e) {
         log.error("db error", e);
         throw e;
     } finally {
     	close(con, pstmt, rs);
     }
}

여기서는 단건(회원의 id)으로 조회하므로, ResultSet의 데이터를 가져와서 뿌릴 때 while문이 아닌 if문을 사용했다.