일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 알고리즘
- C
- Algorithm
- 컴퓨터구조
- design pattern
- 디자인 패턴
- MSA
- Data Structure
- Proxy
- JavaScript
- Java
- 자료구조
- Spring
- Kafka
- Galera Cluster
- 자바
- IT
- OS
- mongoDB
- 네트워크
- react
- JPA
- Heap
- 파이썬
- 백준
- spring webflux
- redis
- MySQL
- c언어
- 운영체제
Archives
- Today
- Total
시냅스
Java - JDBC 정리 본문
클라이언트, 애플리케이션 서버, DB
- 클라이언트가 애플리케이션 서버를 통해 데이터를 저장하거나 조회하면, 다음과 같은 과정을 거친다.
- 1. 커넥션 연결
- 주로 TCP/IP 를 사용해서 커넥션을 연결한다.
- 3 way handshake
- 2. SQL 전달
- 애플리케이션 서버는 DB가 이해할 수 있는 SQL을 연결된 커넥션을 통해 DB에 전달한다.
- 3. 결과 응답
- 다만 각각의 데이터베이스 마다 커넥션을 연결하는 방법, SQL을 전달하는 방법, 응답을 받는 방법이 모두 다르다.
JDBC Java Database Connectivity
- JDBC는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API다.
- JDBC 표준 인터페이스에 의존하게 하여 데이터베이스를 다른 종류의 데이터베이스로 변경하면 애플리케이션 서버의 데이터베이스 사용 코드도 함께 변경해야하는 문제를 해결한다.
- JDBC 사용법만 숙지하면 개발자가 각각의 데이터베이스마다 커넥션 연결, SQL 전달, 응답 받는 방법을 새로 학습하지 않아도 된다.
- 대표적으로 다음 3가지 기능을 표준 인터페이스로 정의해서 제공한다.
- java.sql.Connection
- 연결
- java.sql.Statement
- sql을 담은 내용
- java.sql.ResultSet
- sql 요청 응답
- 이런 인터페이스에 대한 구현체를 JDBC 드라이버라 한다.
JDBC 커넥션 인터페이스와 구현
- JDBC는 java.sql.Connection 표준 커넥션 인터페이스를 정의한다.
- H2 데이터베이스 드라이버는 JDBC Connection 인터페이스를 구현한 org.h2.jdbc.JdbcConnection 구현체를 제공한다.
- JDBC가 제공하는 DriverManager는 라이브러리에 등록된 DB 드라이버들을 관리하고, 커넥션을 획득하는 기능을 제공한다.
- 애플리케이션 로직에서 커넥션이 필요하면 DriverManger.getConnection() 을 호출한다.
- DriverManager는 라이브러리에 등록된 드라이버 목록을 자동으로 인식하여 드라이브들에게 순서대로 정보를 넘겨 커넥션을 획득할 수 있는지 확인한다.
- URL : e.g. jdbc:h2:tcp://localhost/~/test
- 이름, 비밀번호 등 추가 정보
- 각각의 드라이버들은 URL을 확인하여 연결할 수 있다면 데이터베이스에 연결하여 커넥션을 클라이언트에 반환한다.
- 이렇게 찾은 커넥션 구현체가 클라이언트에 반환된다.
구현 예시
try {
Connection con = DriverManager.getConnection(URL, USERNAME, PASSWORD); // connection 획득
prepareStatement pstmt = con.prepareStatement(sql); // 데이터 베이스에 전달할 sql 정의
pstmt.setString(1, eg); // 변수 바인딩
ResultSet rs = pstmt.executeQuery(); // 쿼리 실행 및 응답 반환
if (rs.next()) {
/** logic... */
} else {
throw new NoSuchElementException("...");
}
} catch (SQLException e) {
log.error("db error", e); throw e;
} finally {
close(con, pstmt, rs); // 리소스 정리 함수 실제로 각각은 con.close() 와 같은 모습으로 정리된다.
}
}
리소스 정리
- 쿼리를 실행하고 나면 리소스를 정리할 때에는 항상 역순으로 해야한다
- 위의 경우 close라는 함수에서 정리하는데
- Connection 을 먼저 획득하고 PrepareStatement, ResultSet 순서로 획득했기 때문에
- ResultSet -> PrepareStatement -> Connection 순서로 close 해야한다.
- 만약 커넥션이 끊어지지 않고 계속 유지되는 경우 리소스 누수가 발생하여 커넥션 부족으로 이어질 수 있다.
ResultSet
- 보통 select 쿼리의 결과가 순서대로 들어간다.
- select member_id, money 라고 지정하면 member_id, money 라는 이름으로 데이터가 저장된다.
- ResultSet 내부에 있는 커서를 이동해서 다음 데이터를 조회할 수 있다.
- rs.next() 를 호출하면 커서가 다음으로 이동한다.
- 최초의 커서는 데이터를 가리키고 있지 않기 때문에 최초 한 번은 호출해야 데이터를 조회할 ㅅ ㅜ있다.
- rs.next() 의 결과가 true면 커서의 이동 결과 데이터가 있다는 뜻이다.
- 반대는 없다는 뜻이다.
- rs.getString("") 과 같이 데이터 반환 타입을 지정할 수 있다.
'Java, Spring' 카테고리의 다른 글
Java 트랜잭션 관련 정리 (0) | 2022.08.25 |
---|---|
Java 커넥션 풀과 데이터 소스 (0) | 2022.08.25 |
Spring MVC 구조 : 핸들러어댑터 ,핸들러 매핑, 메세지 컨버터 handler mapping handler adapter, message converter (0) | 2022.08.02 |
[JAVA] 서블릿 (servlet) 이란? (0) | 2022.08.02 |
웹 서버와 와스 web server and WAS - Web Application Server (0) | 2022.08.02 |
Comments