React 14분 읽기

Todo 앱에 TDD 적용해보기(1)

간단한 Todo 앱을 만들면서 타입 기반 설계를 적용해보자.

간단한 Todo 앱을 만들면서 타입 기반 설계를 적용해보자.

앱을 만들기 전에 해야할 것은 바로 요구사항 정의다.


📄 요구사항 정의

요구사항(Requirement)이란,

소프트웨어나 시스템이 사용자의 기대를 만족시키기 위해 갖춰야 할 기능이나 제약조건을 의미한다.

즉,

“이 시스템은 무엇을 해야 하고, 어떤 조건을 따라야 하는가?” 에 대한 명확한 설명이라고 볼 수 있어요.

❓왜 요구사항을 정의해야 하는가?

요구사항을 명확히 정의하는 이유는 다음과 같다.

목적설명
🔍 문제 정의사용자가 진짜 원하는 바를 정확히 파악할 수 있음
🛠 설계 및 개발의 기준기능을 구현할 때 기준이 되어 방향을 제시함
📋 일정 및 예산 산정어떤 기능이 필요한지 알아야 작업량을 추정할 수 있음
✅ 검수 기준 제공개발 후 요구사항을 기준으로 테스트 및 검토 가능
⚖️ 오해 방지개발자와 사용자 간의 인식 차이를 줄여줌

📂 요구사항의 종류

요구사항은 보통 다음과 같이 나뉜다.

  1. 기능적 요구사항 (Functional Requirements) • 시스템이 무엇을 해야 하는지에 대한 요구 • 사용자가 직접 확인할 수 있는 기능 중심

    예시: • 사용자는 할 일을 추가할 수 있어야 한다. • 로그인 후 사용자 정보가 표시되어야 한다.

  2. 비기능적 요구사항 (Non-functional Requirements) • 시스템이 어떻게 동작해야 하는지에 대한 요구 • 성능, 보안, 유지보수성, 접근성, 반응 속도 등

    예시: • 앱은 2초 이내에 응답해야 한다. • 사용자 데이터는 암호화 저장해야 한다.

  3. 도메인 요구사항 (Domain Requirements) • 특정 비즈니스나 산업의 도메인에 특화된 요구 • 규제, 법적 기준, 업계 표준 등을 포함

    예시: • 금융 앱은 거래 내역을 5년 이상 보관해야 한다. • 의료 시스템은 HIPAA 기준을 따라야 한다.

이런 방식으로 요구사항을 정의해보자.


✅ 기능적 요구사항 (Functional Requirements)

기본 CRUD 기능

ID요구사항 설명
F-1사용자는 텍스트 입력창에 할 일을 입력하고 추가 버튼을 눌러 목록에 등록할 수 있어야 한다.
F-2오늘 날짜가 앱 상단에 표시되어야 한다.
F-3사용자는 각 할 일 항목을 체크박스를 눌러 완료 처리할 수 있어야 한다.
F-4할 일 항목의 텍스트를 클릭하면 수정 모드로 전환되며, 텍스트를 수정하고 edit 버튼으로 저장할 수 있어야 한다.
F-5완료된 항목은 체크 표시와 함께 스타일(예: 회색 또는 취소선 등)로 구분되어야 한다.

데이터 관리 기능

ID요구사항 설명
F-6하루가 지나면 기존의 모든 할 일 항목은 자동 삭제되어 목록이 초기화되어야 한다.

입력 검증 및 제한

ID요구사항 설명
F-7할 일 항목을 입력하지 않으면 추가 버튼은 비활성화되어야 한다.
F-8항목 추가 시 최대 50자 이하만 입력할 수 있다.
F-9할 일 항목의 텍스트가 너무 길 경우 UI에서는 …으로 생략 처리되어야 한다.
F-16빈 문자열이나 공백만 입력된 경우 추가되지 않아야 한다.

진행률 및 상태 표시

ID요구사항 설명
F-10전체 항목 중 완료된 항목의 비율을 Progress Bar로 시각화하여 보여준다.
F-15완료된 항목 개수와 전체 항목 개수를 “3/5 완료” 형태로 표시해야 한다.

사용성 개선 기능

ID요구사항 설명
F-11드래그 앤 드롭으로 할 일 항목의 순서를 변경할 수 있어야 한다.
F-12Enter 키를 눌러서도 할 일을 추가할 수 있어야 한다.
F-13할 일 추가 후 입력창이 자동으로 비워져야 한다.
F-14전체 완료/미완료 토글 기능이 있어야 한다.
F-17수정 모드에서 ESC 키로 수정을 취소할 수 있어야 한다.

