LumoMate
LumoMate/용어집/SedimentData

스키마

스키마(Schema)는 데이터가 따라야 하는 구조의 명세입니다. 어떤 필드가 있고, 그 필드는 어떤 타입이고, 무엇이 필수인지가 적혀 있습니다.
스키마의 개념을 표현한 편집형 일러스트.

쉬운 설명

데이터를 다루다 보면 같은 정보를 부르는 이름이 시스템마다 다르거나, 어떤 필드가 비어 있을 수도 아닐 수도 있는 상황이 흔합니다. 스키마는 '이 데이터는 이렇게 생겨야 한다'를 명문화해, 모두가 같은 모양으로 일하도록 만드는 약속입니다.

왜 필요한가는 단순합니다. 스키마가 없으면 같은 'user_id'가 어떤 시스템에선 숫자, 어떤 시스템에선 문자열, 어떤 시스템에선 비어 있을 수도 있고, 같은 'amount'가 원·달러·센트 단위로 섞이기도 합니다. 이런 불일치를 사람이 매번 코드로 막으려면 시간과 버그가 폭증합니다.

스키마는 여러 곳에 존재합니다. ① 데이터베이스 스키마(테이블·컬럼·관계), ② API 응답 스키마(JSON Schema·OpenAPI), ③ 메시지 스키마(Avro·Protobuf), ④ 폼 입력 스키마. 형태는 달라도 역할은 같습니다 — '예상 가능한 모양으로 들어오고 나가게 한다.'

장기적으로 가장 중요한 사실은 '스키마는 변한다'는 점입니다. 처음부터 완벽한 스키마는 없고, 시간이 지나며 필드가 늘고 줄고 바뀝니다. 그래서 스키마 진화(schema evolution) — 이전 버전과 호환되게 바꾸는 방법 — 가 실무의 큰 화두입니다. 새 필드 추가는 보통 안전하지만, 기존 필드 삭제·이름 변경은 다른 시스템을 깨뜨릴 수 있어 단계적으로 처리합니다.

스키마를 잘 다루는 도구·문화가 있습니다. Avro·Protobuf는 메시지에 버전이 들어가 자동 호환 검증을 합니다. dbt는 데이터 웨어하우스 안의 스키마를 코드로 관리합니다. GraphQL은 API 스키마가 곧 문서가 됩니다. 어떤 형태든 '스키마가 코드처럼 관리된다'가 핵심입니다.

스키마의 개념을 본문 안에서 다른 각도로 비춰 보는 편집형 일러스트.
FIG. 1스키마를 다른 각도에서 다시 봅니다.

비유로 보면

스키마는 종이 양식(폼)과 비슷합니다. '이름(필수), 생년월일(yyyy-mm-dd), 연락처' 같이 칸이 정해져 있어 누가 작성해도 같은 모양으로 들어옵니다. 양식이 없으면 사람마다 다른 방식으로 적고, 그걸 모아 합치는 일에 엄청난 시간이 들어갑니다.

어디에서 만나나

관계형 DB의 모든 테이블, REST·GraphQL·gRPC API의 입출력, 카프카 같은 이벤트 스트림의 메시지, 사용자 입력 폼, 머신러닝 학습 데이터의 컬럼. 데이터가 시스템 경계를 넘는 모든 자리에 어떤 형태로든 스키마가 필요합니다.

작은 예시

회원 가입 API의 요청 본문이 '이름(필수, 문자열), 이메일(필수, 이메일 형식), 생년월일(선택, ISO 날짜)'라고 정해져 있다면, 그게 그 API의 스키마입니다. 다른 팀이 그 API를 쓸 때 이 스키마만 보면 어떻게 호출해야 할지가 명확해집니다.

자주 하는 오해

오해
흔한 오해 셋. ① '스키마는 한 번 정하면 끝' — 변경은 늘 일어나며, 어떻게 변경하느냐가 더 어렵습니다. ② '스키마 없는 게 자유' — 코드 안에 사실상의 스키마가 존재하고, 명문화하지 않으면 그 코드가 곧 스키마가 됩니다. ③ '스키마 == DB 테이블' — API·메시지·문서 모두 스키마를 갖습니다.

한 줄 정리

좋은 스키마는 '오늘의 요구'뿐 아니라 '내년에 어떻게 바뀔지'까지 고려합니다. 후속 변경을 안전하게 만드는 일이 결국 가장 중요한 설계 결정입니다.
매주 월요일 오전 8시

한 주에 한 통,
오래 남는 이해를 보냅니다.

흘려보내지 않는 글만 골라 보내드립니다. 광고와 추적, 외부로 빠지는 미끼 링크 없이 메일 안에서 끝나는 한 통입니다.

언제든 한 번의 클릭으로 해지할 수 있습니다. 스팸은 보내지 않습니다.