본문 바로가기
AI창고

Claude Code로 데이터를 다루기 위한 SQL 기초 강의

by 그랬냥 2026. 5. 18.
반응형
 
 
 
 
 
 
 
 
 
 
 
 
— REFERENCE GUIDE · ISSUE №6
SQL · BEGINNER

바이브 코딩이 막혔다면,
SQL을 아주 조금 알면 됩니다.

Claude Code로 데이터를 다루기 위한 최소 SQL 강의 — 30분이면 바이브 코딩 한 단계 위로 올라갑니다

바이브 코딩 시리즈 · 06 · 봄내AI해적단

📌 IN THIS ISSUE

"클로드가 짜준 SQL을 그대로 실행해도 되나요?" "이 쿼리가 뭘 하는지 모르겠어요" — 이런 질문이 단톡방에 자주 올라왔어요. 데이터베이스를 직접 짤 필요는 없지만, 클로드의 쿼리를 읽고 검증할 수준은 필요합니다. 그 딱 그 수준을 가장 빠르게 익히는 글.

안녕하세요, 봄내AI해적단 선장 이장환입니다. 시리즈 여섯 번째 글이에요.

지난 글(№5)에서 카페 추천 앱을 만들 때 데이터를 JSON 파일에 더미로 넣었던 거 기억하시죠? 첫 버전엔 그게 맞아요. 그런데 사용자가 카페를 추가하거나 평점을 남기는 순간, "진짜 데이터베이스"가 필요해집니다. 그리고 그 순간 SQL이 등장하죠.

"저는 SQL 한 줄도 안 짤 거예요. 클로드가 다 해주잖아요?" — 맞습니다. 99%는 클로드가 짤 거예요. 그런데 그 1%, 클로드가 잘못 짠 쿼리를 못 알아채는 순간, 데이터가 다 날아갈 수 있습니다. 그래서 이 글은 "SQL 짜는 법"이 아니라 "클로드의 SQL을 읽고 검증하는 법"에 집중합니다.

학습 강도 안내: 이 글 한 편 = 약 30분 분량. 실습까지 포함하면 1시간. 다 읽고 나면 "클로드, 이 쿼리 위험한 거 아냐?" 정도는 질문할 수 있게 됩니다.

⊙ 가이드 구조

8개 챕터, 각 챕터마다 "클로드와 함께 쓰는 법" 박스가 별도로 있습니다. SQL 자체와 바이브 코딩 활용을 동시에 익힐 수 있어요.

01
CHAPTER ONE

바이브 코딩에서 SQL이 등장하는 순간.

 

"SQL 안 배워도 앱 만들 수 있다"는 말, 사실입니다. 하지만 어느 시점부터는 막힙니다. 그 순간을 미리 정리해보면:

📊
사용자가 데이터를 입력/저장하는 앱

로그인, 회원가입, 게시판, 일기, 할일... 거의 모든 실용적인 앱. 더미 JSON으로는 한계.

🔍
"이 조건의 데이터만 보여줘" 기능

필터, 정렬, 검색. 이게 다 SQL의 WHERE, ORDER BY입니다.

🐛
"왜 데이터가 사라졌지?" 디버깅

데이터 문제는 결국 SQL 문제. 클로드가 짠 쿼리를 본인이 읽을 수 있어야 디버깅이 됩니다.

"앱이 느려요" 성능 문제

90% 이상이 비효율적인 SQL이 원인. 인덱스, JOIN 순서, N+1 등.

💥
"실수로 모든 데이터를 지웠어요"

클로드의 DELETE 쿼리를 검증 없이 실행한 결과. 이걸 막으려면 SQL을 읽을 수 있어야 합니다.

💡 우리의 목표 · SQL을 처음부터 끝까지 짤 수 있는 사람이 되는 게 아닙니다. 클로드가 짠 쿼리를 보고 "아 이거 X를 하는 쿼리구나" 정도를 이해하고, "이거 위험한 쿼리네"를 감지할 수 있는 수준이 목표. 그 수준만 되어도 바이브 코딩 효율이 두 배가 됩니다.

02
CHAPTER TWO

5분 핵심 개념 — 테이블, 행, 열, 키.

 

데이터베이스는 엑셀의 친척입니다. 엑셀 다뤄보셨다면 이미 70%는 안 거예요.

테이블 = 엑셀 시트

