SQL 문 매개 변수를 사용하면 다시 사용할 수 있는 SQL 문을 만들 수 있습니다. 문 매개 변수를 사용하면
INSERT
문에 추가되는 값과 같이 문에 있는 값이 변경될 수 있지만 기본 문 텍스트는 변경되지 않고 유지됩니다. 이에 따라 성능이 향상되고 응용 프로그램을 코딩하기가 쉬워집니다.
문 매개 변수 이해
응용 프로그램에서 한 SQL 문을 약간 변형하여 여러 번 사용하는 경우가 많습니다. 예를 들어, 사용자가 새 재고 항목을 데이터베이스에 추가할 수 있는 재고 추적 응용 프로그램의 경우 재고 항목을 데이터베이스에 추가하는 응용 프로그램 코드에서는 데이터를 데이터베이스에 실제로 추가하는 SQL
INSERT
문을 실행합니다. 그러나 이 문이 실행될 때마다 약간 변형되어 실행됩니다. 특히 테이블에 삽입되는 실제 값은 추가되는 재고 항목과 관련되기 때문에 서로 다릅니다.
서로 다른 값을 사용하여 SQL 문을 여러 번 실행하는 경우 SQL 텍스트에 리터럴 값 대신 매개 변수가 포함된 SQL 문을 사용하는 것이 가장 좋습니다. 매개 변수는 문이 실행될 때마다 실제 값과 바뀌는 문 텍스트의 자리 표시자입니다. SQL 문에서 매개 변수를 사용하려면 일반적인 경우처럼
SQLStatement
인스턴스를 만듭니다.
text
속성에 할당된 실제 SQL 문의 경우 리터럴 값 대신 매개 변수 자리 표시자를 사용합니다. 그런 다음 SQLStatement 인스턴스의
parameters
속성에서 요소의 값을 설정하여 각 매개 변수의 값을 정의합니다.
parameters
속성은 연관 배열이므로 다음 구문을 사용하여 특정 값을 설정합니다.
statement.parameters[parameter_identifier] = value;
parameter_identifier
는 명명된 매개 변수를 사용하는 경우 문자열이고 명명되지 않은 매개 변수를 사용하는 경우에는 정수 인덱스입니다.
명명된 매개 변수 사용
매개 변수가 명명된 매개 변수일 수 있습니다. 명명된 매개 변수에는 데이터베이스에서 매개 변수 값을 문 텍스트의 해당 자리 표시자 위치와 일치시키는 데 사용하는 특정 이름이 있습니다. 매개 변수 이름은 다음 예와 같이 “:” 또는 “@” 문자와 그 뒤의 이름으로 구성되어 있습니다.
:itemName
@firstName
다음 코드 샘플에서는 명명된 매개 변수를 사용하는 방법을 보여 줍니다.
var sql:String =
"INSERT INTO inventoryItems (name, productCode)" +
"VALUES (:name, :productCode)";
var addItemStmt:SQLStatement = new SQLStatement();
addItemStmt.sqlConnection = conn;
addItemStmt.text = sql;
// set parameter values
addItemStmt.parameters[":name"] = "Item name";
addItemStmt.parameters[":productCode"] = "12345";
addItemStmt.execute();
명명되지 않은 매개 변수 사용
명명된 매개 변수를 사용하는 대신 명명되지 않은 매개 변수를 사용할 수도 있습니다. 명명되지 않은 매개 변수를 사용하려면 “?” 문자를 사용하여 SQL 문에 매개 변수를 나타냅니다. 문의 매개 변수 순서에 따라 첫 번째 매개 변수의 인덱스 0에서 시작하여 각 매개 변수에 숫자 인덱스가 할당됩니다. 다음 예제는 이전 예제에서 명명되지 않은 매개 변수를 사용한 것입니다.
var sql:String =
"INSERT INTO inventoryItems (name, productCode)" +
"VALUES (?, ?)";
var addItemStmt:SQLStatement = new SQLStatement();
addItemStmt.sqlConnection = conn;
addItemStmt.text = sql;
// set parameter values
addItemStmt.parameters[0] = "Item name";
addItemStmt.parameters[1] = "12345";
addItemStmt.execute();
매개 변수 사용의 장점
SQL 문에서 매개 변수를 사용하는 경우 몇 가지 장점이 있습니다.
-
성능 향상
-
매개 변수를 사용하는 SQLStatement 인스턴스는 실행될 때마다 SQL 텍스트를 동적으로 만드는 SQLStatement 인스턴스보다 효율적으로 실행될 수 있습니다. 문이 한 번 준비된 후 SQL 문을 다시 컴파일할 필요 없이 서로 다른 매개 변수 값을 사용하여 여러 번 실행될 수 있기 때문에 성능이 향상됩니다.
-
명시적 데이터 유형 지정
-
매개 변수를 사용하면 SQL 문을 생성할 때는 알 수 없는 값의 유형을 지정하여 대체할 수 있습니다. 데이터베이스에 전달되는 값에 대한 저장소 클래스를 확보하는 방법은 매개 변수를 사용하는 것 외에는 없습니다. 매개 변수를 사용하지 않으면 런타임에서 모든 값을 관련 열의 유형 선호도에 따라 텍스트 표현에서 저장소 클래스로 변환하려고 합니다.
저장소 클래스와 열 선호도에 대한 자세한 내용은
데이터 유형 지원
을 참조하십시오.
-
보안 강화
-
매개 변수를 사용하면 SQL 삽입 공격이라는 악의적인 기술을 방지할 수 있습니다. SQL 삽입 공격에서는 사용자가 액세스 가능한 위치(예: 데이터 입력 필드)에 SQL 코드를 입력합니다. 사용자 입력을 SQL 텍스트로 직접 연결하여 응용 프로그램 코드에서 SQL 문을 생성하면 사용자가 입력한 SQL 코드가 데이터베이스에 대해 실행됩니다. 다음은 사용자 입력을 SQL 텍스트로 연결하는 예제입니다.
이 방법을 사용하지 마십시오.
// assume the variables "username" and "password"
// contain user-entered data
var sql:String =
"SELECT userId " +
"FROM users " +
"WHERE username = '" + username + "' " +
" AND password = '" + password + "'";
var statement:SQLStatement = new SQLStatement();
statement.text = sql;
사용자가 입력한 값을 문의 텍스트로 연결하는 대신 문 매개 변수를 사용하면 SQL 삽입 공격을 방지할 수 있습니다. 매개 변수 값은 리터럴 문 텍스트의 일부가 되지 않고 대체된 값으로 명시적으로 처리되므로 SQL 삽입이 발생할 수 없습니다. 다음은 이전 샘플 대신 사용할 수 있는 권장 방법입니다.
// assume the variables "username" and "password"
// contain user-entered data
var sql:String =
"SELECT userId " +
"FROM users " +
"WHERE username = :username " +
" AND password = :password";
var statement:SQLStatement = new SQLStatement();
statement.text = sql;
// set parameter values
statement.parameters[":username"] = username;
statement.parameters[":password"] = password;
|
|
|