SQL
"Structured Query Language - the relational language of choice."
— 관계형 데이터베이스의 아버지 에드거 커드의 논문을 실무적 언어로 구체화한 IBM 연구소의 초기 선언.
자연어처럼 부드럽게 읽힌다면서, 조금만 복잡해지면 서브쿼리와 윈도우 함수가 얽혀 웬만한 하드코어 알고리즘 코드보다 해석하기 힘들어진다. 제발 한 번만 물어보자, 왜 이 SELECT 쿼리는 어제랑 똑같이 짰는데 오늘은 인덱스를 안 타고 풀 스캔을 도는 것인가?
1. 개요
SQL(Structured Query Language)은 관계형 데이터베이스(RDBMS)의 데이터를 정의하고, 조작하며, 제어하기 위해 사용하는 표준 선언형 프로그래밍 언어이다. 독자적인 실행 흐름 제어 구조 없이, "내가 원하는 데이터는 이것이다"라고 명시만 하면 DBMS 내부의 옵티마이저가 최적의 실행 계획을 짜서 결과를 뽑아낸다.
현대 백엔드 개발자라면 원하든 원치 않든 마주할 수밖에 없는 절대적인 거인이며, 데이터 분석가나 마케터 등 비개발 직군에서도 필수적인 생존 스킬로 각광받고 있다. 하지만 SQL이 자연어와 비슷하다는 초기의 사기적인 영업 멘트에 속아 입문했다가는, 수천 줄에 달하는 레거시 프로시저를 해독하다 안구 건조증을 얻게 된다.(...)
2. SQL의 양대 축과 트레이드오프: DDL/DML과 스캔 방식의 차이
2.1. 뼈대를 세우고 데이터를 굴리는 법: DDL과 DML
SQL은 역할에 따라 크게 데이터의 골격을 정의하는 DDL(Data Definition Language)과 실제 알맹이를 다루는 DML(Data Manipulation Language)로 나뉜다.
- DDL (
CREATE,ALTER,DROP): 데이터베이스 스키마와 테이블 구조를 정의한다. 실무에서 메인 DB에 아무 생각 없이ALTER TABLE을 날렸다가 테이블 락(Table Lock)이 걸려 전사 서비스가 마비되는 참사를 유발하기도 한다.1 - DML (
SELECT,INSERT,UPDATE,DELETE): 실질적으로 데이터를 다루는 쿼리이다. 백엔드 코드의 대부분을 차지하며,WHERE절이 빠진DELETE는 개발자의 커리어를 깔끔하게 정리하는 마법을 부린다.
2.2. 인덱스 스캔(Index Scan) vs 풀 스캔(Full Table Scan)
데이터를 가져올 때, DB는 두 가지 경로를 고민한다. 목차를 보고 쏙쏙 골라내는 인덱스 스캔(Index Scan)과, 책 전체를 처음부터 끝까지 훑는 풀 테이블 스캔(Full Table Scan)이다. 수백만 건의 데이터가 쌓인 프로덕션 환경에서 인덱스를 제대로 타지 못해 풀 스캔이 일어나는 순간, CPU 사용률이 100%를 찍으며 사내 메신저에 장애 알림봇이 미쳐 날뛰기 시작한다.(...)
이 때문에 개발자들은 매번 EXPLAIN 명령어를 쿼리 앞에 붙여가며 DB 옵티마이저가 인덱스를 아름답게 타고 있는지 구걸하는 고달픈 일상을 보낸다.
3. SQL Injection과 WHERE 절 누락
3.1. WHERE 절 없는 UPDATE/DELETE
모든 백엔드 개발자의 악몽 중의 악몽. 가령 퇴사 직전의 개발자가 홧김에 날리거나, 피로에 찌든 DBA가 실수로 WHERE 조건을 빠뜨린 채 UPDATE users SET status = 'dormant';를 날리는 순간, 수천만 명의 유저가 한 번에 휴면 계정으로 강제 전환되는 천국과 지옥의 문이 열린다. 깃 커밋보다 쿼리 한 줄 실행할 때 손을 더 사르르 떨게 만드는 주범이다.
4. 여담
- SQL의 발음 논쟁: SQL을 에스큐엘로 읽을 것인가, '시퀄(Sequel)'로 읽을 것인가에 대한 논쟁은 개발자 모임에서 탕수육 부먹 찍먹만큼이나 치열한 떡밥이다. 역사적으로는 IBM의 초기 구현 명칭이 SEQUEL이었기 때문에 시퀄파가 정통성을 주장하지만, 상표권 문제로 SQL로 개명되어 현재는 혼용되고 있다.
- ACID 정합성과의 유착: SQL을 사용하는 RDBMS는 트랜잭션의 정합성을 절대 사수하는 ACID 속성을 보장한다. NoSQL이 빠른 속도와 유연함으로 덤벼들었으나, 금융 거래처럼 단 일원짜리 오차도 없어야 하는 비즈니스는 여전히 SQL의 제국 아래에 놓여 있다.2
- 자비 없는 ANSI 표준: ANSI SQL 표준이라는 것이 존재하지만, 실제로는 Oracle, MySQL, MS-SQL 등 각 벤더사마다 자기들 편의대로 방언(Dialect)을 대거 주입해 두었기 때문에 데이터베이스 마이그레이션을 시도하면 쿼리를 전부 새로 짜야 하는 눈물겨운 대공사가 벌어진다.