JDBC란,
자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다.
java.sql.Connection 연결, java.sql.Statement 요청할 SQL 내용, java.sql.ReesultSet SQL 요청에 대한 응답 등 자바 애플리케이션과 데이터베이스 시스템 간의 상호 운용성을 제공하는 표준 인터페이스를 정의해서 제공한다.
자바에서 JDBC 표준 인터페이스를 제공하면, 각각의 데이터베이스 회사들은 이 인터페이스를 자신들의 DB에 맞도록 구현해서 라이브러리로 제공하는데 이것을 JDBC 드라이버라고 한다.
개발자는 자신이 사용할 DB의 JDBC 드라이버를 설치하고, 이 표준 인터페이스를 사용해서 데이터베이스를 사용할 수 있다. 덕분에 데이터베이스가 변경되더라도 DB를 연결하고 요청하는 과정의 코드를 고칠 필요없이 드라이버만 교체해주면 된다.
데이터베이스에 연결하려면 JDBC가 제공하는 DriverManager.getConnection(..) 를 사용하면 된다. 이렇게하면 라이브러리에 있는 데이터베이스 드라이버를 찾아서 해당 드라이버가 제공하는 커넥션을 반환해준다.
JDBC의 Statement는 DB에 쿼리를 보내 실행시키는 객체이다.
PreparedStatement는 Statement의 자식 타입인데, ?를 통한 파라미터 바인딩을 가능하게 해준다. 따라서 동적 쿼리를 작성하는 Statement에 비해 SQL 인젝션 공격으로부터 좀 더 안전하다고 볼 수 있다.
실행 시점에 쿼리문이 컴파일되는 Statement와 달리, PreparedStatement는 실행되기 전에 데이터베이스 엔진이 이해할 수 있는 형태로 미리 컴파일 되어 처리속도가 좀 더 빠르다.
ResultSet은 쿼리 실행 결과를 포함하는 객체로 데이터베이스에서 반환된 데이터를 테이블 형식으로 제공한다.
next(): 다음행으로 이동, 더이상 없으면 false반환
getString(String columnLabel): 지정된 열의 값을 문자열로 반환
getInt(String columnLabel): 지정된 열의 값을 정수로 반환
close(): ResultSet 객체를 닫아 리소스를 해제
트랜잭션은 데이터베이스의 일관성을 유지하기 위해 일련의 작업을 하나의 단위로 처리하는 것을 말한다.
데이터베이스에서는 autocommit을 비활성화 한 뒤, 모든 작업이 완료 되었을 때 commit을 호출하여 변경된 내용을 반영하는 방법을 사용할 수 있다. 만약 오류가 발생한다면 rollback을 호출하여 데이터를 복구할 수 있다.
트랜잭션이 시작되면 해당 커넥션 세션에서 락을 가져가므로 다른 세션에서는 해당 데이터를 변경할 수 없다.
JDBC에서도 이러한 트랜잭션을 적용할 수 있도록 connection 객체에서 setautocommit 메서드와 commit, rollback 메서드를 제공한다.
🌟 추가 질문
📍 만약 JPA로 조회 기능을 사용할 때, 특정 객체의 필드가 계속 null이다. 어떻게 확인할 것인가?
설정을 확인하는 방법도 있겠지만, 조회하는 쿼리를 로그로 남겨서 제대로 쿼리를 보내는지 확인하는 방법이 있을 것이다. 데이터 결과가 어떻게 들어오는지 확인하는 방법도 있다.
JPA도 Mybatis도 모두 결국 JDBC 위에서 동작한다. 따라서 JDBC의 기본 개념과 원리를 이해해야 내부 작동 방식을 이해할 수 있고, 오류가 생겼을 때 원인을 빠르게 파악할 수 있다. 또한, SQL 쿼리 실행 관련 문제나 성능 이슈를 해결하는데 도움이 될 것이다.