PE Notes · DB
정적 SQL과 동적 SQL
컴파일 시 구조가 고정되는 정적 SQL과 실행 시 문자열로 만드는 동적 SQL을 보안·성능·유연성으로 비교하고, 바인딩과 화이트리스트를 정리합니다.
같은 SELECT라도, 물음표에 값만 넣는 길과 문자열을 이어 문장을 새로 만드는 길이 있습니다. 은 작성 시점에 구조가 닫히고, 은 실행 시점에 문장이 열립니다. 선택은 보안·성능·유연성 사이입니다.
정의와 비교
정적은 나 저장 프로시저처럼 뼈대가 고정되고 만 바뀝니다. 동적은 조건·테이블·컬럼 이름 자체가 문자열로 붙습니다. 입력을 따옴표 안에 그대로 넣으면 구조가 바뀌어 이 됩니다.
| 축 | 정적 | 동적 |
|---|---|---|
| 확정 시점 | 컴파일 | 실행 |
| 구현 | Prepared Statement, 프로시저 | 문자열, EXECUTE IMMEDIATE |
| 인젝션 | 값과 구조 분리 | 입력이 구조를 바꿀 수 있음 |
| 성능 | 실행 계획 재사용 | 매번 파싱 |
| 유연 | 구조 고정 | 테이블·열 변경 가능 |
| 쓰임 | 일반 CRUD | 동적 검색, 관리 도구 |
실행과 보안
정적은 처음 한 번 파싱·계획을 만들고 캐시에 둡니다. 이후는 값만 넣습니다(). 동적은 문장이 달라질 때마다 가 납니다.
테이블·컬럼 이름은 플레이스홀더로 못 막습니다. 허용 목록에 있는 이름만 이어 붙이고, 나머지 조건은 다시 바인딩합니다. 도 생성 결과를 읽기 전용과 바인딩으로 감싸야 같은 구멍에 빠지지 않습니다.
바인드 변수는 계획을 안정되게 하지만, 첫 실행 값이 이후 계획을 고정하는 스니핑이 있습니다. 분포가 극단이면 통계 갱신이나 힌트를 검토합니다.
커서는 두 방식 모두에서 결과 행을 한 줄씩 가져올 때 씁니다. 방식 선택의 축은 아닙니다.
| 상황 | 선택 |
|---|---|
| 일반 CRUD, 사용자 입력 | 정적 + 바인딩 |
| WHERE 조합 | 정적 또는 타입 안전한 빌더 |
| 테이블·컬럼이 입력 | 동적 + 화이트리스트 |
| 대량 INSERT | 배치 Prepared Statement |