실제로 카페 데이터를 어떻게 저장하는지 보여드릴게요.

📋 TABLE: cafes
id ★PK name address wifi rating
1 봄내커피 춘천시 중앙로 1 4.5
2 호반카페 춘천시 호반로 21 4.2
3 소양강책방 춘천시 소양로 33 4.8
4 강원도립카페 춘천시 동산로 5 3.9

네 가지 핵심 용어만 외우면 됩니다:

TABLE

📋 테이블

엑셀 시트와 같음. 위 예에서 cafes가 테이블 이름.

ROW

📏 행 (row)

한 줄 = 한 데이터. 위 표에서 각 카페가 한 행. 레코드(record)라고도 함.

COLUMN

📐 열 (column)

데이터 항목. name, address 같은 것. 필드(field)라고도 함.

PRIMARY KEY

🔑 기본 키 (PK)

각 행을 유일하게 구분해주는 열. 보통 id를 사용. 절대 중복 안 됨.

왜 기본 키가 중요한가

카페 이름이 똑같은 두 곳이 있을 수 있죠? "스타벅스" 같은 이름. 하지만 id가 1번인 스타벅스와 id가 7번인 스타벅스는 다른 가게입니다. id가 그래서 필요한 거예요. 이름이 같아도 id로 정확히 구분 가능.

외래 키 (Foreign Key) — 테이블 연결의 핵심

이제 한 카페에 여러 리뷰가 달린다고 해보죠. 리뷰 테이블을 따로 만듭니다:

📋 TABLE: reviews
id ★PK cafe_id ⇒FK user_name rating comment
1 1 장환 5 조용해서 작업하기 좋아요
2 1 현주 4 와이파이 빠름
3 2 민지 5 호반 뷰가 최고

cafe_id외래 키 (Foreign Key, FK)입니다. cafes 테이블의 id를 참조합니다. 리뷰 1, 2번은 cafe_id가 1이므로 "봄내커피"에 대한 리뷰, 3번은 cafe_id가 2이므로 "호반카페"에 대한 리뷰.

🤖 클로드와 함께 쓰는 법 · 새 기능 만들 때 클로드에게 이렇게 요청하세요: "이 기능을 위해 어떤 테이블이 필요한지, 각 테이블의 컬럼과 기본 키, 외래 키를 표로 정리해줘." — 코드 짜기 전에 데이터 구조부터 그리는 게 정석입니다.

03
CHAPTER THREE

실습 환경 셋업 — 5분 코스.

 

SQL은 읽기만 하면 안 늘어요. 직접 쿼리를 쳐봐야 합니다. 가장 빠르게 시작하는 두 가지 방법.

옵션 A · 추천

🌐 SQLite Online — 설치 없이 브라우저에서

설치 없이 SQL 연습할 수 있는 최고의 도구입니다. 회원가입도 필요 없어요.

  1. sqliteonline.com 접속
  2. 좌측의 "+ New Database" 클릭 (또는 기본 예시 DB 사용)
  3. 중앙 SQL 입력창에 쿼리 작성 → "Run" 클릭
  4. 결과가 아래에 표시됨
장점: 설치 0초, 어디서나 접근 가능
⚠️ 단점: 브라우저 새로고침하면 데이터 날아감 (연습용이라 OK)
옵션 B · 실전

☁️ Supabase — 진짜 프로젝트용

바이브 코딩 프로젝트에 실제로 데이터베이스를 붙일 거면 Supabase가 최고의 선택입니다. 무료 + PostgreSQL 기반 + 클로드 코드가 가장 잘 다룸.

  1. supabase.com 가입
  2. "New Project" → 프로젝트 이름, 비밀번호, 리전(Tokyo 추천) 설정
  3. 좌측 메뉴 "SQL Editor" 클릭
  4. 거기서 바로 쿼리 작성 가능
💡 이 글의 실습은 옵션 A로 충분합니다. 8장 실전 부분에서 옵션 B로 넘어갈 거예요.

첫 테이블 만들기 — 복붙해서 실행

위 옵션 A의 SQL 입력창에 아래 쿼리를 통째로 복사해 붙여넣고 Run 하세요. 우리 카페 테이블이 만들어집니다.

