[SQL] 신입에게 추천하는 SQL 작성 팁 (콤마 위치, WHERE 1=1)

SHORTCUT

    반응형

    인트로

    SM 회사의 개발자에겐 프론트, 백엔드 구분이 크게 존재하지 않는다. 내가 맡은 서비스에서 주어진 파트를 풀로 담당할 뿐이다. 그래서 나 또한 입사 이전에는 프론트 엔지니어를 꿈꾸었지만 지금은, 백엔드까지 함께 개발하고 있다. (그래도 프론트 단 개발이 많은 전시/프로모션 파트로 배정되어서, 프론트 개발의 갈증을 약간씩 해소하고 있다)

     

    백엔드 또한 개발하다보니 DB도 함께 건들이게 되었다. 이전에 프로젝트로 MySQL 까진 다뤄봤는데, 여긴 오라클 DB를 사용중이었다. 그리고 실무로 쓰이는 쿼리문을 보며, 참으로 복잡하단 생각을 했다. (입사 초기엔 쿼리문 분석하느라 하루를 다 보냈다.. 지금도 ..😮‍💨)

     

    실무에 쓰이는 쿼리문을 보며 가졌던 궁금증이나 약간의 미립자 팁들을 가져왔다.

    SQL이 서툰 신입분들이 보고 도움이 되었으면 좋겠다.

    콤마는 앞에 찍자!

    SELECT A
           B,
           C,
           D,
    FROM table
    ;

    보통 다중 값을 조회하는 SELECT 문을 작성 할 때,습관적으로 콤마를 뒤에 찍게 된다.

     

    하지만 그와 동시에 우리는 복붙을 자주 사용하게 되는데, 습관적으로 뒤에 찍은 콤마로 인해 D,의 형태로 셀렉문이 종료되어 에러가 날 수 있다.

     

    따라서, 복붙과 실수를 방지하기 위해 콤마를 앞에 찍자!

    SELECT A
          ,B
          ,C
          ,D
    FROM table
    ;

    조건을 붙일 땐, WHERE 1=1을 활용하자!

    SELECT A
          ,B
    FROM table
    WHERE 1=1
      AND age >= 10
      AND grade in ('A', 'B', 'C')
    ;

    조건절을 보면 WHERE 1=1 으로 시작되는 것을 실무에서 자주 볼 수 있다.

     

    이를 분석해보면 1=1 은 참이다. 따라서 조건절의 시작을 true로 실행하는 모습이다.

    그렇담 왜 이렇게 하는가?

    1) 주석 처리를 쉽게 하기 위해서

    WHERE 1=1
      AND age >= 10
      -- AND grade in ('A', 'B', 'C')
      -- AND 조건3
      AND 조건4

    SELECT문을 작성하여 데이터를 체크하기 위해선 다양한 조건절을 활용하게 된다.
    이 과정에서 조건절을 주석 처리하며 조회할 때 WHERE 1=1이 유용하게 활용될 수 있다.

     

    만약 WHERE age >= 10 으로 작성했는데, age 조건을 주석처리 하고 싶다면?
    다시 WHERE를 써야하는 수고로움이 발생될 것이다..

    2) 다이나믹 쿼리를 작성하기 위해서

    다이나믹 쿼리 Dynamic Query 란?
    파라메터 Parameter로 들어오는 값에 의해, 쿼리를 동적으로 바꿔주는 기능이다.
    if문 등을 통해 조회하는 쿼리문을 수정할 수 있다.
    Spring 프레임워크의 마이바티스 MyBatis가 사용 예시이다.

    <SELECT id="select">
      SELECT A
            ,B
      FROM table
      WHERE 1=1
          <if test="name != null">
            AND name = #{name}
        </if>
        AND grade in ('A', 'B', 'C')
      ;
    </SELECT>

    만약 파라메터로 이름을 받았을 때, 이름을 조건절에 추가한다고 한다면 위와 같이 작성 할 수 있다.

     

    이 과정에서 WHERE 1=1을 작성하지 않는다면, 다음과 같이 작성될 것이다.

    ...
          <if test="name != null">
            WHERE name = #{name}
        </if>
        AND grade in ('A', 'B', 'C')
    ...

    그런데 name이 존재하지 않는다면, WHERE 키워드 없이 작성되게 될 것이다.

     

    따라서 항상 참인 조건을 앞에 걸어둠으로써 다이나믹 쿼리의 if문으로 작성되는 조건이 없더라도 지장이 없도록 할 수 있다.

    🚨 주의 할 점

    WHERE 1=1을 작성할 때 주의할 점은, 단순 조회가 아닌 데이터의 변경이 일어나는 UPDATEDELETE 에선 그 작성을 유의해야 한다.

    <delete id="delete">
      DELETE 
      FROM table
      WHERE 1=1
          <if test="name != null">
            AND name = #{name}
        </if>
      ;
    </SELECT>

    만약 이처럼 파라메터로 들어오는 이름에 대해서 삭제하는 SQL문을 작성했다. 하지만 만약 name 파라메터가 없다면?

    DELETE 
    FROM table
    WHERE 1=1
    ;

    다음의 모습처럼 조건이 참인 상태로 되어, table의 모든 값이 삭제되는 중대한 문제가 발생될 것이다.
    UPDATEDELETE 에선 문제를 예방하기 위해 WHERE 1=1 사용을 지양하는 것이 좋다.

    WHERE 1=1 은 조회문에서만 사용하자 ^--^
    왜냐면 주석처리가 쉬우니까...


    반응형

    댓글

    Designed by JB FACTORY