이 문서는 서버리스 아키텍처를 기반으로 한 TODO 웹 애플리케이션의 설계 내용을 담고 있습니다.
- 기술 스택
- React.js
- TypeScript
- Material-UI (디자인 시스템)
- GitHub Pages (호스팅)
- Vite (빌드 도구)
- TanStack Query (상태 관리)
- React + TypeScript
- Vite (빌드 도구)
- Material-UI (UI 컴포넌트)
- TanStack Query (상태 관리)
frontend/
├── src/
│ ├── components/ # 재사용 가능한 컴포넌트
│ ├── pages/ # 페이지 컴포넌트
│ ├── services/ # API 서비스 (목업 포함)
│ ├── hooks/ # 커스텀 훅
│ └── types/ # TypeScript 타입 정의
TodoPage
: 메인 페이지 컴포넌트AddTodoForm
: TODO 항목 추가 폼TodoList
: TODO 목록 컨테이너TodoItem
: 개별 TODO 항목
useTodos
훅에서 React Query를 사용하여 TODO 데이터 관리- 목업 서비스 (
mockTodoService
)에서 API 호출 시뮬레이션 - 컴포넌트에서 훅을 통해 데이터 접근 및 수정
interface TodoService {
getTodos(): Promise<Todo[]>;
getTodo(id: string): Promise<Todo>;
createTodo(input: CreateTodoInput): Promise<Todo>;
updateTodo(input: UpdateTodoInput): Promise<Todo>;
deleteTodo(id: string): Promise<void>;
}
- 기술 스택
- AWS CDK (TypeScript)
- AWS Lambda
- Amazon DynamoDB
- Amazon API Gateway
- Amazon Cognito (인증)
- 회원가입
- 로그인/로그아웃
- 비밀번호 재설정
- TODO 항목 생성
- TODO 항목 조회 (전체 목록)
- TODO 항목 수정
- TODO 항목 삭제
- TODO 항목 완료 상태 토글
Table: TodoItems
- id: string (파티션 키)
- userId: string (정렬 키)
- title: string
- description: string (선택사항)
- completed: boolean
- createdAt: number (Unix timestamp)
- updatedAt: number (Unix timestamp)
- email (필수)
- name
- phone_number (선택)
POST /auth/signup
- 회원가입POST /auth/login
- 로그인POST /auth/logout
- 로그아웃POST /auth/forgot-password
- 비밀번호 재설정 요청POST /auth/reset-password
- 비밀번호 재설정
GET /todos
- 모든 TODO 항목 조회POST /todos
- 새로운 TODO 항목 생성PUT /todos/{id}
- 특정 TODO 항목 수정DELETE /todos/{id}
- 특정 TODO 항목 삭제
- Cognito User Pool을 통한 사용자 인증
- 이메일 기반 회원가입
- 이메일 인증 필수
- 비밀번호 정책 적용 (최소 8자, 특수문자, 대소문자, 숫자 포함)
- JWT 토큰 기반 인증
- Access Token, Refresh Token 활용
- API Gateway에서 Cognito Authorizer 통합
- CORS 설정
- API 요청 제한 (Rate Limiting)
- 토큰 관리
- Access Token은 메모리에 저장
- Refresh Token은 HttpOnly 쿠키로 관리
- XSS 방지
- CSRF 방지
- Lambda 함수들
- createTodo
- getTodos
- updateTodo
- deleteTodo
- DynamoDB 테이블
- API Gateway (REST API)
- Cognito User Pool
- GitHub Actions를 통한 자동 배포
- 프론트엔드: GitHub Pages 배포
- 백엔드: AWS CDK 배포
- CloudWatch Logs를 통한 Lambda 함수 로깅
- CloudWatch Metrics를 통한 API 모니터링
- TODO 항목 카테고리화
- 마감일 설정
- 우선순위 지정
- 공유 기능
- GitHub Actions를 사용한 자동 배포
- GitHub Pages를 통한 정적 웹 호스팅
- 프론트엔드 코드 변경 시 자동 빌드 및 배포
- 환경 변수를 통한 API 엔드포인트 관리
- frontend 디렉토리 변경 감지
- Node.js 환경 설정
- 의존성 설치
- 프로덕션 빌드
- GitHub Pages 배포
- K-ISMS AWS 매핑 문서에 따른 보안 통제 구현
- AWS Config 규칙을 활용한 지속적인 규정 준수 모니터링
- AWS Control Tower를 통한 중앙 집중식 보안 관리
- 조직 단위(OU) 설계 및 구성
- 가드레일 설정
- 계정 프로비저닝 자동화
- 규정 준수 대시보드 구축
- AWS Security Hub 통합
- 규정 준수 보고서 자동화
- 보안 이벤트 알림 구성
- 정기적인 보안 평가 프로세스
AWS CDK에서 테라폼으로 마이그레이션하여 인프라를 코드로 관리하는 IaC(Infrastructure as Code) 접근 방식을 구현했습니다. 테라폼은 멀티 클라우드 환경을 지원하고 선언적 구성을 통해 인프라를 관리할 수 있는 도구입니다.
-
DynamoDB 테이블: TODO 항목을 저장하는 NoSQL 데이터베이스
- 파티션 키:
id
(문자열) - 읽기/쓰기 용량: 온디맨드 모드
- 자동 확장 설정
- 파티션 키:
-
Lambda 함수: API 요청을 처리하는 서버리스 함수
- 런타임: Node.js 18.x
- 메모리: 512MB
- 타임아웃: 10초
- 환경 변수: 테이블 이름, 로그 레벨 등
-
API Gateway: REST API 엔드포인트 제공
- 엔드포인트: GET, POST, PUT, DELETE
- CORS 설정
- API 키 관리
-
IAM 역할 및 정책: 최소 권한 원칙 적용
- Lambda 실행 역할
- DynamoDB 접근 정책
terraform/
├── main.tf # 주요 리소스 정의
├── variables.tf # 변수 정의
├── outputs.tf # 출력 변수
├── package_lambda.sh # Lambda 패키징 스크립트
└── README.md # 문서
- Lambda 함수 코드 패키징
- 테라폼 초기화 (
terraform init
) - 배포 계획 검토 (
terraform plan
) - 인프라 배포 (
terraform apply
) - 출력 값 확인 (API Gateway URL 등)
- IAM 역할에 최소 권한 적용
- API Gateway에 적절한 인증 및 권한 부여 설정
- 민감한 정보는 AWS Secrets Manager 또는 Parameter Store 사용
- 모든 데이터 전송 및 저장 시 암호화 적용
- 모듈화된 테라폼 코드로 재사용성 향상
- 환경별 변수 파일 분리 (dev, staging, prod)
- 상태 파일 원격 저장 (S3 + DynamoDB)
- 버전 관리 및 변경 이력 추적
- 테라폼 모듈화 개선
- 멀티 리전 배포 지원
- 재해 복구 전략 구현
- CI/CD 파이프라인 통합