📝 첫 실습 SQL
-- 카페 테이블 만들기
CREATE TABLE cafes (
  id      INTEGER PRIMARY KEY,
  name    TEXT NOT NULL,
  address TEXT,
  wifi    BOOLEAN,
  rating  REAL
);

-- 데이터 4개 넣기
INSERT INTO cafes VALUES
  (1, '봄내커피', '춘천시 중앙로 1', 1, 4.5),
  (2, '호반카페', '춘천시 호반로 21', 1, 4.2),
  (3, '소양강책방', '춘천시 소양로 33', 0, 4.8),
  (4, '강원도립카페', '춘천시 동산로 5', 1, 3.9);

-- 잘 들어갔나 확인
SELECT * FROM cafes;

실행하면 위에서 보여드린 카페 테이블이 결과로 나옵니다. 이제 진짜 실습 시작입니다.

04
CHAPTER FOUR

CRUD — SQL의 4가지 기본 동작.

 

데이터에 할 수 있는 모든 행동은 4가지로 압축됩니다. 영어 첫 글자 따서 CRUD라고 부르고, 이게 SQL의 전부입니다.

C
CREATE
INSERT
데이터 추가
R
READ
SELECT
데이터 조회
U
UPDATE
UPDATE
데이터 수정
D
DELETE
DELETE
데이터 삭제

① CREATE (INSERT) — 데이터 추가

새 카페를 등록할 때:

INSERT INTO cafes (id, name, address, wifi, rating)
VALUES (5, '명동닭갈비카페', '춘천시 명동 12', 1, 4.0);

읽는 법: "cafes 테이블에 (id, name, ...) 컬럼으로 (5, '명동닭갈비카페', ...) 값을 넣어라".

② READ (SELECT) — 데이터 조회

가장 많이 쓰는 명령입니다.

-- 모든 카페 조회
SELECT * FROM cafes;

-- 이름과 평점만 조회
SELECT name, rating FROM cafes;

*"모든 컬럼"이라는 뜻이에요. SELECT는 다음 장에서 더 깊게 다룹니다.

③ UPDATE — 데이터 수정

봄내커피의 평점을 4.7로 올린다고 해보죠.

UPDATE cafes
SET rating = 4.7
WHERE id = 1;

🚨 가장 중요한 경고 · WHERE를 빠뜨리면 모든 행이 수정됩니다. 위 쿼리에서 WHERE id = 1 부분을 빼면 모든 카페의 평점이 4.7로 바뀝니다. 클로드의 UPDATE 쿼리를 받으면 WHERE 절이 있는지 무조건 확인하세요.

④ DELETE — 데이터 삭제

DELETE FROM cafes
WHERE id = 4;

💀 데이터 종말의 쿼리

DELETE FROM cafes; -- WHERE 없음 = 전체 삭제

이 한 줄로 cafes 테이블의 모든 데이터가 날아갑니다. 복구 안 됩니다. 클로드의 DELETE 쿼리는 실행 전에 WHERE 절을 반드시 확인하세요.

🤖 클로드와 함께 쓰는 법 — CRUD 검증 프롬프트

UPDATE나 DELETE 쿼리를 받았을 때 의심스러우면: "이 쿼리가 정확히 몇 개의 행에 영향을 주는지 알려줘. WHERE 절 없이 실행되면 어떻게 되는지도." — 클로드가 한 번 더 검토해주고, 실제로 위험한 쿼리는 경고합니다.

05
CHAPTER FIVE

SELECT 깊게 보기 — 90% 작업의 주인공.

 

실무에서 90% 이상이 SELECT 쿼리예요. 그래서 SELECT만 잘 이해해도 됩니다. 4가지 패턴만 익히세요.

패턴 ① WHERE — 조건으로 필터링

-- 와이파이 있는 카페만
SELECT * FROM cafes WHERE wifi = 1;

-- 평점 4.5 이상
SELECT name, rating FROM cafes WHERE rating >= 4.5;

-- 이름에 '카페'가 포함된 곳
SELECT * FROM cafes WHERE name LIKE '%카페%';

-- 와이파이 있고 평점 4.0 이상
SELECT * FROM cafes
WHERE wifi = 1 AND rating >= 4.0;
🔍 WHERE에서 자주 쓰는 연산자
= 같음
<> 또는 != 같지 않음
>, >=, <, <= 크기 비교
LIKE '%xx%' xx가 포함된 텍스트 (% = 임의의 글자)
AND, OR 조건 결합
IS NULL 값이 비어있음

