JDBC(Java Database Connectivity)에서 SQL 쿼리의 실행 결과를 다룰 때 가장 많이 사용되는 두 인터페이스는 ResultSet과 RowSet입니다. 두 객체 모두 데이터베이스 조회 결과를 담는 역할을 하지만, 연결 관리 방식, 직렬화 여부, 네트워크 전송 가능성 등에서 중요한 차이가 있습니다. 이 글에서는 두 인터페이스의 차이점을 항목별로 자세히 살펴보겠습니다.
ResultSet과 RowSet의 주요 차이점 한눈에 보기
| 구분 | ResultSet | RowSet |
|---|---|---|
| 데이터베이스 연결 | 항상 데이터베이스와 연결된 상태를 유지합니다. | 연결(Connected) 또는 연결 해제(Disconnected) 상태 모두 가능합니다. |
| 직렬화(Serialization) | 직렬화할 수 없습니다. | 객체 직렬화가 가능합니다. |
| 네트워크 전송 | 네트워크를 통해 전달할 수 없습니다. | 네트워크를 통해 전달할 수 있습니다. |
| JavaBean 지원 | JavaBean 객체가 아닙니다. executeQuery() 메서드를 호출하여 생성합니다. | JavaBean 객체입니다. RowSetProvider.newFactory().createJdbcRowSet() 메서드를 호출하여 생성합니다. |
| 스크롤 및 업데이트 | 기본적으로 스크롤과 업데이트가 모두 불가능합니다. | 기본적으로 스크롤과 업데이트가 모두 가능합니다. |
1. 데이터베이스 연결 방식
ResultSet은 쿼리 결과를 탐색하는 동안 데이터베이스와의 연결을 끊지 않고 계속 유지해야 합니다. 반면 RowSet은 연결된 상태(JdbcRowSet)와 연결이 해제된 상태(CachedRowSet 등)를 모두 지원하기 때문에, 연결 리소스를 절약하면서 데이터를 처리할 수 있다는 장점이 있습니다.
2. 직렬화와 네트워크 전송
ResultSet은 내부적으로 데이터베이스 연결에 의존하고 있기 때문에 직렬화가 불가능하며, 따라서 네트워크를 통해 다른 시스템으로 전달할 수도 없습니다. 반면 RowSet은 직렬화가 가능하여 분산 환경이나 클라이언트-서버 구조에서 조회 결과를 객체 그대로 전송하는 용도로 활용할 수 있습니다.
3. JavaBean 지원과 생성 방법
ResultSet은 JavaBean 규격을 따르지 않으며, 일반적으로 Statement 객체의 executeQuery() 메서드를 호출하여 얻습니다. 반면 RowSet은 JavaBean 컴포넌트로 설계되어 프로퍼티 설정과 이벤트 처리가 가능하며, RowSetProvider.newFactory().createJdbcRowSet() 메서드를 통해 손쉽게 생성할 수 있습니다.
4. 스크롤 및 업데이트 기능
기본 생성된 ResultSet은 커서가 앞으로만 이동하는 forward-only 방식이며, 데이터 수정도 지원하지 않습니다. 필요한 경우 별도의 옵션을 지정해야 합니다. 반면 RowSet은 기본적으로 양방향 스크롤과 데이터 업데이트를 모두 지원하므로, 별도의 설정 없이도 유연한 데이터 조작이 가능합니다.
정리: 어떤 것을 선택해야 할까?
단순히 서버 내에서 순차적으로 데이터를 읽기만 한다면 경량인 ResultSet이 적합합니다. 하지만 연결을 끊은 상태에서 데이터를 보관하거나, 네트워크를 통해 결과를 전송하거나, JavaBean처럼 활용해야 하는 상황이라면 RowSet이 훨씬 더 강력하고 유연한 선택이 됩니다. 개발 목적과 환경에 맞춰 두 인터페이스를 적절히 활용하시기 바랍니다.