⚙️ 비기능적 요구사항 (Non-functional Requirements)

플랫폼 및 접근성

ID요구사항 설명
NF-1UI는 모바일 환경에 최적화되어야 한다.
NF-7접근성(Accessibility)을 고려해 키보드 조작, 스크린 리더 호환 등을 지원할 수 있으면 좋다.
NF-11키보드만으로도 모든 기능을 사용할 수 있어야 한다.
NF-13다양한 화면 크기(스마트폰, 태블릿, 데스크톱)에 반응형으로 대응해야 한다.

시간 및 데이터 관리

ID요구사항 설명
NF-2앱은 하루 단위로 동작하며, 날짜가 바뀌면 자동으로 새로 고침된다.
NF-9브라우저를 새로고침해도 당일 데이터는 유지되어야 한다.
NF-10자정(00:00) 기준으로 정확한 날짜 전환이 이루어져야 한다.

사용자 경험

ID요구사항 설명
NF-3사용자 경험(UX)은 단순하고 직관적이어야 하며, 감정적 부담 없이 빠르게 메모하듯이 입력할 수 있어야 한다.
NF-5앱은 로그인이나 회원가입 없이도 사용할 수 있어야 한다.

기술적 요구사항

ID요구사항 설명
NF-4로컬 스토리지(LocalStorage) 또는 IndexedDB를 이용하여 클라이언트 단에서만 동작하는 앱으로 구성한다.
NF-8오프라인 환경에서도 정상 동작해야 한다.

성능 요구사항

ID요구사항 설명
NF-6앱은 빠른 로딩 속도를 보장해야 하며, 2초 이내에 초기 화면이 나타나야 한다.
NF-12터치 디바이스에서 스와이프 제스처 지원을 고려해야 한다.

🎨 UX/UI 개선 요구사항

ID요구사항 설명
UX-1항목 완료/미완료 시 부드러운 애니메이션 효과가 있어야 한다.
UX-2할 일이 없을 때 격려 메시지빈 상태 일러스트를 표시해야 한다.
UX-3하루 전환 시 축하 메시지요약 정보를 보여줄 수 있다.
UX-4햅틱 피드백(모바일에서 진동)을 지원할 수 있다.

💾 데이터 관리 요구사항

ID요구사항 설명
DM-1앱 실행 시 이전 날짜 데이터 자동 정리 로직이 동작해야 한다.
DM-2브라우저 저장소 용량 초과 시 대응 방안이 있어야 한다.
DM-3데이터 백업/복원 기능(JSON 파일 내보내기/가져오기)을 고려할 수 있다.

🔒 성능 및 보안 요구사항

ID요구사항 설명
P-1100개 이상의 항목에서도 부드러운 스크롤과 반응성을 유지해야 한다.
P-2XSS 공격 방지를 위해 사용자 입력 텍스트를 적절히 이스케이프 처리해야 한다.

💡 선택적 기능 (Optional Features)

  • ✅ 완료된 항목 숨기기/보이기 토글
  • 🗑️ 개별 항목 삭제 기능
  • 📝 오늘 남긴 할 일을 일기 형식으로 저장하거나 나중에 조회하는 기능
  • 🌙 다크 모드 지원

🎯 우선순위 분류

🔴 높음 (필수 구현)

  • F-1~F-10, F-12, F-13, F-16
  • NF-1~NF-6, NF-9, NF-10
  • DM-1, P-2

🟡 중간 (권장 구현)

  • F-11, F-14, F-15, F-17
  • NF-11, NF-13, UX-1, UX-2

🟢 낮음 (선택적 구현)

  • UX-3, UX-4, DM-2, DM-3, P-1
  • 선택적 기능들

이 요구사항을 이제 UI/UX와 도메인 지식에 대한 요구사항으로 구분해보자.

📝 Todo 앱 요구사항 분류

🎨 UI/UX 관련 요구사항

화면 표시 및 시각적 요소

ID요구사항 설명
F-2오늘 날짜가 앱 상단에 표시되어야 한다.
F-5완료된 항목은 체크 표시와 함께 스타일(예: 회색 또는 취소선 등)로 구분되어야 한다.
F-9할 일 항목의 텍스트가 너무 길 경우 UI에서는 …으로 생략 처리되어야 한다.
F-10전체 항목 중 완료된 항목의 비율을 Progress Bar로 시각화하여 보여준다.
F-15완료된 항목 개수와 전체 항목 개수를 “3/5 완료” 형태로 표시해야 한다.

입력 인터페이스

