HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🤩
개발
/
Spring Data
Spring Data
/
📌
Spring JDBC(Java Database Connectivity)
/
🛵
Connection & Statement
🛵

Connection & Statement

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

[참고] https://stackoverflow.com/questions/4333015/does-the-preparedstatement-avoid-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를 실행하기 위해 사용됨