learn

설계대로 구현됐는지 검증하는 법

설계대로 구현됐는지 검증하는 법

how-to-design-a-program-from-scratch|설계 프로세스를 거쳐 AI에게 구현을 맡겼을 때, 결과물이 설계와 일치하는지 어떻게 확인하는가. 코드가 "돌아가는 것"과 "구조가 맞는 것"은 다른 문제다.


검증의 두 축

  • 구조 검증: 설계대로 만들어졌는가 (아키텍처, 모듈 분리, 의존 방향)
  • 동작 검증: 의도대로 작동하는가 (기능 정상 동작)

동작 검증은 직접 써보면 된다. 위험한 것은 **"의도와 다르게 구현됐는데 돌아가는 경우"**다. 나중에 수정하려 하면 구조가 설계와 완전히 다른 걸 발견하게 된다.


구조 검증: 세 가지 체크포인트

1. 파일/폴더 구조가 설계와 일치하는가

Layered Architecture로 설계했다면, UI/Service/Model/Storage가 실제로 분리되어 있는지 확인한다:

✅ 확인할 것:
  - UI 코드와 비즈니스 로직이 다른 파일에 있는가?
  - DB 접근 코드가 한 곳에 모여있는가?
  - 도메인 모델(Course, Lecture)이 독립적으로 존재하는가?

❌ 위험 신호:
  - UI 컴포넌트 안에 SQL 쿼리가 있다
  - Service 파일이 UI 컴포넌트를 import한다
  - 같은 개념의 정의가 여러 파일에 흩어져 있다

2. 의존 방향이 설계와 일치하는가

아키텍처 검증의 핵심. Layered에서는 위에서 아래로만 의존해야 한다:

확인 방법: 각 파일의 import문을 보고 화살표를 그려본다. 화살표가 항상 같은 방향이면 OK. 역방향이나 건너뛰는 화살표가 있으면 설계 위반이다.

// ✅ 올바른 방향: UI → Service
import { scheduleService } from '../lib/scheduleService'

// ❌ 역방향: Service → UI
import { TimetableView } from '../components/TimetableView'

3. 도메인 모델이 설계한 개념과 일치하는가

타입 정의 파일을 열어서 설계한 관계가 그대로인지 확인한다:

// ✅ "Course가 여러 Lecture를 가진다"는 설계와 일치
interface Course {
  id: string
  name: string
  lectures: Lecture[]
}

// ❌ Course와 Lecture가 분리 안 됨 — "월수 수업" 표현 불가
interface Course {
  id: string
  name: string
  day: string        // Lecture 정보가 직접 들어감
  startTime: string
}

실전 검증 루틴 (30분 이내)

Step 1 — 폴더 구조 확인 (2분)
  파일 목록을 보고 설계한 층이 분리되어 있는지

Step 2 — 타입/모델 확인 (5분)
  도메인 모델 파일을 열어서 설계한 관계와 일치하는지

Step 3 — import 방향 확인 (10분)
  각 파일의 import를 보고 의존 화살표가 위→아래인지
  종이에 간단히 그려보면 좋다

Step 4 — 경계 케이스 실행 (10분)
  요구사항의 경계 질문을 실제로 테스트
  "시간이 맞닿는 수업 두 개는?" "같은 수업 두 번 등록하면?"

Step 1~3이 구조 검증, Step 4가 동작 검증이다.


AI에게 검증을 도와달라고 요청하기

직접 모든 import를 추적하기 어려우면:

"이 프로젝트의 모든 파일 간 의존 관계를 Mermaid로 그려줘. 각 파일이 어떤 파일을 import하는지 화살표로 보여줘."

돌려받은 실제 구조도를 내 설계 다이어그램과 나란히 놓고 비교한다. 두 그림이 같으면 검증 통과. 이 비교가 가능한 이유는 where-humans-must-verify-in-design|내가 설계를 직접 했기 때문이다. 설계 없이는 비교 대상이 없다.