최근 웹사이트 보안이 이슈화 되면서 사이트 보안 담당자들이 SQL Injection을 막기 위해 Dynamic SQL 사용을 제한하고 있다.

상황에 따라 변화하는 SQL 생성을 위해서 대부분의 개발자들이 Client Side에서든 Server Side에서든 Dynamic SQL을 문자열로 조합하여 실행하는 방법을 사용하는 상황에서 기존에 개발되어 있거나 앞으로 개발하게 될 SQL 문을 Static SQL로 변환하는 것은 골치 아픈 문제거리이다.

예를 들어, 검색 조건 3개(@cond1, @cond2, @cond3)를 Parameter로 가지는 프로시져에서 Parameter의 값 조건에 따라 SQL을 Dynamic하게 구성하여 생성하던 것을 Static SQL로 변환한다고 가정해 보면 아래와 같은 조건 분기에 따라 Static SQL(초록색부분) 총 8개를 만들어 넣어야 한다.(세상에나!!!)

<예제 코드>
IF @cond1 IS NOT NULL
BEGIN
  IF @cond2 IS NOT NULL
  BEGIN
     IF @cond3 IS NOT NULL
     BEGIN
        -- Static SQL
     END
     ELSE
     BEGIN
        -- Static SQL
     END
  END
  ELSE
  BEGIN
     IF @cond3 IS NOT NULL
     BEGIN
        -- Static SQL
     END
     ELSE
     BEGIN
        -- Static SQL
     END
  END
END
ELSE
BEGIN
  IF @cond2 IS NOT NULL
  BEGIN
     IF @cond3 IS NOT NULL
     BEGIN
        -- Static SQL
     END
     ELSE
     BEGIN
        -- Static SQL
     END
  END
  ELSE
  BEGIN
     IF @cond3 IS NOT NULL
     BEGIN
        -- Static SQL
     END
     ELSE
     BEGIN
        -- Static SQL
     END
  END
END


이 방법은 작업 시간도 많이 걸릴 뿐 아니라 코드의 가독성, 수정, 유지 보수성 모두를 어렵게 만들어서 개발자의 여름 휴가 따위는 꿈도 꾸지 못하게 할 수 있다. 저멀리 해변에 널린 육떡진(^^;;) 츠자들이 그립지 않겠는가 말이다.

더구나! 이 경우는 조건이 달랑 3개뿐인 경우이다. 잘 생각해보면 조건의 갯수가 n개라고 했을 때 이에 비례하여 늘어나는 Static SQL의 갯수는 2의 n승 개임을 알 수 있다. 이는 우리가 알고리즘 강의시간에 배운 시간 복잡도 측정 방법 즉, Big O 표기법을 이야기 할 때 가장 시간이 오래 걸린다고 알려져 있는 "O(2의 n승)"이 아닌가 말이다. 다시 말해서 조건이 10개가 되면 2의 10승 = 1024가 된다. 1024개의 Static SQL을 작성하여 분기문 사이에 붙여넣고 있다 보면 인생을 비관하게 될 지도 모르겠다...

하여... 이에 대한 해결책을 제안하고 있는 유명한 자료들을 링크해본다.
조만간 아래 자료들을 종합하여 Dynamic SQL 을 Dynamic SQL 변환하는 방법을 올릴 예정이다.

Posted by spponge

댓글을 달아 주세요