패턴 ② ORDER BY + LIMIT — 정렬과 개수 제한

-- 평점 높은 순으로 정렬
SELECT * FROM cafes ORDER BY rating DESC;

-- 평점 낮은 순으로 정렬
SELECT * FROM cafes ORDER BY rating ASC;

-- TOP 3만 — 평점 높은 카페 3개
SELECT * FROM cafes
ORDER BY rating DESC
LIMIT 3;

DESC = 내림차순(큰→작은), ASC = 오름차순(작은→큰). 안 적으면 ASC가 기본.

패턴 ③ 집계 함수 — COUNT, AVG, SUM

"우리 카페 몇 개야?", "평균 평점은?" 같은 질문에 답합니다.

-- 전체 카페 개수
SELECT COUNT(*) FROM cafes;

-- 평균 평점
SELECT AVG(rating) FROM cafes;

-- 와이파이 있는 카페의 평균 평점
SELECT AVG(rating) FROM cafes WHERE wifi = 1;

-- 별칭(alias) 붙이기 — AS로 결과 컬럼 이름 지정
SELECT COUNT(*) AS total_cafes FROM cafes;

패턴 ④ GROUP BY — 그룹별 집계

"와이파이 있는 카페와 없는 카페 각각 몇 개야?" 같은 질문.

-- 와이파이 유무별 카페 수와 평균 평점
SELECT
  wifi,
  COUNT(*) AS count,
  AVG(rating) AS avg_rating
FROM cafes
GROUP BY wifi;

결과:

wifi count avg_rating
0 1 4.8
1 3 4.2

🤖 클로드 활용 팁 · SELECT 쿼리는 데이터를 절대 망가뜨리지 않습니다. 그래서 안심하고 클로드에게 막 시켜도 됩니다. "평점 4 이상인 카페 중 와이파이 있는 곳을 평점 높은 순으로 5개 보여줘" — 이렇게 자연어로 던지면 클로드가 SQL을 짜줍니다. 결과 보고 의도와 다르면 다시 요청.

06
CHAPTER SIX

JOIN — 두 테이블 연결하기.

 

2장에서 만든 cafesreviews 두 테이블을 합쳐서 보고 싶을 때 쓰는 게 JOIN입니다. "이 카페의 리뷰 모두 보여줘" 같은 요청에 답할 수 있어요.

먼저 reviews 테이블도 만들고 데이터 넣어봅시다. 위 SQL 입력창에 이어서:

CREATE TABLE reviews (
  id        INTEGER PRIMARY KEY,
  cafe_id   INTEGER,
  user_name TEXT,
  rating    INTEGER,
  comment   TEXT
);

INSERT INTO reviews VALUES
  (1, 1, '장환', 5, '조용해서 작업하기 좋아요'),
  (2, 1, '현주', 4, '와이파이 빠름'),
  (3, 2, '민지', 5, '호반 뷰가 최고');

INNER JOIN — 양쪽에 다 있는 데이터

"카페 이름과 함께 리뷰를 보여줘"라는 요청입니다.

SELECT
  cafes.name AS cafe_name,
  reviews.user_name,
  reviews.rating,
  reviews.comment
FROM cafes
INNER JOIN reviews ON cafes.id = reviews.cafe_id;

이 쿼리가 하는 일: cafes 테이블의 id와 reviews 테이블의 cafe_id가 같은 행끼리 연결해서, 카페 이름과 리뷰 정보를 함께 보여줍니다.

결과:

cafe_name user_name rating comment
봄내커피 장환 5 조용해서 작업하기 좋아요
봄내커피 현주 4 와이파이 빠름
호반카페 민지 5 호반 뷰가 최고

LEFT JOIN — 왼쪽 테이블 기준으로 전부

위 결과를 보면 리뷰가 없는 카페 (소양강책방, 강원도립카페)는 나타나지 않습니다. INNER JOIN은 양쪽에 다 있는 데이터만 보여주기 때문이에요.

"리뷰가 없어도 모든 카페를 다 보여줘"라면 LEFT JOIN:

SELECT
  cafes.name,
  COUNT(reviews.id) AS review_count
FROM cafes
LEFT JOIN reviews ON cafes.id = reviews.cafe_id
GROUP BY cafes.id;

