본문 바로가기
Tech/DB

JDBC Statement vs PreparedStatement

반응형

Statement

  • JDBC API 인터페이스중 한 가지로 SQL 쿼리를 실행하는데 사용할 수 있다
  • 문자열 기반으로 SQL 쿼리를 실행하는 데 사용됩니다 ( 문자열 그대로를 SQL 쿼리로 받아드림 )
    • 하지만 문자열이기 때문에 SQL 문자열을 연결할 때, 코드 가독성이 떨어진다
  • SQL 인젝션에 취약하다
  • 매개변수를 전달하거나 바인딩 할 수 없다
  • 매번 쿼리를 수행할 때마다 쿼리 문장 분석 -> 컴파일 -> 실행의 단계를 모두 거치게 된다 ( 쿼리 캐싱을 사용하지 않는다 )
  • 주로 고정적인 DDL(create, alter... ) 구문에서 사용된다

 

PreparedStatement

  • Statement와 마찬가지로 JDBC API 인터페이스중 한 가지로 SQL 쿼리를 싱행하는데 사용할 수 있습니다
  • Statement를 확장하여 생성됨
  • 매개 변수화된 SQL 쿼리를 실행하는데 사용됩니다
    • 파일 및 배열을 포함하여 다양한 개체 유형을 바인딩하는 메서드가 있으며, 코드의 가독성이 Statement보다 상대적으로 좋다
  • 제공된 모든 매개변수 값에 대한 텍스트를 이스케이프 처리하여 SQL 인젝션으로부터 보호해줍니다
  • 처음 쿼리 수행시에만 쿼리 문장 분석 -> 컴파일 -> 실행의 단계를 거치게 되고, 캐시에 담겨 바인딩된 '?' 파라미터만 변경하면서 재사용됩니다 ( 사전 컴파일 제공, Statement보다 성능면에서 우수하게 사용할 수 있다 )
  • 단일 데이터베이스 연결동안 Batch 실행을 제공합니다 
  • 주로 사용자의 입력값에 따라 조건문이 달라지는 경우 사용 ( DML )
  • 하지만 무분별한 PreparedStatement 사용은 한계가 존재하는 SQL 캐시를 가득차게 하여 정작 캐싱이 필요한 SQL을 담지 못할 수 있으니 유의해야합니다
  • 또한 조건절 자체가 매번 달라지는 Dynamic SQL 같은 경우는 캐싱의 장점이 없기 때문에 Statement가 적절합니다

 

추가: CallableStatement

  • 저장 프로시저(DB procedure)를 접근할 때 사용
  • PreparedStatement를 확장하여 생성됨
  • PreparedStatement와 마찬가지로 런타임에 파라미터를 바인딩 할 수 있다
  • CallableStatement 역시 미리 컴파일되어 DB에 저장되어 있기 때문에 성능상으로 이점이 있다
728x90
반응형