스프링 DB 1편 - 데이터 접근 핵심 원리 강의의 내용을 저의 말로 정리한 것입니다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1
응용은 디비를 이용하기 위해 직접 디비와 연결하지 않는다. 대신 서버에 요청을 보내고 서버가 필요한 비지니스 로직을 수행하며 디비가 필요한 경우 sql 쿼리를 디비에 보내서 디비를 이용한다.
서버는 디비를 이용하기 위해 먼저
하지만 디비마다 커넥션을 얻는 방법, sql을 보내는 방법 등이 달랐다. 따라서 디비를 변경하면 서버에 구현된 디비 사용 코드도 변경이 되어야 했다. 또한 개발자가 디비마다 사용법을 익혀야 했다. 이를 해결하기 위해 JDBC가 등장했다.
JDBC는 자바에서 데이터베이스에 접속하기 위한 방법을 인터페이스로 정의한 것이다.
jdbc에서는 데이터베이스를 이용하기 위해서는 다음 세가지 기능이 있어야 한다고 인터페이스로 정해 놓았다.
각각의 디비 회사는 위 인터페이스들을 구현해서 디비 이용 방법을 구체적으로 만들고 이를 라이브러리로 제공한다. 이걸 jdbc 드라이버라고 한다.
응용은 오직 jdbc 표준 인터페이스에만 의존하므로 디비가 바뀌어도 코드를 변경하지 않아도 되고 디비에 맞게 드라이버만 갈아 끼우면 된다.
위 예시를 보면 각각의 디비에서 연결은 어떻게 하고 sql은 어떻게 전달하고 결과셋은 어떻게 받을 것인지를 구현한 것이 보인다.
jdbc에서 제공하는 드라이버매니저는 라이브러리에 등록된 드라이버들을 관리하고 올바른 커넥션을 찾아주는 기능을 제공한다.

응용에서 디비와 연결하려면 커넥션이 필요한데 자신에게 맞는 커넥션을 얻으려면 드라이버매니저를 이용해야 한다
Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
여기에서 말한 정보에는 url, 이름, 비밀번호등이 있다.
각각의 드라이버는 드라이버매니저가 넘겨준 정보 중 url을 보고 자신이 처리할 수 있는 요청인지 확인한다.
예를 들어 h2드라이버가 받은 url이 jdbc:h2라면 자신이 처리할 수 있다고 판단한다.
자신이 처리할 수 없으면 드라이버매니저는 다음 드라이버를 확인한다.
DriverManager.getConnection을 이용해서 Connection 객체를 획득하고
Connection의 preparedStatement(sql) 메소드를 이용해서 sql을 전달할 준비를 한다. 이때 PreparedStatement 객체가 반환되는데 이는 Statement를 상속한 것이다.
PreparedStatement의 메소드로 커넥션을 통해 쿼리를 전달한다.
결과가 있다면 반환된 ResutlSet으로 조회한다.
Connection, Statement, ResultSet등의 사용한 자원들을 정리한다.
자원을 얻을 때는 Connection -> Statement -> ResultSet 순으로 얻지만 정리할 때는 역순으로 한다. 또한 자원을 반환할 때는 반드시 finally 구문에서 정리를 해야한다. try 안에서 하면 쿼리를 수행하며 예외가 발생시 자원 정리를 못할 수도 있기 때문이다.
ResultSet은 표처럼 생긴 구조이고 쿼리의 결과가 순서대로 들어있다.
내부에 있는 커서를 통해 결과셋의 레코드를 조회할 수 있다.
처음에는 커서가 아무것도 가리키고 있지 않다.
next 메소드를 호출하면 다음 결과가 있는지 알 수 있다.
get타입(열 이름) 으로 커서가 가리키고 있는 데이터를 원하는 타입으로 반환할 수 있다.
아래는 커서가 이동하면서 데이터를 반환하는 예시이다.

보다시피 jdbc는 직접 이용하기 까다롭고 반복이 많다. 그래서 jdbc를 편리하게 이용할 수 있는 기술들이 있다.