결과: 모든 카페가 나오고, 리뷰가 없는 카페는 review_count가 0.

🤖 클로드와 JOIN을 다룰 때

JOIN은 헷갈리기 쉬워서 클로드에게 "이 JOIN 쿼리가 정확히 어떤 데이터를 반환하는지 한국어로 설명해줘. 빠진 데이터가 있을 가능성도."를 매번 물어보세요. 특히 LEFT vs INNER 선택은 결과에 큰 차이를 만듭니다.

07
CHAPTER SEVEN

바이브 코딩 황금 패턴 7가지.

 

이제 SQL 기본은 됐습니다. 실전에서 Claude Code와 SQL을 함께 다룰 때의 황금 패턴 7가지.

PATTERN 01

자연어로 쿼리 요청

"평점 4.5 이상이고 와이파이 있는 카페를 평점 높은 순으로 5개" → 클로드가 SQL로 변환. 본인은 영어 SQL 문법 외울 필요 없어요.

"카페 중에 와이파이 있고 평점 4.5 이상인 곳을 평점 높은 순으로 5개 가져오는 SQL 짜줘"
PATTERN 02

짠 쿼리를 다시 한국어로 설명 요청

받은 쿼리가 의도대로인지 검증. 이 한 번의 추가 질문이 데이터 사고의 90%를 막아줍니다.

"이 쿼리가 정확히 어떤 데이터를 반환하는지, 그리고 영향을 받는 행의 개수를 알려줘"
PATTERN 03 · 안전

UPDATE/DELETE는 SELECT로 먼저 확인

수정/삭제할 행을 같은 WHERE 조건의 SELECT로 먼저 보고 → 확인 후 UPDATE/DELETE 실행. 실수 방지 1순위.

-- 1단계: 영향받을 행 먼저 확인
SELECT * FROM cafes WHERE rating < 3.0;

-- 2단계: 확인 후 삭제
DELETE FROM cafes WHERE rating < 3.0;
PATTERN 04

트랜잭션 사용 — 안전 그물

여러 쿼리를 묶어서 "다 성공 or 다 실패"로. 중간에 실패하면 모두 원래대로 복구됩니다.

BEGIN TRANSACTION;

UPDATE cafes SET rating = 4.0 WHERE id = 1;
INSERT INTO reviews VALUES (...);

-- 결과 확인 후
COMMIT; -- 또는 ROLLBACK; 으로 취소
PATTERN 05

스키마(테이블 설계) 먼저 코드는 나중

새 기능 만들 때 "필요한 테이블과 컬럼을 표로 먼저". 코드 짜기 전에 데이터 구조 확정 → 시행착오 절반으로.

"댓글 기능을 위해 필요한 테이블, 컬럼, 관계를 표로 먼저 정리해줘. 코드는 아직 짜지 마."
PATTERN 06

"느려요" 문제는 SQL부터 의심

앱이 느리다면 90%가 SQL 문제예요. 클로드에게 "이 쿼리가 느릴 가능성이 있는지, 인덱스가 필요한지" 분석 요청.

"이 페이지 로딩이 느려요. SQL 쿼리를 보고 성능 문제 가능성 분석해줘. 인덱스 추가가 필요하면 SQL도 같이."
PATTERN 07 · 핵심

권한 신중히 — DB 쿼리는 한 번 더 확인

Claude Code가 DB 쿼리를 실행하려 할 때 "Allow?" 묻는 순간, SELECT면 OK, UPDATE/DELETE/DROP은 한 번 더 본다. 파일 작업과 달리 DB 복구는 git reset으로 안 됩니다.

08
CHAPTER EIGHT · 실전

실전 — 카페 앱에 DB 추가하기.

 

시리즈 №5에서 만든 카페 추천 앱은 JSON 더미 데이터였죠. 이제 진짜 DB(Supabase)로 마이그레이션하는 5단계를 보여드립니다. 이 흐름이 모든 바이브 코딩 프로젝트의 DB 추가 패턴입니다.

1
STAGE ONE

Supabase 프로젝트 만들기

3장의 옵션 B 그대로 진행. 프로젝트 만들고 URL과 anon key 메모해두세요. (Settings → API에 있음)

2
STAGE TWO

스키마 설계 — 클로드에게 표로 정리 요청

Claude Code에서:

