learn

데이터가 먼저 정해져 있을 때의 설계

데이터가 먼저 정해져 있을 때의 설계

크롤링, 외부 API, 레거시 DB, 공공 데이터처럼 데이터 형태가 이미 결정되어 있는 경우 how-to-design-a-program-from-scratch|설계 프로세스가 어떻게 달라지는가.


순서가 뒤집히는 게 아니라 시작점이 달라진다

⓪ 단계가 추가된다. 외부에서 뭘 받을 수 있는지 파악하고, 그 제약 안에서 요구사항을 정한다.


핵심: 외부 데이터 ≠ 내 도메인 모델

학교 수강신청 페이지 크롤링 예시. 사이트에서 받는 원본:

{
  "subject_no": "CSE3081",
  "subject_nm": "알고리즘",
  "time_room": "월3,4(공7-301)/수3,4(공7-301)"
}

time_room에 요일, 시간, 강의실이 문자열 하나에 뭉쳐있다. 이걸 그대로 내 DB에 넣으면 안 된다. 충돌 검사할 때마다 파싱해야 하니까.

변환 계층을 두고, 내 도메인 모델에 맞게 변환해서 저장한다:

외부: time_room: "월3,4(공7-301)"
         ↓ 변환
내부: day: "mon", start_time: "10:00", end_time: "11:30", room: "공7-301"

외부 API도 같은 구조다. designing-local-app-with-server-dependency|LLM 인터페이스도 동일한 패턴 — 외부 형태를 내 형태로 변환하는 계층이 있고, 핵심 로직은 항상 내 형태만 다룬다.


요구사항에 미치는 영향

외부 데이터가 먼저이면 "할 수 있는 것의 범위"가 제한된다:

일반적: "시간표에 원하는 정보를 다 넣겠다"
제약 있을 때: "사이트에서 교수 연구실 번호를 안 준다"
            → v1에서 포기하거나 다른 소스 필요

how-to-scope-requirements|요구사항 종이에 "데이터 제약" 칸을 추가하면 된다.


가장 중요한 원칙

외부 데이터의 형태에 내 도메인 모델을 맞추지 않는다. 외부가 주는 형태가 아무리 이상해도, 내 앱 안에서는 내가 설계한 구조를 유지하고, 둘 사이에 변환 계층을 둔다. 이게 깨지면 외부가 바뀔 때마다 내 앱 전체가 흔들린다.