ID요구사항 설명
F-1사용자는 텍스트 입력창에 할 일을 입력하고 추가 버튼을 눌러 목록에 등록할 수 있어야 한다.
F-7할 일 항목을 입력하지 않으면 추가 버튼은 비활성화되어야 한다.
F-12Enter 키를 눌러서도 할 일을 추가할 수 있어야 한다.
F-13할 일 추가 후 입력창이 자동으로 비워져야 한다.

상호작용 및 조작

ID요구사항 설명
F-3사용자는 각 할 일 항목을 체크박스를 눌러 완료 처리할 수 있어야 한다.
F-4할 일 항목의 텍스트를 클릭하면 수정 모드로 전환되며, 텍스트를 수정하고 edit 버튼으로 저장할 수 있어야 한다.
F-11드래그 앤 드롭으로 할 일 항목의 순서를 변경할 수 있어야 한다.
F-14전체 완료/미완료 토글 기능이 있어야 한다.
F-17수정 모드에서 ESC 키로 수정을 취소할 수 있어야 한다.

플랫폼 및 반응형 -> 제외

ID요구사항 설명
NF-1UI는 모바일 환경에 최적화되어야 한다.
NF-13다양한 화면 크기(스마트폰, 태블릿, 데스크톱)에 반응형으로 대응해야 한다.
NF-12터치 디바이스에서 스와이프 제스처 지원을 고려해야 한다.

접근성 및 키보드 조작 -> 제외

ID요구사항 설명
NF-7접근성(Accessibility)을 고려해 키보드 조작, 스크린 리더 호환 등을 지원할 수 있으면 좋다.
NF-11키보드만으로도 모든 기능을 사용할 수 있어야 한다.

사용자 경험 및 애니메이션

ID요구사항 설명
NF-3사용자 경험(UX)은 단순하고 직관적이어야 하며, 감정적 부담 없이 빠르게 메모하듯이 입력할 수 있어야 한다.
UX-1항목 완료/미완료 시 부드러운 애니메이션 효과가 있어야 한다.
UX-2할 일이 없을 때 격려 메시지빈 상태 일러스트를 표시해야 한다.
UX-3하루 전환 시 축하 메시지요약 정보를 보여줄 수 있다.
UX-4햅틱 피드백(모바일에서 진동)을 지원할 수 있다.

성능 및 기술적 제약

ID요구사항 설명
NF-6앱은 빠른 로딩 속도를 보장해야 하며, 2초 이내에 초기 화면이 나타나야 한다.
NF-8오프라인 환경에서도 정상 동작해야 한다.
P-1100개 이상의 항목에서도 부드러운 스크롤과 반응성을 유지해야 한다.

🏗️ 도메인/비즈니스 로직 관련 요구사항

데이터 검증 및 제약사항

ID요구사항 설명
F-8항목 추가 시 최대 50자 이하만 입력할 수 있다.
F-16빈 문자열이나 공백만 입력된 경우 추가되지 않아야 한다.

시간 기반 비즈니스 로직

ID요구사항 설명
F-6하루가 지나면 기존의 모든 할 일 항목은 자동 삭제되어 목록이 초기화되어야 한다.
NF-2앱은 하루 단위로 동작하며, 날짜가 바뀌면 자동으로 새로 고침된다.
NF-10자정(00:00) 기준으로 정확한 날짜 전환이 이루어져야 한다.

데이터 저장 및 관리

ID요구사항 설명
NF-4로컬 스토리지(LocalStorage) 또는 IndexedDB를 이용하여 클라이언트 단에서만 동작하는 앱으로 구성한다. -> 기술적 내용이 있어서 제외. 바로 아래 요구사항으로 설명이 가능.
NF-9브라우저를 새로고침해도 당일 데이터는 유지되어야 한다.
DM-1앱 실행 시 이전 날짜 데이터 자동 정리 로직이 동작해야 한다. -> 기능 확장 고려하면 이전 데이터를 남겨두는 것도 좋음.
DM-2브라우저 저장소 용량 초과 시 대응 방안이 있어야 한다.
DM-3데이터 백업/복원 기능(JSON 파일 내보내기/가져오기)을 고려할 수 있다.

보안 및 데이터 보호

ID요구사항 설명
P-2XSS 공격 방지를 위해 사용자 입력 텍스트를 적절히 이스케이프 처리해야 한다.
NF-5앱은 로그인이나 회원가입 없이도 사용할 수 있어야 한다.

위 요구사항을 기반으로 간단하게 디자인을 만들어보자.

다음 포스팅부터는 위 내용을 기반으로 vite, typescript, react를 통해 간단한 앱을 만들어 볼 것이다.