"Prepared Statement 올바르게 사용하기", 제 1회 대충콘 세미나 발표 및 시연 자료가 담겨 있습니다.
발표자의 똘끼에 의해 모든 PHP 파일 및 HTML 파일들은 EXE, DLL 등 희한한 확장자로 되어있으니 유의 바랍니다.
(실제로 서버에서 저 확장자로 돌렸습니다)
그냥 에디터로 여시면 됩니다.
slido@DAECHUNG 에 올라왔던 질문 및 생각나는것들 중심으로 정리하였습니다. 현장에서 설명이 많이 미흡하다고 생각되어 작성합니다.
개발회사에서 php와 같은 이전 기술보다 서버프레임워크인 spring 프레임워크, django, node와 같은 프레임워크를 사용하는 추세로 알고 있는데 왜 php로 테스트하셨나요?
PHP가 확실히 오래된 기술이 맞습니다. 그러나 단지 오래되었다 뿐이지 PHP 또한 지속적으로 발전해왔고 그 결과가 PHP 7과 Modern PHP, 그리고 laravel이나 codeigniter 등으로 대표되는 프레임워크들입니다. 5년 전부터 말씀해 주신 신기술들이 적극적으로 사용되려는 움직임이 보이고 있지만 특히나 국내의 경우에는 XpressEngine, GnuBoard 등으로 인해 중소규모 시스템 개발에서는 적극적으로 사용되고 있습니다. 즉, 아직까진 확발히 사용되고 있습니다.
PHP를 데모에 사용한 이유는 그저 PHP가 예시를 보이기 간단한 언어였기 때문입니다. 1) 시연 환경을 간단하게 세팅 가능하며 2) 시나리오를 직관적으로 보여주기 용이하였기 때문입니다. 특히나 인터프리터 언어라는 특성상 오류가 발생할 경우 즉석에서 수정하기도 간단했습니다.
ORDER BY 절은 다음과 같이 사용된다는 사실을 아실겁니다.
ORDER BY attribute_name sort[, attribute_name sort, ...]
Prepared Statement는 데이터를 파라메터로 전달하기 위한 기능으로 ORDER BY 다음에 오는 어트리뷰트 이름에는 데이터가 올 수 없습니다. 즉, ORDER BY 절에 Prepared Statement를 사용하지 못할 뿐만 아니라 사용할 이유도 없습니다.
상황에 따라 ORDER BY 절 뒤에 나오는 내용에 변화를 주어야 한다면, 이것은 Prepared Statement를 사용하는 것이 아니라 백엔드 단에서 시큐어 코딩을 통해 안전한 ORDER BY 절을 구성하여 쿼리를 작성하여야 합니다.
단 한번만 쓰인다
라는 표현은 개별 요청에 대한 것으로 서버가 생성된 이후 없어질 때 까지 쓰이지 않는다는 의미가 아닙니다. 어떤 PHP 파일에 대해 요청이 들어올 경우 PHP 인터프리터는 해당 PHP파일을 실행할 것이고 그때마다 매번 커넥션 객체와 Prepared Statement 객체가 생성 될 것입니다. 이때, 이 Prepared Statement 객체에서 execute() 메서드를 단 한번만 사용하고 요청이 종료된다면 Prepared Statement를 사용함으로서 성능의 이득을 얻기는 힘들 것이라는 의미였습니다.
발표 당시에도 말했 듯 정크테이블을 이용하여 할 수 있는 것은 거의 없습니다. 그나마 DoS를 통한게 유효한 방법이 될 수 있을텐데 이것을 제외한다면 역시 DB내 데이터의 무결성을 저해하거나 유지보수를 방해한다는 면이 더 강하지 않을까 싶습니다.