다섯 살도 알 수 있게 · DB/데이터

동적 SQL이 뭐예요?

동적 SQL을, 손님 요청에 따라 그 자리에서 조건을 끼워 넣어 주문서를 조립하는 포장 담당 이야기로 풀어봤어요.

구역만요색상이랑 구역이요아무 조건 없이 전부요요청마다 찾는 조건이 다 달라요

요청마다 찾는 조건이 다 달라요.미리 정해둔 양식 하나로는 모든 조건 조합을 담지 못해요.

구역만색상만둘다조건 조합마다 양식을 미리 다 찍어둘 순 없어요...미리 찍은 양식 몇 개는 안 쓰인 채 남아요

고정 양식만으로는 조합을 다 미리 찍어둘 수 없어요.조건 조합이 늘어날수록 안 쓰이는 양식만 쌓여요.

B구역 + 빨강동적 SQL = 요청 들을 때마다 그 자리에서 조립하는 주문서요청에 있는 조건은 넣고, 없는 조건은 빼서 조립한 뒤 실행해요

동적 SQL은 요청 들을 때마다 그 자리에서 조립하는 주문서예요.요청에 있는 조건은 넣고, 없는 조건은 빼서 조립한 뒤 실행해요.

요청 들을 때마다 조립실행 직전에 만들어요
조건 있으면 추가WHERE 조건을 덧붙여요
빈칸은 안전하게 끼우기파라미터 바인딩이에요
조립 끝나면 실행완성된 문장을 실행해요
기본 틀+구역=B+색상=빨강→완성!요청에 조건이 있을 때만 그 조건 조각을 덧붙여요

요청에 조건이 있을 때만 그 조건 조각을 덧붙여요.기본 틀 + 조건 조각들 = 완성된 SQL 문장.

값만 빈칸에 안전하게 끼우기손님 글자를 그대로 붙여넣기손님이 쓴 글자를 그대로 이어붙이면 엉뚱한 지시가 끼어들 수 있어요(SQL 인젝션)

주문서 빈칸에는 값만 안전하게 끼워야 해요.손님이 쓴 글자를 그대로 이어붙이면 엉뚱한 지시가 끼어들 수 있어요(SQL 인젝션).

한 줄로

동적 SQL은 실행 시점에 조건에 따라 그 자리에서 SQL 문장을 조립하는 방식이에요. 미리 고정해 둔 정적 SQL과 반대예요.

정적 SQL은 컴파일(또는 저장 프로시저 등록) 시점에 문장이 고정되어 실행 계획을 재사용하기 쉬운 반면, 동적 SQL은 검색 조건이 가변적인 화면(선택적 필터가 많은 조회 화면 등)에 적합해요. 다만 문자열을 그대로 이어붙이면 SQL 인젝션에 취약해지므로, 반드시 파라미터 바인딩으로 값을 안전하게 끼워 넣어야 해요.

어른들은 이렇게 불러요

정적 SQL
Static SQL
미리 찍어둔 고정 양식. 실행 계획을 재사용하기 쉬워요.
동적 SQL
Dynamic SQL
그 자리에서 조립하는 양식. 조건이 가변적인 화면에 맞아요.
파라미터 바인딩
Parameter Binding
값만 빈칸에 안전하게 끼우기. 문자열을 직접 이어붙이지 않아요.
SQL 인젝션
SQL Injection
빈칸에 엉뚱한 지시가 끼어드는 일. 보안 분야에서 자세히 다뤄요. → 끼어드는 나쁜 지시
PREPARE/EXECUTE
PREPARE/EXECUTE
SQL 양식을 미리 준비해두고 값만 바꿔 반복 실행. 같은 모양 요청이 많을 때 빨라요.
저장 프로시저 내 동적 SQL
Dynamic SQL in Stored Procedures
SQL 문장을 저장 프로시저 안에서 조립하기. 조립한 문장은 프로시저와 별개로 권한을 검사하기도 해서, 실행 권한 설정이 더 까다로워요.
실행계획 재사용
Plan Cache Reuse
같은 모양 SQL은 실행 계획을 다시 안 짜요. 문장 모양이 매번 달라지는 동적 SQL은 이 재사용이 어려워요.
ORM 동적 쿼리 빌더
ORM Query Builder
코드로 주문서를 짜 맞추는 도구. 내부적으로 동적 SQL을 만들어요.
다음 이야기
선반을 쪼개고 겹쳐서 쌓기 →
다른 용어도 그림책으로 보고 싶다면 요청하기 →