-
[81일차] Final Project 프로젝트 정리교육/코드스테이츠 2023. 3. 23. 20:20
프로젝트 소개
프로젝트: 쇼핑몰 구매 고객 리워드 시스템
- 유저는 사용자인증을 하고 출석, 조회, 수령 서비스를 이용 가능합니다
- 관리자는 재고 부족 알림을 수신받을 수 있고 재고 조절, 현황 조회를 할 수 있는 출석 리워드 시스템입니다.
- 리워드 수령 방법
- 유저 정보 인증 후 하루 한번 출석 체크
- 일정 출석 횟수를 달성했을 때 해당하는 상품을 수령
- ex) 5 일 출석 -> 현금성 포인트 5000원 | 15 일 출석 -> 에어팟
개발 기간 및 인원
- 2023-03-07 ~ 2023-03-24(약 3주)
- User - Server: 김태환, 김상윤
- Manager - Server: 김지훈, 김건
인프로 구현 요구사항
- 사용자 인증 시스템과 리워드 시스템은 별개의 도메인으로 설계해야 합니다.
- 두 개의 시스템은 느슨하게 결합되어야 합니다.
- 모든 서버는 컨테이너 환경 또는 서버리스로 구현되어야 합니다.
- 시스템 전반의 가용성을 고려해야 합니다.
- 리워드 시스템 구현이 CI/CD에 의해 자동화되어야 합니다.
- IaC화가 진행되어야 합니다.
구현 항목
- 유저 인증정보 확인
- Manager 알림 서비스
- DynamoDB 제작
- User 활동
- 구매내역 조회
- 현금성 포인트 조회
- 출석 인증, 출석 조회
- 리워드 조회
- Manager 활동
- 고객의 출석 현황 확인
- 리워드 재고 조회
- 리워드 항목 수량 조절
- 리워드 재고 확인 알림
데이터배이스 제작
ERD를 통해 필요한 데이터와 테이블을 정리하고 해당 RDBMS형식의 데이터들을 DynamoDB를 사용해 만들었다.
DynamoDB는 초당 쿼리 요청 수에 따라 비용을 계산하므로 온디맨드 형식에 지불방식인 서버리스 환경에서 필요한 지불 방식을 제공한다.
Users 테이블
유저를 확인할 수 있는 id와 유저를 확인할 수 있게 username항목을, 유저가 사용할 수 있는 현금성 서비스를 확인하기 위해 user_point를, 해당 유저가 얼마나 출석을 했는지 확인할 수 있게 count를 넣었습니다.
Attendance 테이블
출석을 확인할 수 있는 테이블로 출석을 확인할 수 있는 id를 넣고 유저별로 확인 할 수 있게 user_id를, 어떤 날에 출석을 확인했는지 확인하기 위해 date를 넣었습니다.
Rewards 테이블
리워드를 확인 할 수 있는 id와 어떤 유저가 리워드를 받았는지 확인하기 위해 유저를 확인하는 user_id와 상품을 확인하는 product_id, 수령가능한 리워드의 필요한 출석 수를 확인하기 위해 reward_time을 넣었습니다
Products 테이블
상품을 확인할 수 있는 id와 상품 이름을 등록한 name, 현재 보유중인 상태를 확인하기 위해 condition, 특정 개수를 유지 하기 위해 remain을 넣었습니다.
프로젝트 아키텍처
WorkFlow
1. 유저는 로그인 후 URL에서 발급 받은 토큰을 APIgateway를 통해 Lambda로 요청을 보낸다.
2. 요청을 받은 람다는 Cognito를 통해 토큰을 확인한다.
3. 인증 받은 고객은 Internet Gateway를 통해 VPC와 통신하게 된다.
4. 트래픽은 Application Load Balancer를 거쳐 ECS Fargate 서버에 출석 및 리워드 관련 요청을 보낸다.
5. 서버에서 해당 요청을 받아 VPC Endpoint를 통해 DynamoDB에 접근하여 해당 요청과 관련된 작업을 수행한다.
6. 서버에서 수행한 작업의 결과를 유저에게 리턴한다.
7. 유저가 리워드 수령 시 DB에 Products테이블 Condition항목이 Remain항목 보다 낮을경우 SQS에 메세지를 전달한다.
8. SQS와 트리거 된 Lambda를 통해 메세지를 SES에 등록된 매니저 이메일로 전송한다.
9. EventBridge를 사용해 매일 일정 시간 마다 이벤트를 발생시켜 Lambda를 실행시킨다.
10. 실행된 Lambda는 DB에서 Products테이블 Condition항목을 조회하여 SES에 등록된 매니저 이메일로 전송한다.
11. 매니저는 APIgateway를 사용해 각각의 Lambda에 맞는 엔트포인트로 요청을 보낸다.
12. 각각의 Lambda는 함수들을 통해 DynamoDB에 있는 데이터를 조회, 수정 한다.
ECS CI/CD 워크플로우
유저 인증정보 확인
Cognito
AWS Cognito를 사용하면 사용자 인증 및 권한 부여를 관리하는 데 필요한 작업을 단순화하고, 사용자 인증 및 권한 부여를 안전하고 쉽게 구현할 수 있습니다.
애플리케이션에서 사용자 인증과 권한 부여를 구현하는 것이 복잡하고 보안에 민감하기 때문에 Cognito를 사용해 보안성을 높이고 사용자 데이터를 보호하기 위해 선택했습니다.
- 이미 사용자가 쇼핑몰 회원으로 등록 되어 있다 가정하고 토큰을 Cognito로부터 가져와 사용했습니다.
- 이벤트 시스템의 root path에 들어왔을 때 토큰을 Cognito로 보내 인증 진행했습니다.
- 그 이후 유저 인증 여부를 boolean 값으로 저장해두고 출석 및 리워드 기능을 수행할 때 인증 여부를 확인했습니다.
유저 출석, 리워드 도메인
ECS 클러스터
모든 서버가 컨테이너 환경 또는 서버리스로 구현되길 원하는 요구 사항을 바탕으로 ECS를 사용하였습니다.
ecs는 Multi AZ 기능과 auto scaling을 통한 높은 확장성 그리고 다른 컨테이너 오케스트레이션에 비해 간단한 구성과 운영이 가능하기 때문에 저희 서비스에 최적의 도구라고 생각하여 선택하게 되었습니다.
- 출석관리, 받을 수 있는 리워드 확인, 리워드수령 기능 제공
- VPC 외부에 있는 dynamoDB와 연동하기 위해dynamoDB 용 VPC endpoint 사용
- 가용성 확보를 위해 Application Load Balancer와Auto scaling group을 활용
- 서버리스 아키텍처를 구현을 위해 Fargate 사용
이벤트 관리자, 알림 도메인
관리자 도메인
Lambda
모든 서버가 컨테이너 환경 또는 서버리스로 구현되길 원하는 요구 사항을 바탕으로 Lambda를 사용하였습니다.
Lambda를 사용하면 서버 관리, 확장, 보안 등과 같은 작업을 서비스 제공업체(AWS)가 모두 처리해줌으로서, 서버 기반의 애플리케이션 개발 및 운영에 비해 시간과 비용을 크게 절약할 수 있게 해줍니다.
리워드 시스템 프로젝트에서는 소수의 관리자가 운영을 하기 떄문에 비용적으로 코드를 실행하고, 실행 시간에 따라 사용한 만큼만 비용을 지불하면 되어 선택하게 되었습니다.
- 상품 재고 관리 , 리워드 출석 현황 관리 기능제공
- 서버리스 아키텍처 구현을 위해 Lambda 사용
재고 확인 알림 도메인
- Event Bridge의 cron기능을 활용해 매일 주기적으로 재고 조회
- AWS SES 서비스를 활용해 관리자에게 알림 메일을 보냄
- 추가적으로 유저 API 에서 상품 수령 후 재고 부족할 시 알림 메일 생성
무엇을 배웠는가?
- Cognito를 이용해 사용자 인증을 구현할 수 있었습니다.
- Cognito는 userpool, identitypool을 이용해 인증 인가를 할 수 있음
- userpool을 이용해 토큰 인증 서비스를 구현함.
- DynamoDB에 테이블을 만들고 조회 하며 공부 할 수 있었습니다.
- Amazon DynamoDB는 완전관리형 NoSQL 서버리스 데이터베이스 서비스임
- VPC외부 서비스와 연결 방법에 대해 공부하여 VPCendpoint를 구현했습니다.
- Interface 엔드포인트: VPC 내의 ENI를 사용하여 vpc외부 AWS 서비스와 엑세스 가능하게함.
- Gateway 엔드포인트: VPC 내의 라우팅 테이블을 사용하여 S3와 DynamoDB에 대한 엑세스를 가능하게함.
- 각각의 인터페이스 엔드포인트는 특정 AWS 서비스에 대해 생성됩니다.
- Public, Private 서브넷에 통신 방법에 대해 정리 할 수 있었습니다.
- baston: 인터넷을 통해 접속 가능한 공개 서브넷에 배치되며, Private Subnet의 리소스에 접근할 수 있도록 합니다.
- natgateway: Private Subnet의 인스턴스가 인터넷을 통해 패킷을 보낼 수 있게 합니다.
- Eventbridge에 Cron Event생성 방법을 공부하고 Lambda에 트리거 시켰습니다.
- SES를 활용하여 Email을 전송 시스템을 구현할 수 있었습니다.
- SQS - SNS를 이용해 내결함성을 확보할 수 있었습니다.
- SQS는 분산 대기 서비스로서 메시지를 안정적으로 전달하는 기능을 제공함.
- SNS는 분산 푸시 알림 서비스로서 메시지를 다양한 프로토콜을 통해 전송하는 기능을 제공함.
- Terraform을 통한 DynamoDB 생성 방법을 배웠습니다.
'교육 > 코드스테이츠' 카테고리의 다른 글
[80일차] Final Project Day_12 (0) 2023.03.22 [79일차] Final Project Day_11 (0) 2023.03.21 [78일차] Final Project Day_10 (0) 2023.03.20 [77일차] Final Project Day_09 (0) 2023.03.18 [76일차] Final Project Day_07 ~ 08 (0) 2023.03.16