데이터베이스를 다루다 보면 SQL 문장을 미리 고정해서 작성하는 방식과 실행 시점에 동적으로 생성하는 방식, 두 가지로 나눌 수 있습니다. 각각 정적 SQL(Static SQL)과 동적 SQL(Dynamic SQL)이라고 부르며, 성능·보안·유연성 측면에서 뚜렷한 차이를 보입니다. 이 글에서는 두 방식의 개념과 핵심 차이점을 정리해 드립니다.
정적 SQL(Static SQL)이란?
정적 SQL은 쿼리 문장이 고정되어 있어 애플리케이션 코드에 직접 하드코딩할 수 있는 SQL을 의미합니다. 쿼리 구조가 사전에 확정되어 있기 때문에 컴파일 시점에 분석과 최적화가 가능하며, 별도의 특수한 보안 처리 없이도 안정적으로 사용할 수 있다는 장점이 있습니다.
동적 SQL(Dynamic SQL)이란?
동적 SQL은 사용자의 입력값에 따라 실행 시점에 SQL 문장이 생성되어 실행되는 방식입니다. 조건이 상황마다 달라지는 환경에서 범용적이고 유연한 애플리케이션을 개발할 때 유용합니다. 다만 더 많은 데이터베이스 권한과 철저한 보안 처리가 필요하며, 입력값 검증이 부족하면 악의적인 사용자가 SQL 인젝션과 같은 위험한 코드를 주입할 수 있다는 점을 반드시 유의해야 합니다.
정적 SQL vs 동적 SQL 핵심 차이점 비교표
아래 표에서 두 방식의 주요 차이점을 7가지 기준으로 한눈에 비교할 수 있습니다.
| 번호 | 구분 기준 | 정적 SQL | 동적 SQL |
|---|---|---|---|
| 1 | 데이터베이스 접근 | 접근 절차가 문장 작성 시점에 미리 결정됩니다. | 데이터베이스에 어떻게 접근할지는 런타임에만 결정할 수 있습니다. |
| 2 | 효율성 | 더 빠르고 효율적입니다. | 상대적으로 효율성이 떨어집니다. |
| 3 | 컴파일 시점 | 컴파일 타임에 컴파일됩니다. | 런타임에 컴파일됩니다. |
| 4 | 애플리케이션 플랜 | 구문 분석, 검증, 최적화, 플랜 생성이 모두 컴파일 타임에 수행됩니다. | 구문 분석, 검증, 최적화, 플랜 생성이 모두 런타임에 수행됩니다. |
| 5 | 활용 사례 | 균등하게 분포된 데이터에 적합합니다. | 비균등하게 분포된 데이터에 적합합니다. |
| 6 | 동적 문장 사용 여부 | EXECUTE IMMEDIATE, EXECUTE, PREPARE 같은 문장을 사용하지 않습니다. | EXECUTE IMMEDIATE, EXECUTE, PREPARE 같은 문장을 사용합니다. |
| 7 | 유연성 | 유연성이 낮습니다. | 매우 유연합니다. |
어떤 상황에서 무엇을 선택해야 할까?
정적 SQL은 쿼리 형태가 고정된 배치 작업, 반복적인 조회 로직처럼 성능과 안정성이 중요한 경우에 적합합니다. 실행 계획이 미리 최적화되어 있어 예측 가능한 응답 속도를 기대할 수 있습니다.
동적 SQL은 검색 조건이 사용자마다 달라지는 화면, 필터와 정렬이 자주 바뀌는 관리자 도구처럼 유연성이 요구되는 경우에 강점을 발휘합니다. 단, 반드시 바인딩 변수(Prepared Statement) 사용과 입력값 검증으로 SQL 인젝션을 예방해야 안전하게 운영할 수 있습니다.