프리페어드 스테이트먼트란?
MySQL에서 프리페어드 스테이트먼트(Prepared Statement)는 SQL 쿼리를 미리 컴파일해 두고, 실행 시점에 필요한 값만 파라미터로 전달하여 사용할 수 있게 해주는 기능입니다. 이를 활용하면 동일한 쿼리를 반복 실행할 때 성능이 향상되고, SQL 인젝션 공격에 대한 보안성도 높아집니다.
다음 예제를 통해 프리페어드 스테이트먼트를 사용하여 테이블을 업데이트하는 과정을 쉽게 이해할 수 있습니다. 여기서는 'Student'라는 테이블의 데이터를 수정해 보겠습니다.
1단계: 기존 데이터 확인
먼저 현재 'Student' 테이블에 저장된 데이터를 조회합니다.
mysql> Select * from Student; +------+-------+ | Id | Name | +------+-------+ | 1 | Ram | | 2 | Shyam | | 3 | Mohan | +------+-------+ 3 rows in set (0.00 sec)
2단계: PREPARE 문으로 쿼리 준비하기
PREPARE 문을 사용하면 UPDATE 쿼리를 미리 준비해 둘 수 있습니다. 이때 나중에 값을 전달받을 부분은 물음표(?) 플레이스홀더로 표시합니다.
mysql> PREPARE stmt11 FROM 'UPDATE Student SET Name = ? WHERE Id = ?'; Query OK, 0 rows affected (0.03 sec) Statement prepared
위 쿼리에서 첫 번째 '?'는 변경할 이름(Name) 값, 두 번째 '?'는 조건이 될 아이디(Id) 값을 의미합니다.
3단계: SET 문으로 변수 값 지정하기
플레이스홀더에 전달할 실제 값을 사용자 정의 변수(@A, @B)에 저장합니다.
mysql> SET @A = 'Sohan', @B = 3; Query OK, 0 rows affected (0.00 sec)
여기서는 Id가 3인 학생의 이름을 'Sohan'으로 변경하도록 설정했습니다.
4단계: EXECUTE 문으로 쿼리 실행하기
EXECUTE 문과 USING 절을 함께 사용하여, 앞서 지정한 변수 값을 프리페어드 스테이트먼트에 전달하고 쿼리를 실행합니다.
mysql> EXECUTE Stmt11 USING @A, @B; Query OK, 1 row affected (0.05 sec)
5단계: 결과 확인
업데이트가 정상적으로 적용되었는지 다시 데이터를 조회해 확인합니다.
mysql> Select * from student; +------+-------+ | Id | Name | +------+-------+ | 1 | Ram | | 2 | Shyam | | 3 | Sohan | +------+-------+ 3 rows in set (0.00 sec)
결과를 보면 Id가 3인 학생의 이름이 'Mohan'에서 'Sohan'으로 성공적으로 변경된 것을 확인할 수 있습니다.
정리
프리페어드 스테이트먼트로 테이블을 업데이트하는 절차는 다음 세 단계로 요약됩니다.
- PREPARE: 플레이스홀더(?)가 포함된 UPDATE 쿼리를 미리 준비합니다.
- SET: 플레이스홀더에 전달할 값을 사용자 정의 변수에 저장합니다.
- EXECUTE ... USING: 변수 값을 전달하며 준비된 쿼리를 실행합니다.
이러한 방식은 쿼리 구조를 재사용하면서 값만 바꿔가며 실행할 수 있어, 반복적인 데이터 갱신 작업에서 특히 유용합니다.