해당 포스트는 이규원님의 "Spring Boot TDD" 강의를 기반으로 작성하였습니다.
Spring Boot TDD - 입문부터 실전까지 정확하게| 이규원 - 인프런 강의
현재 평점 5점 수강생 364명인 강의를 만나보세요. 더 빠르고 더 견고하게 Spring Boot 응용프로그램을 개발하세요. 정확한 이론 설명과 실무 수준의 연결된 실습을 통해 HTTP API 응용프로그램 개발에
www.inflearn.com
1. 프로그래머의 설계
○ 프로그래머는 소프트웨어 개발 과정에서 지속적으로 설계를 합니다.
○ 특히 인터페이스 설계와 구현 설계는 업무의 큰 부분을 차지하며, 소프트웨어의 품질과 유지보수성에 핵심적입니다.
이 글에서는 시스템의 기본 개념부터 시작해 인터페이스와 구현 설계의 특징, 리팩터링의 정의와 역할, 그리고 리디자인과의 비교를 단계적으로 설명하겠습니다. 이를 통해 프로그래머가 실무에서 어떻게 적용할 수 있는지 이해하기 쉽게 풀어보겠습니다.
2. 시스템의 정의: 상호작용하는 단위
○ 시스템은 특정 목적을 달성하기 위해 내부 구성요소들이 함께 상호작용하는 단위입니다.
○ 간단히 말해, "함께 작동하는 부분들의 모임"으로, 외부와 구분되는 경계를 가집니다.
- 경계와 인터페이스: 시스템은 경계를 통해 외부와 소통합니다. 이 경계에 배치된 인터페이스가 외부와의 연결점 역할을 합니다. 예를 들어, 응용 프로그램의 API나 클래스의 public 메서드가 이에 해당합니다.
- 하위 시스템 구성: 하나의 시스템은 여러 하위 시스템으로 나뉩니다. 큰 단위로는 모듈이나 애플리케이션, 작은 단위로는 클래스나 함수가 됩니다. 이들은 모두 목적을 위해 협력합니다.
3. 클라이언트의 정의: 기능을 사용하는 주체
○ 시스템이 제공하는 기능을 사용하는 주체입니다.
○ 인터페이스를 통해 시스템에 접근합니다.
○ 시스템을 이용하며 대가를 지불하는 고객이나 조직 내부의 동료 등 사용자가 있습니다.
○ 외부 응용프로그램이나 한 클래스를 사용하는 다른 클래스 등이 있습니다.

○ 클라이언트의 유형
- 인간 클라이언트: 사용자(고객이나 내부 동료)로, UI(유저 인터페이스)를 통해 상호작용.
- 시스템 클라이언트: 다른 프로그램이나 클래스(예: 한 클래스를 호출하는 다른 클래스.
4. 인터페이스 설계의 특징: 클라이언트 중심 소통
○ 인터페이스는 시스템과 클라이언트 간의 "소통 약속"입니다.
○ 클라이언트가 시스템을 사용하는 창구로, 설계 시 클라이언트의 요구를 최우선으로 반영합니다.
○ 인터페이스의 유형:
- 인간 대상: UI(유저 인터페이스)로, 사용자 경험을 고려한 디자인(예: 버튼, 메뉴).
- 기계 대상: API(애플리케이션 프로그래밍 인터페이스)로, 클래스 public 메서드나 웹 서비스 엔드포인트.

○ 클라이언트 중심 설계:
- 인터페이스는 클라이언트의 요구사항(기능, 편의성)을 반영합니다. 자연스러운 결과로, 클라이언트의 필요가 설계를 주도합니다.
○ 변경의 여파: 인터페이스 변경 시 클라이언트에 직접 영향(예: UI 변경 시 사용자 혼란, API 변경 시 호출 코드 수정).
○ 제약 요인: 클라이언트의 의사결정권이 강하거나 변경 수용 의사가 없을 때, 인터페이스 수정이 불가능할 수 있음. 이 경우 대안을 모색해야 합니다.
○ 왜 중요한가?: 인터페이스는 시스템의 "얼굴"입니다. 클라이언트 만족을 위해 안정적이고 직관적으로 설계하면, 시스템 전체 신뢰성이 높아집니다.
5. 구현 설계의 특징: 내부 기능 충족과 유연성

○ 구현 설계는 인터페이스를 통해 제공되는 기능을 실현하는 내부 구조입니다.
○ 클라이언트에게 보이지 않지만, 시스템의 핵심 동작을 담당합니다.
○ 구현 설계는 인터페이스를 통해 제공되는 기능 요구사항을 충족시킵니다.
○ 구현 설계는 비기능 요구사항도 충족시키며 제작공정의 품질에 영향을 줍니다.
○ 변경 여파가 미치는 범위가 시스템 내부로 한정됩니다.
○ 대안의 폭이 넓고 변경이 잦습니다.
4. 리팩터링의 정의: 내부 개선을 위한 작업
○ 리팩터링은 기능과 인터페이스를 유지하면서 구현 설계를 변경하는 활동입니다. 프로그래머가 자주 언급하지만, 과도한 강조는 설계 문제 신호일 수 있습니다.
○ 요구사항 변경 없이 제작 공정 품질(코드 품질, 성능)을 높이기 위한 작업. 기능과 인터페이스는 그대로 둡니다.
- 영향 범위: 클라이언트에 영향 없음(인터페이스 변하지 않음).
- 진행 방식: 일상적 코딩 일부로 수시 수행. 별도 자원 할당이나 계획 불필요.
- 왜 중요한가?: 코드 품질 향상으로 버그 감소, 유지보수 용이. 하지만 리팩터링 과도 시 설계 자체 재검토 필요.
5. 리디자인과의 비교: 변경 범위와 영향
○ 리디자인(재설계)은 리팩터링과 달리 인터페이스나 기능까지 변경하는 광범위한 작업입니다.
- 리팩터링: 내부 구현만 변경, 클라이언트 영향 없음. 자원 소비 적음, 수시 진행.
- 리디자인: 인터페이스 변경 포함, 클라이언트에 여파(코드 수정 필요). 자원 소비 크며, 계획적 할당 필요.
- 왜 구분하나?: 리디자인은 시스템 전체 영향으로 신중히 접근. 리팩터링은 일상적 개선 도구.
- 왜 중요한가?: 변경 범위에 따라 접근법 달리하면 자원 낭비 피함. 리디자인은 전략적, 리팩터링은 전술적.
'Java > Test Driven Development' 카테고리의 다른 글
| 2-4. TDD에 대한 오해 (2) | 2025.07.22 |
|---|---|
| 2-3. TDD 절차 (0) | 2025.07.22 |
| 2-2. 테스트와 설계 (0) | 2025.07.22 |
| 1-1. 엔지니어링과 원칙 (1) | 2025.07.22 |
| Practical Testing: 실용적인 테스트 가이드 (0) | 2024.06.28 |