데이터와 보안 ·
SQL로 데이터를 만들고 찾고 고치고 지우는 첫 연습
먼저 답부터
SQL은 데이터베이스에 말을 거는 문법입니다. INSERT는 새 행을 넣고 SELECT는 조건에 맞는 행을 읽으며 UPDATE는 기존 값을 고치고 DELETE는 행을 지웁니다. 변경 명령은 WHERE 조건이 빠지면 범위가 커질 수 있으므로 같은 조건을 SELECT로 먼저 확인해야 합니다.
서비스에 회원, 주문, 할 일을 저장하려면 데이터베이스라는 전자 장부를 다루게 됩니다. SQL은 Structured Query Language의 줄임말로, 표에 무엇을 넣고 읽고 바꿀지 데이터베이스에 전달하는 문법입니다. 영어 단어가 보여도 네 가지 기본 동작부터 나누면 어렵지 않습니다.
식당 장부를 생각해 보세요. 새 주문을 한 줄 적고, 7번 테이블 주문을 찾고, 수량을 고치고, 취소된 주문을 지우는 흐름이 있습니다. SQL의 INSERT, SELECT, UPDATE, DELETE도 이 네 행동에 가깝습니다. 중요한 차이는 컴퓨터 장부에서는 조건 한 줄이 빠지면 많은 기록이 함께 바뀔 수 있다는 점입니다.
표와 행과 열부터 구분한다
table은 같은 종류의 기록을 모은 표, row는 한 건의 기록을 뜻하는 행, column은 이름이나 완료 여부처럼 모든 행이 공통으로 갖는 항목인 열입니다. 할 일 서비스라면 tasks라는 표에 id, title, done 열을 둘 수 있습니다.
각 열에는 데이터 타입이 있습니다. 데이터 타입은 그 칸에 어떤 종류의 값을 넣을지 정하는 규칙입니다. text는 글, integer는 정수, boolean은 참과 거짓, date는 날짜를 담는 데 쓸 수 있습니다. 타입은 장부 칸 위에 “날짜만”, “숫자만”이라고 붙인 라벨과 같습니다.
CREATE TABLE tasks (
id integer,
title text,
done boolean
);
이 예시는 표의 모양만 보여 줍니다. 실제 운영 데이터베이스에서 그대로 실행하지 말고 연습용 환경에서만 읽고 따라 하세요.
INSERT는 새 행을 만든다
INSERT는 표에 새 행을 넣는 명령입니다. 열 이름을 함께 적으면 어떤 값이 어느 칸에 들어가는지 확인하기 쉽습니다.
INSERT INTO tasks (id, title, done)
VALUES (1, '공식 문서 읽기', false);
문자 값은 작은따옴표로 감싸고, false는 아직 완료하지 않았다는 참거짓 값입니다. 열 순서와 값 순서가 맞지 않으면 다른 칸에 들어가거나 타입 오류가 날 수 있습니다. 그래서 열 이름을 생략하는 짧은 형태보다 처음에는 이름을 모두 적는 편이 안전합니다.
SELECT는 조건에 맞는 행을 읽는다
SELECT는 데이터를 읽는 명령입니다. 별표는 모든 열을 뜻하지만, 운영 화면에서는 필요한 열만 이름으로 적으면 결과를 이해하기 쉽고 불필요한 개인정보 노출도 줄일 수 있습니다.
SELECT id, title, done
FROM tasks
WHERE id = 1;
WHERE는 어떤 행을 고를지 적는 조건입니다. 위 명령은 id가 1인 행만 읽습니다. 조건 없이 SELECT를 실행하면 표의 모든 행을 읽을 수 있으므로 큰 표에서는 결과가 많아질 수 있습니다. 연습할 때도 LIMIT처럼 결과 수를 제한하는 기능을 함께 배우면 좋습니다.
UPDATE는 기존 행의 값을 고친다
UPDATE는 이미 있는 행의 일부 값을 바꿉니다. SET 뒤에 새 값을 적고 WHERE로 대상을 좁힙니다.
UPDATE tasks
SET done = true
WHERE id = 1;
여기서 가장 위험한 실수는 WHERE를 빼는 것입니다. 그러면 표의 모든 행이 완료 상태로 바뀔 수 있습니다. 실제 변경 전에는 같은 WHERE 조건을 SELECT에 넣어 대상이 한 건인지 확인하세요. 가능하다면 백업, 거래 단위, 승인 절차가 마련된 관리 도구를 사용합니다.
DELETE는 행을 지우므로 마지막에 배운다
DELETE는 조건에 맞는 행을 표에서 제거합니다. 칸 하나를 비우는 명령이 아니라 행 자체를 지우는 동작입니다.
DELETE FROM tasks
WHERE id = 1;
삭제는 휴지통이 없는 장부에서 한 줄을 찢는 일과 비슷합니다. 먼저 SELECT id, title FROM tasks WHERE id = 1;로 대상과 건수를 확인하고, 복구 가능한 백업이 실제로 있는지 살핍니다. 결제, 회원, 게시물처럼 다른 기록과 연결된 행은 외래키 규칙이나 법적 보관 기준도 확인해야 합니다.
네 명령을 한 흐름으로 읽는다
CRUD는 create, read, update, delete의 첫 글자를 모은 말로 생성, 조회, 수정, 삭제를 묶어 부르는 표현입니다. SQL에서는 보통 INSERT, SELECT, UPDATE, DELETE가 각각 대응합니다. 이름을 외우기보다 데이터가 어떻게 달라지는지 질문해 보세요.
- INSERT 뒤에는 행 수가 늘어나는지 봅니다.
- SELECT는 원본 데이터를 바꾸지 않는 조회인지 확인합니다.
- UPDATE 전후에는 같은 id의 값이 어떻게 달라졌는지 비교합니다.
- DELETE 전에는 삭제 대상 수와 복구 방법을 확인합니다.
- 모든 변경 뒤에는 다시 SELECT해 기대한 결과인지 검증합니다.
한 명령이 성공했다는 메시지만으로 화면과 데이터가 모두 맞다고 단정하지 않습니다. 애플리케이션 캐시나 권한 규칙 때문에 사용자가 보는 결과가 다를 수 있으므로 실제 기능도 별도로 확인합니다.
타입 오류는 억지 변환보다 입력부터 고친다
숫자 열에 글을 넣거나 날짜 형식이 맞지 않으면 데이터베이스가 오류를 돌려줄 수 있습니다. 일부 값은 자동 변환될 수 있지만 그 동작을 기대해 입력 규칙을 느슨하게 만들면 지역별 날짜나 소수점 표현에서 뜻이 달라질 수 있습니다.
사용자 입력을 SQL 문자열에 직접 이어 붙이는 것도 피해야 합니다. 공격자가 입력값으로 명령 구조를 바꾸는 SQL injection, 즉 SQL 삽입 공격으로 이어질 수 있습니다. 프레임워크의 매개변수 방식과 서버 입력 검증을 사용하고, 데이터베이스 비밀번호와 연결 문자열은 브라우저 코드나 공개 저장소에 넣지 않습니다.
오늘 바로 해볼 작은 실습
실제 데이터베이스에 접속하지 않고 메모장에 네 명령의 실행 계획만 작성합니다.
tasks표에 필요한 열 세 개와 각 타입을 적습니다.- 한 행을 넣는 INSERT 예시를 위 코드에서 복사해 값만 바꿉니다.
- id 하나를 찾는 SELECT와 WHERE 조건을 적습니다.
- 완료 여부만 바꾸는 UPDATE를 적고 바로 위에 확인용 SELECT를 둡니다.
- DELETE 문 위에 “백업과 대상 건수 확인 전 실행 금지”라고 씁니다.
- 각 명령 뒤 데이터 행 수나 값이 어떻게 달라질지 한 문장으로 예상합니다.
모르는 명령, 데이터베이스 주소, 비밀번호를 AI 채팅에 붙이지 마세요. 특히 DROP, TRUNCATE, 조건 없는 UPDATE와 DELETE는 표 전체를 바꾸거나 지울 수 있습니다. 연습 환경과 운영 환경을 구분할 수 없거나 복구 절차를 설명할 수 없다면 실행하지 않고 담당자에게 확인하는 것이 올바른 중단 기준입니다.
확인한 자료
- The SQL Language — PostgreSQL Global Development Group
- Data Types — PostgreSQL Global Development Group
함께 읽기
- 환경변수와 API 키를 서랍과 금고처럼 구분하는 법
환경변수는 주소나 실행 모드처럼 프로그램 밖에서 바꿀 설정을 담는 서랍이고, API 키는 외부 서비스 사용 권한을 가진 비밀번호에 가깝습니다. 비밀키는 브라우저 코드나 Git 저장소에 넣지 말고 서버의 비밀 저장소에서만 읽도록 해야 합니다.
- 쿠키와 세션과 브라우저 저장소를 보관함 위치로 구분하기
쿠키는 브라우저가 보관하며 조건에 맞는 서버 요청에 함께 보낼 수 있는 작은 값이고, 세션은 보통 서버가 로그인 상태를 보관하고 쿠키에는 연결용 식별자만 두는 방식입니다. localStorage는 같은 출처의 브라우저에 남지만 요청에 자동 첨부되지 않으므로 화면 설정에는 쓸 수 있어도 비밀키 저장소로 보면 안 됩니다.
- 기본키와 외래키로 두 데이터 표를 정확히 연결하는 법
기본키는 표 안에서 각 행을 중복 없이 가리키는 번호이고, 외래키는 다른 표의 기본키를 참조해 기록 사이의 관계를 만듭니다. 이름처럼 바뀌거나 겹치는 값 대신 키로 연결하면 고객과 주문을 정확히 찾을 수 있으며, 삭제 규칙은 데이터 손실 범위를 확인한 뒤 정해야 합니다.