Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL 준비된 명령문(Prepared Statement) 사용법: PREPARE부터 DEALLOCATE까지

MySQL 서버는 준비된 명령문(Prepared Statement)을 지원합니다. 이는 쿼리 구조는 동일하지만 일부 값만 다른 여러 개의 쿼리를 반복 실행해야 할 때 특히 유용합니다. 명령문을 한 번 준비(prepare)한 뒤 여러 번 실행(execute)할 수 있으며, 실행할 때마다 서로 다른 데이터 값을 바인딩하여 전달할 수 있습니다.

준비된 명령문은 클라이언트/서버 바이너리 프로토콜을 활용하며, 전체 명령문이 서버에서 단 한 번만 파싱되기 때문에 반복 실행 시 성능이 크게 향상됩니다. 또한 값이 쿼리 문자열과 분리되어 전달되므로 SQL 인젝션 공격을 방지하는 데에도 도움이 됩니다.

MySQL 준비된 명령문 사용 3단계

1단계: 명령문 준비하기 (PREPARE)

PREPARE 문을 사용하여 실행할 명령문을 준비합니다. 예를 들어 'Tender' 테이블의 데이터를 조회하는 명령문을 다음과 같이 준비할 수 있습니다.

PREPARE stmt FROM 'SELECT tender_value FROM Tender WHERE Companyname = ?';

여기서 물음표(?)는 나중에 실제 값이 바인딩될 자리 표시자(placeholder)입니다.

2단계: 준비된 명령문 실행하기 (EXECUTE)

PREPARE로 준비한 명령문은 EXECUTE 문으로 실행합니다.

EXECUTE stmt USING @variable_name;

@variable_name에는 PREPARE 문의 물음표(?) 위치에 전달할 값이 담깁니다. 준비된 명령문을 실행하기 전에 반드시 SET 문으로 @variable_name에 값을 미리 할당해야 합니다.

3단계: 준비된 명령문 해제하기 (DEALLOCATE)

마지막 단계에서는 DEALLOCATE 문을 사용하여 더 이상 필요하지 않은 준비된 명령문을 해제하고 서버 리소스를 반환합니다.

DEALLOCATE PREPARE stmt;

실제 실행 예제

다음은 위의 세 단계를 실제로 실행한 전체 과정입니다.

mysql> PREPARE stmt FROM 'SELECT tender_value from Tender WHERE Companyname = ?';
Query OK, 0 rows affected (0.09 sec)
Statement prepared

mysql> SET @A = 'Singla Group.';
Query OK, 0 rows affected (0.00 sec)

mysql> EXECUTE stmt USING @A;
+--------------+
| tender_value |
+--------------+
|   220.255997 |
+--------------+
1 row in set (0.07 sec)

mysql> DEALLOCATE PREPARE stmt;
Query OK, 0 rows affected (0.00 sec)

정리

MySQL의 준비된 명령문은 PREPARE → EXECUTE → DEALLOCATE의 3단계로 사용합니다. 동일한 쿼리를 서로 다른 값으로 반복 실행해야 하는 경우 파싱 오버헤드를 줄여 성능을 높일 수 있고, 값이 쿼리 문자열과 분리되어 전달되기 때문에 보안 측면에서도 안전한 방식입니다.