데이터베이스 중심 설계 vs 인터페이스 중심 설계: TDD와의 비교
프로그래머로서 우리는 시스템 설계를 다양한 방식으로 접근합니다. 이번 내용은 데이터베이스에서 시작하는 설계(Database-First Design)와 인터페이스에서 시작하는 설계(Interface-First Design)의 특징을 비교하고, TDD(Test-Driven Development)가 어떻게 인터페이스 중심을 강화하는지 설명합니다.
TDD는 요구사항을 테스트로 구체화하며, 데이터베이스를 기능 구현 도구로 활용해 유연성을 강조합니다. 이를 통해 두 설계 방식의 차이를 이해하고, 실습에서 임의 테스트 데이터 생성 기법을 통해 TDD의 실용성을 살펴보겠습니다.
1. 데이터베이스에서 시작하는 설계 (Database-First Design)
○ 이 접근은 요구사항을 데이터베이스 테이블 스키마에 먼저 투영하며, 시스템 설계를 데이터 중심으로 진행합니다. 데이터 무결성을 우선하지만, 유연성이 제한적입니다.
- 장점: 데이터베이스 제약으로 무결성·일관성 유지 쉬움. 데이터 중심으로 안정적.
- 단점: 변경 비용 큼(스키마 수정 시 전체 영향). 비즈니스 지식 표현력 낮음(동사 중심 요구사항을 명사 중심 스키마로 제한). 작업 부하 분산 어려움(CRUD 중심으로 기술 선택 제한). 애플리케이션 역할이 데이터 연결 수단으로 축소.
- 적합 상황: 기능·비기능 요구사항 난이도 낮고 변경 적을 때. 대표적으로 데이터베이스 중심 아키텍처.

○ 과정:
(1) 요구사항 분석 후 테이블 스키마 설계(예: 관계, 제약 조건 정의).
(2) 스키마를 기반으로 인터페이스 입출력 설계(주로 CRUD 연산 중심).
(3) 구현 코드는 인터페이스를 데이터베이스에 위임(직접 매핑).
○ 한계: 스키마가 기반이 되어 시스템 유연성 감소. 환경 변화(요구사항 수정)에 적응 어려움.
2. 인터페이스에서 시작하는 설계 (Interface-First Design)
이 접근은 요구사항을 인터페이스 설계에 먼저 반영하며, 클라이언트 가치 중심으로 진행합니다. 데이터베이스는 필요 시 도입되어 유연성이 높습니다.

- 과정:
- 요구사항 분석 후 인터페이스 설계(클라이언트 요구 중심).
- 인터페이스와 정책 기반 기능 구현.
- 구현 중 데이터 영속 필요 시 테이블 스키마 변경(필요 없을 시 생략).
- 특징:
- 장점: 클라이언트 가치(비즈니스 지식)를 동사·명사로 풍부하게 표현. 인터페이스가 데이터베이스에 의존하지 않아 기술 선택 자유로움. 시스템 적응력 높음.
- 단점: 초기 인터페이스 설계가 복잡할 수 있음.
- 적합 상황: 요구사항 변경 잦고, 클라이언트 중심 설계 필요 시.
- 강점: 데이터베이스가 도구로 활용되어 변경 유연성 확보.
3. TDD 절차와 비교: 인터페이스 중심의 강화된 형태
TDD는 요구사항을 테스트 시나리오로 구체화하며, 인터페이스에서 시작하는 설계를 테스트 주도로 강화합니다. 데이터베이스는 기능 구현 도구로 필요할 때만 도입되어 데이터베이스 중심 설계의 한계를 보완합니다.

- TDD 과정:
- 요구사항 분석 후 필요한 인터페이스 설계.
- 테스트 시나리오 목록 작성.
- 하나의 시나리오를 테스트 코드로 변환.
- 테스트 통과 위한 기능 구현(데이터베이스 필요 시 스키마 변경).
- 목록 완료 확인, 반복.
- TDD 특징:
- 인터페이스 중심: 요구사항을 클라이언트 가치로 우선, 데이터베이스 의존 최소.
- 데이터베이스 역할: 상태 관리 도구로 필요 시 사용(테스트 시나리오 구현 과정에서 도입).
- 비교 우위: 데이터베이스 중심(무결성 강하지만 유연성 낮음) vs TDD(가치 중심, 변화 적응 쉬움). TDD는 인터페이스 설계와 유사하지만, 테스트로 요구사항 누락 방지·확신 쌓음.
- 왜 데이터베이스 늦게 도입?: TDD는 요구사항 충족이 우선. 데이터베이스 필요 없을 시 고려 안 함. 불안 시 테스트 시나리오 검토로 보완.
- 장점: 시스템 상태(데이터베이스) 도입 시 자연스러움. 극단적 경우, 데이터베이스 불필요 시 생략 가능.
4. 실습: 임의 테스트 데이터 생성 (Random Test Data)
TDD에서 시스템 상태(데이터베이스) 도입 시, 테스트 독립성을 위해 임의 데이터를 생성합니다. 고정 데이터 사용 시 정책 위배(예: 중복 오류)나 거짓 양성 발생 방지.
- 목적: 각 테스트가 독립적·안정적으로 실행. 시스템 정책(예: 유일성) 준수.
- 과정:
- 생성기 작성: UUID 등으로 매번 다른 데이터(예: 이메일, 사용자 이름) 생성.
- 테스트 코드 교체: 고정 값 대신 생성기 사용(Arrange 단계에서 사전 조건 연출).
- 엔터티 수정: 제약 추가(예: 유일성), 예외 처리(예: 중복 시 400 Bad Request).
- 테스트 실행: 모든 테스트 통과 확인.
- 특징:
- Arrange 단계 강화: 입력 데이터뿐만 아니라 시스템 사전 조건(예: 중복 상황) 준비.
- 롤백 대체: 임의 데이터로 롤백 불필요, 테스트 성능·안정성 향상.
- 효과: 거짓 양성 해결, TDD 안정성 강화. 데이터베이스 도입 후에도 테스트 독립성 유지.
'Java > Test Driven Development' 카테고리의 다른 글
| 2-4. TDD에 대한 오해 (2) | 2025.07.22 |
|---|---|
| 2-3. TDD 절차 (0) | 2025.07.22 |
| 2-2. 테스트와 설계 (0) | 2025.07.22 |
| 2-1. 인터페이스 설계와 구현 설계 (1) | 2025.07.22 |
| 1-1. 엔지니어링과 원칙 (1) | 2025.07.22 |