[Sequelize] 생쿼리: prepared query 쓰기

[원본 링크]

https://blog.naver.com/sssang97/221968933226
이전 포스트에서 생쿼리를 날리는 법을 간단히 다룬 적이 있었다.
그런데 ORM을 쓰지 않는다면 유의해야 할 점이 있으니, 바로 이스케이핑 문제다.

코드상에서 쿼리 안에 값들을 집어넣으려면 어떻게 해야할까?
별 생각없이 짠다면 이런식의 코드가 탄생할 수 있다.

로직상으로는 별 문제가 없어보인다.
실제로도, 저대로 돌려도 당장은 별 문제 없이 동작할 것이다.

근데, 여기엔 변수가 존재한다. 들어갈 텍스트에 '가 들어있다면?

쿼리가 깨지고 만다!
SQL에서 '는 텍스트를 구분하는 구분자이기 때문이다.
여기서는 내가 텍스트 코드를 집어넣어서 다른 문제는 없지만, 사용자 입력값이 들어오는 부분이라면 심각해진다. 악의적인 사용자가 이를 이용해서 SQL 인젝션을 걸 수도 있는 것이다.
자칫하면 DB가 망가질 수도 있고...

그래서 쿼리 내에 값을 주입할 때면, Prepared Statement 등으로 불리는 대체 기능을 사용해야 한다.
쿼리 텍스트에 특수한 식별자로 구멍을 뚫어놓고, 주입될 값은 별개의 인자로 전달하는 것이다.
그럼 해당 라이브러리 내에서 그걸 안전하게, 펑크가 나지 않도록 처리해서 쿼리 안에 삽입해준다.

이렇게 말이다.
저 :input이 이름붙은 대체 식별자고, replacements 옵션을 통해 대체될 값들을 지정해주는 것이다.

이름을 쓰기 귀찮다면 이렇게 해도 된다.

근데 쓰는 게 나은 것 같다.

여튼 저런식으로 지정해서 사용하면

문제없이 실행이 된다.
로우쿼리를 쓸 때는 이런식으로 쓰는 것이 좋다.


참조
https://sequelize.org/v5/manual/raw-queries.html