새로운 내용을 공부할 때
새로운 내용의 공부를 시작할 때 용어의 정의를 이해하지 못하거나 정확하게 알지 못한다면 그 용어가 포함된 문장을 이해하지 못합니다.
작은 단어 하나가 내용을 이해하지 못하게 하기 때문에 용어를 정확하게 이해하는 것이 중요합니다.
JDBC 기초 학습
목표 D-day : 85 일
최범균 ch.14 데이터베이스 기초 학습
학습 키워드
- 데이터 베이스 연결
학습 내용
JDBC API를 통해서 사용자는 자유롭게 JDBC 드라이버만 변경하여 데이터베이스를 변경할 수 있습니다.
물론 SQL은 특정 데이터베이스 문법을 사용한다면 쿼리도 변경해야합니다.
JDBC 드라이브는 최초 프로그램 실행시 메모리에 올리는 과정이 필요합니다.
등록하는 방법중 클래스의 이름으로 로드할 수 있는 classForName("")
을 통해 메모리에 올립니다.
이 메서드를 사용하면 기본적으로 static
초기화가 동작합니다.
public class Driver extends NonRegisteringDriver implements java.sql.Driver {
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException e) {
throw new RuntimeException("Can't register driver!");
}
}
// ... other methods ...
}
따라서 클래스 로더를 통해 등록만 한다면 이후에는 프로그램이 종료될때까지 사용할 수 있습니다.
네트워크 통신
웹 어플리케이션과 데이터베이스는 결국 다른 서버로 네트워크 통신이 필요합니다.
TCP 통신을 기반으로 하기 때문에 높은 신뢰성으로 송수신이 가능하다는 장점이 있습니다.
TCP는 연결지향적입니다. 연결하는 과정과 연결을 끊은 과정이 추가로 필요합니다.
이 과정이 생각보다 오래 걸리게 됩니다.
매번 커넥션을 열고 닫는 시간적 비용이 발생하게 됩니다.
DBCP
데이터베이스 커넥션 풀입니다.
풀(Pool)이라는 단어는 한정적인 자원을 효율적으로 사용하기 위해 객체를 모아놓고 사용하는 장소를 말합니다.
데이터베이스 커넥션을 매번 요청이 들어올때마다 악수하는걸 방지하기 위해서 미리 악수를 다 해놓는겁니다.
커넥션을 미리 만들어놓고 사용자가 요청이 들어오면 그때마다 재사용하는 방식입니다.
주의사항
데이터베이스 자체에서 불필요한 커넥션을 해제하기 위해 타임아웃이 있습니다.
따라서 DBCP에서 커넥션을 유지하기 위한 주기적인 SQL을 실행해야합니다.
PreparedStatement 과 Statement 비교
두 메서드 모두 SQL을 실행하는데 사용합니다.
- Statement는 문자열 기반의 sql을 실행합니다.
- PreparedStatement: 파라미터화된 SQL 쿼리를 실행하는데 사용됩니다.
public void insert(PersonEntity personEntity) {
//preparedstatement
String query = "INSERT INTO persons(id, name) VALUES( ?, ?)";
//statement
String query = "INSERT INTO persons(id, name) VALUES(" + personEntity.getId() + ", '"
+ personEntity.getName() + "')";
}
- 문자열로 쿼리를 실행하다보니 파라미터를 전달하는 경우에 가독성이 떨어집니다. 추가로 문자열 그대로 값이 들어가므로 SQL 인젝션이 발생할 수 있습니다.
- JDBC는 인라인 값을 포함한 쿼리를 데이터베이스에 전달합니다. 따라서 쿼리 최적화가 없으며, 가장 중요한 점은 데이터베이스 엔진이 모든 검사를 수행합니다. 매번 새로운 쿼리를 전달하는 방식인
Statement
와 다르게Prepared
는 사전 컴파일을 사용합니다. 데이터베이스가 쿼리를 받으면, 쿼리를 사전 컴파일 하기 전에 캐시를 확인합니다. 따라서 캐시되지 않은 경우, 데이터베이스 엔진은 다음 사용을 위해 쿼리를 저장합니다. - 사전에 쿼리를 준비하고, 매개변수만 바인딩하여 효율적인 쿼리 실행이 가능하여 배치 쿼리에 장점이 있습니다.
참조
-
Difference Between Statement and PreparedStatement
JDBC의 Statement와 PreparedStatement의 차이는 사전 컴파일이 있다. -
Spring 6.1 JdbcClient API
JdbcTemplate과 NamedParameterJdbcTemplate을 통합하여 API로 쿼리 실행가능
댓글남기기