ConnectioncreateStatement() → StatementSQL InjectionpreparedStatement() → PreparedStatementCallableStatement
Connection
- DB Connection 자체는 큰 resource를 차지함. db와 어플리케이션에 둘 다 부담이 되기에 에러가 발생하면 닫아주기! 끝나는 경우에도 close 해주기
- JDBC connection url format 참조 : https://www.baeldung.com/java-jdbc-url-format
createStatement() → Statement
- Statement
- Statement 객체 하나 당 ResultSet 객체 하나만 동시에 열려 있을 수 있음 → 여러 개의 ResultSet 객체를 한번에 다루려면 Statement 객체 또한 여러개가 되어야 함
- Statement의 모든 메서드가 실행될 때 그 이전에 열려 있던 ResultSet에 대한 접근은 닫게 됨
- 실행할 때마다 쿼리의 문장을 분석
- 컴파일 한 후
- 실행함
SQL Injection
- 클라이언트의 입력값을 조작하여 서버의 데이터베이스를 공격할 수 있는 공격방식을 말함
- 주로 사용자가 입력한 데이터를 제대로 필터링, 이스케이핑하지 못했을 경우 발생함
- query 생성 시, String concatenating 방식으로 하지 말고, PreparedStatement의 set메서드를 활용해서 하면 방지할 수 있음!
preparedStatement() → PreparedStatement
- PreparedStatement
- precompiled SQL statement
- 처음 한번만 컴파일을 거친 후 캐시에 담아서 재사용 됨
- IN 파라미터가 INTEGER이면 그것과 관련된 메서드가 불리어야 함 → setInt
- 쿼리를 중간에 바꿀 수 없음(Dynamic 쿼리가 안되는 것)
- 매번 쿼리 분석 & 컴파일 & 실행을 하는 것이 아니기에 성능 상에서도 이점이 있음
var SELECT_SQL = "select * from customers WHERE name = ? "; var statement = connection.preparedStatement(); statement.setString(1, name); statement.executeQuery();
CallableStatement
- 해당 인터페이스는 SQL의 stored procedure를 실행하기 위해 사용됨