1. 애플리케이션 레벨
- 쿼리 생성:
- 애플리케이션 코드에서 SQL 쿼리를 생성합니다.
1 2 3
String sql = "SELECT * FROM my_table WHERE id = ?"; PreparedStatement pstmt = connection.prepareStatement(sql); pstmt.setInt(1, 1);
- 애플리케이션 코드에서 SQL 쿼리를 생성합니다.
- 쿼리 실행 요청:
pstmt.execute()
또는pstmt.executeQuery()
메소드를 호출하여 쿼리 실행을 요청합니다.1
ResultSet rs = pstmt.executeQuery();
2. JDBC 드라이버 레벨
- JDBC 드라이버 처리:
- JDBC 드라이버는 SQL 쿼리를 받아 데이터베이스 서버로 전송하기 위한 준비를 합니다. 이 과정에서 SQL 쿼리를 네트워크 패킷으로 변환합니다.
3. 네트워크 통신
- 소켓 통신 설정:
- JDBC 드라이버는 애플리케이션과 데이터베이스 서버 간의 소켓 연결을 사용하여 통신합니다. 이 소켓 연결은 이미 HikariCP와 같은 커넥션 풀에서 설정되어 있을 수 있습니다.
- 시스템 콜:
- 네트워크 통신을 수행하기 위해 운영체제의 네트워크 스택을 사용합니다. 여기에는 여러 시스템 콜이 포함됩니다.
- 예를 들어,
send()
시스템 콜을 사용하여 SQL 쿼리를 데이터베이스 서버로 전송합니다.
4. 데이터베이스 서버 레벨
- 데이터베이스 서버 수신:
- 데이터베이스 서버는 클라이언트(애플리케이션)로부터 네트워크를 통해 SQL 쿼리를 수신합니다.
- 서버의 네트워크 스택에서
recv()
시스템 콜을 사용하여 패킷을 수신합니다.
- SQL 쿼리 처리:
- 데이터베이스 서버는 SQL 쿼리를 파싱, 최적화, 실행 계획 수립 후 실제로 데이터를 검색하거나 조작합니다.
- 결과 전송:
- 쿼리 실행 결과를 클라이언트로 전송합니다. 이 과정도 네트워크 패킷으로 변환되어 전송됩니다.
- 서버에서
send()
시스템 콜을 사용하여 결과를 클라이언트로 전송합니다.
5. 클라이언트 수신 및 처리
- 결과 수신:
- 클라이언트(애플리케이션)는 서버로부터 결과 패킷을 수신합니다.
- 네트워크 스택에서
recv()
시스템 콜을 사용하여 데이터를 수신합니다.
- 결과 처리:
- JDBC 드라이버는 수신된 데이터를 ResultSet 객체로 변환하여 애플리케이션에 제공합니다.
1 2 3 4 5
while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); // 결과 처리 }
- JDBC 드라이버는 수신된 데이터를 ResultSet 객체로 변환하여 애플리케이션에 제공합니다.
네트워크 시스템 콜 예시
클라이언트 측
- 소켓 생성:
socket()
- 서버에 연결:
connect()
- 데이터 전송:
send()
- 데이터 수신:
recv()
서버 측
- 소켓 생성:
socket()
- 클라이언트 연결 수락:
accept()
- 데이터 수신:
recv()
- 데이터 전송:
send()