728x90


문제 : 각각의 데이터베이스마다 커넥션을 연결하는 방법, SQL을 전달하는 방법, 응답 받는 방법이 모두 다르다.
JDBC 표준 인터페이스

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


◎ 참고 : 표준화의 한계
- 각각의 데이터베이스마다 SQL, 데이터타입 등의 일부 사용법 다르다.
ex) 실무에서 기본으로 사용하는 페이징 SQL은 각각의 데이터베이스마다 사용법이 다르다. - 결국 데이터베이스를 변경하면 JDBC 코드는 변경하지 않아도 되지만 SQL은 해당 데이터베이스에 맞도록 변경해야한다.
JDBC와 최신 데이터 접근 기술


SQL Mapper
- 장점: JDBC를 편리하게 사용하도록 도와준다.
SQL 응답 결과를 객체로 편리하게 변환해준다.
JDBC의 반복 코드를 제거해준다. - 단점: 개발자가 SQL을 직접 작성해야한다.
- 대표 기술: 스프링 JdbcTemplate, MyBatis

ORM 기술
- ORM은 객체를 관계형 데이터베이스 테이블과 매핑해주는 기술이다.
- 각각의 데이터베이스마다 다른 SQL을 사용하는 문제도 중간에서 해결해준다.
- 대표 기술: JPA, 하이버네이트, 이클립스링크
- JPA는 자바 진영의 ORM 표준 인터페이스이고, 구현체로 하이버네이트와 이클립스 링크 등의 구현 기술이 있다.
DB 연결

- JDBC는java.sql.Connection 표준 커넥션 인터페이스를 정의한다.
- H2 데이터베이스 드라이버는 JDBC Connection 인터페이스를 구현한 org.h2.jdbc.JdbcConnection 구현체를 제공한다.

H2 데이터베이스 드라이버 라이브러리
runtimeOnly 'com.h2database:h2' //h2-x.x.xxx.jar
JDBC 개발
※ 회원 등록, 조회, 수정, 삭제 기능 중 수정 기능에 대해서만 작성하겠다.
JDBC 개발 - 조회
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);
}
}
- rs = pstmt.executeQuery() 데이터를 변경할 때는 executeUpdate() 를 사용하지만,
데이터를 조회할 때는 executeQuery() 를 사용한다. executeQuery() 는 결과를 ResultSet 에 담아서 반환한다.
executeQuery()
ResultSet executeQuery() throws SQLException;
ResultSet

- (1-1) 에서 rs.next() 를 호출한다.
- (1-2) 의 결과로 cursor 가 다음으로 이동한다. 이 경우 cursor 가 가리키는 데이터가 있으므로 true 를 반환한다.
- (2-1) 에서 rs.next() 를 호출한다.
- (2-2) 의 결과로 cursor 가 다음으로 이동한다. 이 경우 cursor 가 가리키는 데이터가 있으므로 true 를 반환한다.
- (3-1) 에서 rs.next() 를 호출한다.
- (3-2) 의 결과로 cursor 가 다음으로 이동한다. 이 경우 cursor 가 가리키는 데이터가 없으므로 false 를 반환한다.
반응형
'Spring > DB 1편' 카테고리의 다른 글
자바 예외 이해 (0) | 2023.08.09 |
---|---|
스프링과 문제 해결 - 트랜잭션 (0) | 2023.08.09 |
트랜잭션 이해 (0) | 2023.08.09 |
커넥션풀과 데이터 소스 이해 (0) | 2023.08.09 |
H2 데이터베이스 설정 (0) | 2023.08.09 |