"카페 추천 앱을 위한 Supabase 스키마를 설계해줘. 필요한 테이블, 각 컬럼의 타입, 기본 키와 외래 키 관계를 표로 먼저 정리해줘. cafes와 reviews 두 테이블이 필요해. 코드는 아직 짜지 마."
3
STAGE THREE

테이블 생성 SQL 받기

스키마 표가 마음에 들면 SQL 요청:

"위 스키마대로 Supabase용 CREATE TABLE SQL을 작성해줘. timestamps와 RLS(Row Level Security) 기본 설정도 포함."

받은 SQL을 Supabase 대시보드의 SQL Editor에 붙여넣고 Run. 테이블이 만들어졌는지 좌측 "Table Editor"에서 확인.

4
STAGE FOUR

데이터 마이그레이션

기존 JSON 데이터를 DB로 옮깁니다:

"src/data/cafes.json의 데이터를 Supabase의 cafes 테이블에 넣는 INSERT SQL을 만들어줘. 데이터 누락 없이."

받은 SQL을 SQL Editor에서 실행. 실행 전에 SELECT로 한 번 검증.

5
STAGE FIVE

앱 코드 연결

마지막으로 앱이 JSON 대신 Supabase에서 데이터를 가져오게:

"카페 목록 페이지에서 src/data/cafes.json 대신 Supabase의 cafes 테이블에서 가져오도록 수정해줘. @supabase/supabase-js 라이브러리 사용. .env.local에 NEXT_PUBLIC_SUPABASE_URL과 NEXT_PUBLIC_SUPABASE_ANON_KEY 추가."

✅ 다 끝나면 npm run dev로 실행 → 카페가 그대로 나오면 마이그레이션 성공.

💡 다음 단계 미리보기 · DB가 연결됐으면 진짜 동적 기능을 추가할 수 있어요 — 사용자가 새 카페를 등록하거나, 리뷰를 남기거나, 평점을 매기는 기능들. 이게 진짜 "앱"의 시작입니다. 다음 글에서 다룰 예정.

FINAL THOUGHTS

"SQL은 어렵지 않습니다. 다만 무서울 뿐."

SQL을 처음부터 끝까지 짤 줄 알 필요는 없어요. 클로드가 짠 쿼리를 읽고, 위험한 부분을 알아채고, 의도와 다르면 다시 요청할 수 있는 수준 — 이 글에서 다룬 만큼이면 충분합니다.

중요한 건 실수 방지의 7가지 패턴입니다. 특히 UPDATE/DELETE 전에 SELECT로 확인, 중요한 작업은 트랜잭션, DB 권한은 한 번 더 보기. 이 셋만 지켜도 데이터 사고는 안 납니다.

🏴‍☠️ 봄내AI해적단 멘티들에게

오늘 미션 — sqliteonline.com에서 3장의 카페 테이블 만들고, 5장의 SELECT 쿼리 5개 직접 쳐보기.

결과 스크린샷 단톡방에 올려주세요. 어떤 쿼리가 헷갈렸는지, 어떻게 풀었는지 같이 공유하면 다른 사람한테도 도움됩니다.

시리즈 №5에서 만든 본인 프로젝트가 있다면, 8장 따라서 Supabase 마이그레이션 도전. 막히는 부분 같이 풀어요.

— 바이브 코딩 시리즈 전체 인덱스

№1   Skills 만드는 법 — 반복 패턴 박제 학술 톤
№2   Claude Design — AI 슬롭 디자인 탈출 매거진
№3   Claude Code 입문 — 설치 + IDE/터미널 워크북
№4   Agent Teams — 멀티 에이전트 협업 랩 노트북
№5   계획부터 구현까지 — 6단계 워크플로우 메서드
№6   SQL 기초 강의 — 데이터 다루기 ← 현재 글 참고서

→ 다음 회차 예고

MCP (Model Context Protocol) 입문 · Claude Code를 본인의 Supabase, Notion, Slack, GitHub 등과 직접 연결. 8장에서 Supabase를 SQL Editor로 다뤘다면, MCP는 Claude Code가 직접 데이터베이스에 접근해서 쿼리를 실행하게 만드는 방법입니다.


Issue №6 · Reference Guide · SQL for Vibe Coding

이장환 · 봄내AI해적단 선장 · 춘천 · 2026

참고: SQLite Online · Supabase · SQL Tutorial

반응형