Code Monkey home page Code Monkey logo

msa_statistics_service_with.nestjs's Introduction

통계 Service MSA Project ( NestJS 개인 프로젝트 )

Project Reference Notion Document URL

https://www.notion.so/Service-MSA-88cf6b17b494414fa5890332ec181046

0. MSA란?


  • Micro Service Architecture 의 줄임말으로써, 각 서비스를 독립적인 서비스로 연결한 구조를 의미한다.
  • 장점은, 하나의 프로젝트 내 서비스 전체가 존재했던 모놀로그식 개발의 단점인 부분 장애가 전체 서비스의 장애로 확대될 수 있는것을 방지.
  • 배포 시간이 오래걸리는 것을 해결, 한 Framework & Language에 종속적인 반면, 여러 언어로 개발이 가능하다.
  • 재사용성이 용이하다.
  • 단점은, 모놀로그식 개발보다 개발의 난이도가 높으며, 통신의 장애와 서버 부하 등이 있을 경우 트랜잭션을 어떻게 유지할지 결정, 구현이 필요함.
  • 통합 테스트가 어려우며, 실제 운영환경에 대해 배포하는 것이 쉽지 않음. (단, 기획 단계부터 MSA로 개발하고자 한다면 배포하는 것에 대한 부담이 적어진다)
  • 다른 서비스들과의 연동이 정상적으로 이루어지는지 테스트 과정이 필요함.

1. 통계(Statistics) Service MSA 소개


  • API에 대한 문서는 Swagger를 사용하여 작성하였다.
  • NodeJS의 라이브러리인 Cron(스프링에서는 Batch와 같다.) 을 통하여 하루가 지나갈 때마다 수집된 정보들을 각 Log Table에 저장함.
  • 로그 기록 기간은 당일 기준 최소 1일 ~ 최대 1년까지의 기록을 볼 수 있다.
  • 기능은 총 6가지의 기능이 있다.
  • 신규 사용자 가입 횟수, 사용자 탈퇴 횟수, 사용자의 웹 로그인 횟수, 국가별 사용자 통계, 각 기능 기간별 합계, 각 기능 기간별 평균 총 6가지 기능이 존재한다.

2. 통계(Statistics) Service MSA 개발 동기


  • 하나의 언어에 종속적인 단점을 직접 느껴보자 하여 NestJS라는 NodeJS의 Express에서 파생된 라이브러리를 사용하여 개발해보고자 하였다.
  • 마이크로 서비스 아키텍처(MSA)라는 개념을 어느정도 이해하고자, 하나의 독립적인 서비스를 하나의 프로젝트로 개발해보고자 하였다.
  • Docker를 통하여 배포하는 것은 MSA만큼 적절한 상황이 없다 생각하여 PR(Pull Request)이 된 후 Pipeline을 통하여 Image생성 -> Container 과정을 겪어보고 싶었다.

3. 프로젝트 개발 환경 및 사용 기술


IDE

  • Visual Sudio Code

Framework

  • NestJS(Version 3.0)

ORM

  • TypeORM

DBMS

  • MariaDB

Tools

  • Docker
  • Doppler

4. 프로젝트 제작 기간 (2022/11/07 ~ 2022/11/25) 총 3주간 실제 작업기간 : 8일


1주차 (2022/11/07 ~ 2022/11/13)

  • NestJS 프로젝트 세팅
  • NestJS Framework 내 프로젝트 구조 세팅 (Provider 생성 및 Module 생성)
  • DB구조 작성(ERD Cloud)
  • 신규 사용자 가입 횟수, 사용자 탈퇴 횟수, 사용자의 웹 로그인 횟수 기능 구현

2주차 (2022/11/14 ~ 2022/11/20)

  • 배치(Cron Library) 프로세스 구현 => NestJS에서는 Scheduler라고 명한다.
  • 국가별 사용자 통계 기능 추가
  • 각 기능 별 합계 & 통계 기능 추가

3주차 (2022/11/21 ~ 2022/11/28)

  • Swagger API 문서 작성
  • 합계 & 통계를 하나의 API로 모든 기능들의 결과를 확인할 수 있는 API 작성
  • 통합 테스트
  • Docker Image Upload

5. Entity Relationship Diagram


  • ERD 다이어그램 모델링 툴은 ERDCloud를 사용하였음. 스크린샷 2022-12-17 17 04 32

