JDBC를 이용하는 자바 코드
우리의 목적은 UI를 만들고 그 UI에서 사용자의 요구에 따라서 데이터를 쿼리하도록 해야한다. JDBC는 실제로 구동할 코드를 가지고 있지 않아 실제 구동 코드를 가지고 있는 드라이버를 로드해야만 JDBC가 드라이버를 이용해서 데이터베이스를 연결하거나 실행해 줄 수 있는 것이다. 이제 드라이버를 로드하고 데이터베이스를 연결하여 쿼리를 실행하는 기본 코드에 대해서 알아보자.
class.forName("oracle.jdbc.driver.OracleDriver")
기본 코드의 첫 번째는 JDBC 드라이버를 로드하는 거다. 이 드라이브를 로드할 때는 class.forName 메서드를 이용해서 로드 할 수 있다. 오라클 사이트에서 받은 JDBC 드라이버에 보면 oracle.jdbc.driver.OracleDriver라는 패키지에 OracleDriver클래스가 있는 것을 확인할 수 있는데 이 클래스를 객체화시키는 게 로드이다. 이렇게 드라이버를 로드하게 되면 메모리에 잡히게 된다.
Connection con = DriverManager.getConnection(...)
그 다음 Connection con = DriverManager.getConnection(...)를 실행하게 되면 DriverManager를 통해서 Connection을 요청하게 되고 연결이 확립 되면 Connection 객체가 반환된다.
Statement st = con.createStatement()
그 다음 Statement 객체를 만들 텐데 이 Statement 객체가 사용자로부터 요구받은 쿼리를 실행하게 된다.
ResultSet rs = st.executeQuery(sql)
Statement 객체를 통해서 ResultSet rs = st.executeQuery(sql)를 실행하게되면 괄호 안에 쿼리를 실행한 것이 아래 그림과 같이 결과 집합이 서버에 만들어진다. 이때 서버에서는 이 결과 집합을 사용자에게 전부 돌려주는것이 아니고 결과 집합은 서버에 존재하고 클라이언트는 결과를 레코드 단위로 하나씩 하나씩 받게 된다.
서버에서는 사용자에게 아직 모든 데이터를 돌려주지 않은 상태이기 때문에 서버에서는 사용자에게 돌려줘야 할 레코드의 위치를 가리키고 있는 커서가 존재한다. 그래서 서버 쪽에서 이렇게 실행 결과가 만들어지고 커서가 준비가 되면 그것을 사용할 수 있게끔 하는 클라이언트 도구가 ResultSet 객체 준비되는 것이다.
ResultSet 객체가 만들어진다는 것은 결과 집합을 받았다는 것이 아니고 결과 집합을 이용할 수 있는, 즉 결과 집합을 패치해 올 수 있는 상태가 되는 것이기 때문에 결과 집합의 하나의 레코드를 옮겨올 수 있도록 하는 빈 공간 하나가 만들어진다.
데이터 패치하기
rs.next()
서버 쪽에서 결과를 줄 때 하나씩 반환하기 때문에 ResultSet을 통해서 rs.next()를 실행하면 서버에서는 파일의 앞을 가르키고있던 커서 BoF가 첫 번째 위치를 가리키면서 레코드 하나가 빈 공간에 채워진다.
※ 클라이언트로 전달된 이 레코드를 담는 그릇이 바로 ResultSet이고 ResultSet이 next()를 통해서 패치해 올 수 있는 기능을 갖고 있는것이다.
String title = rs.getString("title")
rs.next()를 호출해야만 클라이언트에게 레코드 하나가 전달된 것이고 이렇게 하나의 레코드가 전달된 상태에서 rs.getString("title")처럼 title 컬럼에 해당되는 것을 문자열로 요청하면 하나의 레코드에 title 컬럼이 해당되는 데이터를 뽑아올 수 있게 되는 것이다. 만약 rs.next()를 또 호출하면 다음 레코드를 가리키고 데이터를 담았던 그릇에는 그 전 데이터가 아니라 새로운 레코드가 채워지고 또 rs.getString("title")를 실행한다면 데이터를 담았던 그릇에 채워져 있는 데이터를 반환하게 된다. 그렇게 next()를 계속 호출하면 파일의 끝인 EoF(End of File)까지 가게 되어 결과 집합에 있는 모든 내용을 확인할 수 있게된다.
특징
지금까지 OracleDriver, Connection, Statement, ResultSet 이렇게 총 4개의 객체가 만들어지는것을 확인했다. 특이한 점은 일반적으로 Java에서는 new는 연산자를 통해서 객체화하지만 어떤 것 하나 new 연산자로 만들어지는 게 없다. OracleDriver는 class.forName()으로 생성하고 Connection는 DriverManager가 생성해준다. 그리고 Statement는 Connection이 생성해서 반환해주고 ReslutSet도 마찬가지이다.
그리고 또한 이 객체들은 순차적으로 객체를 만들 수 있도록 만든 구조이다. DriverManager가 로드가 된 적이 없으면 Connection을 만들 수 없고 Connection이 없으면 Statement를 생성할 수 없다. 이렇게 순차적으로 객체를 만들게 하는 이유는 연결 객체가 없는데 실행 도구가 먼저 만들어지는 것은 의미가 없기 때문이다. 그래서 각 순서에 필요한 객체들을 차례대로 생성해 주며 불필요한 객체 생성과 오류를 방지한다.
참고자료
[1] 유튜브 채널 뉴렉처 - JDBC 기본 코드의 이해
'🖥️ Backend > JDBC' 카테고리의 다른 글
[JDBC] 4.JDBC 기본 코드 실습 (0) | 2024.09.05 |
---|---|
[JDBC] 2.오라클 JDBC Driver 다운로드 및 불러오기 (0) | 2024.08.23 |
[JDBC] 1.JDBC란 무엇인가? (0) | 2024.08.21 |