6. Package layer


  • MVC 패턴으로 구현.
  • 각 Module이 Provider를 사용할 수 있도록 Export처리를 전역적으로 해주었음.
  • Module 단위로 Controller와 Provider를 작성하였음.
    스크린샷 2022-12-17 19 18 22

7. Functional Specification


공통사항

  • 기간은 당일 기준 **최소 1일 ~** 최대 1년까지의 통계를 볼 수 있습니다.
  • 데이터는 저장되어있는 Log를 기준, Batch Process를 사용하여 1일을 주기로 각 기능의 Batch Table에 하루동안 쌓인 Log Table의 결과를 저장합니다.

7-1. 신규 사용자 가입 기간별 횟수

  • 회원가입 & SNS 첫 로그인 시 신규 사용자 가입 Log가 DB에 저장됩니다.

7-2. 사용자 탈퇴 기간별 횟수

  • 해당하는 테이블의 PK가 삭제되거나 특정 Column의 값이 변경되었을 경우 사용자 탈퇴 로그가 DB에 저장됩니다. - (삭제 여부나 삭제 시간 체크방법은 ?)
    • ex ) 삭제 여부 컬럼값이 N → Y & 삭제 시간이 존재하는 경우 등

7-3. 사용자의 기간별 웹 로그인 횟수

  • 접속 횟수 Log는 로그인이 성공적으로 수행이 된 후에 Log Table에 저장됩니다.
  • 중복 체크는 하루 기준으로 하며, 유저 DB의 PK를 사용하여 중복체크를 합니다.

7-4. 1, 2, 3번 기능의 기간별 합계

  • 1번 기능 Batch Table에서 사용자가 설정한 기간만큼 연산을 수행한 후 기간별 합계를 보여줍니다.
    • 연산 과정은 프로젝트 내 비즈니스 로직에서 수행 예정입니다.

7-5. 1, 2, 3번 기능의 기간별 평균

  • 4번 기능 명세랑 동일합니다.
    • End-User가 설정한 기간의 데이터 Count / 시작일~종료일만큼의 날짜
  • 반올림은 없으며, 소수점 한자리수까지 보여줍니다.

7-6. 국가별 사용자 통계

  • 로그인 시, IP로 접속 국가를 판단하여 해당하는 국가를 Log Table에 저장합니다.
  • 기간별로 어느 국가에서 접속을 몇번 하였는지 확인할 수 있습니다.
  • 중복체크는 하루 기준으로 하며, 유저 DB의 PK를 사용하여 중복체크를 하도록 합니다.

8. Doppler를 통하여 환경변수 관리하기


Doppler Tool을 사용한 이유

  1. MSA가 여러개일 경우, 환경변수 설정에 있어서 개발 시간의 손실이 생길 수 있다 생각하여서 하나의 Tool로 관리하자 생각함.
  2. .env 파일의 보안 이슈가 있다 하여, Doppler 사용을 하기로 최종 결정.

8-1. 프로젝트 내 Doppler Install & app.module.ts 구조

스크린샷 2022-12-17 17 31 29

8-2. Doppler Secret Key & Package Install Dockerfile에 작성

스크린샷 2022-12-17 17 32 45

8-3. Doppler Secrets Key dev(개발서버) & prg(프로덕션) & stg(스테이징)마다 다른 환경변수 전달

스크린샷 2022-12-17 17 34 11

스크린샷 2022-12-17 17 34 41

8-4. Doppler를 적용하기 위한 CLI Modify

스크린샷 2022-12-17 17 54 47

9. Docker


9-1. Image를 생성할 Project로 이동

스크린샷 2022-12-17 18 02 33

9-2. Dockerfile Build

스크린샷 2022-12-17 18 08 31

9-3. 생성된 Docker Image

스크린샷 2022-12-17 18 09 12

9-4. 생성된 Image를 docker-compose.yml 파일을 통하여 간결하게 Docker Container 생성

스크린샷 2022-12-17 18 23 32
(docker-compose.yml파일 코드)

9-5. Docker Container 실행 & 실행 결과

스크린샷 2022-12-17 18 21 53

10. Swagger


스크린샷 2022-12-17 19 00 17 스크린샷 2022-12-17 19 02 14

11. Referance


마이크로서비스 분산DB 조회 설계

오늘의집 MSA Phase 1. 서비스 구축과 배포 with Mortar - 오늘의집 블로그

Documentation | NestJS - A progressive Node.js framework

CronMaker

msa_statistics_service_with.nestjs's People

Contributors

yeonghoon-mo avatar

Stargazers

LeeJISeop avatar

Watchers

Kostas Georgiou avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.