어느날 MSA에 갑자기 꽂혔다. 그래서 개인적으로 MSA프로젝트를 시작해보려 했지만 마땅한 주제가 떠오르지 않기도 했고, 프론트엔드를 개발해야 한다는 부담도 있었다. 그래서 작년 SSAFY 과정 중 진행했던 프로젝트 중 하나를 MSA구조로 변경해보기로 했다.
SSAFY 과정 중 3개의 프로젝트를 진행했다.
이 중 3번 프로젝트를 선택했다. 1,2번 프로젝트는 API개발 이외에도 신경써야 할 게 좀 있었다.(OpenVidu 서버, Hadoop-cluster 구축 등) 3번은 단순히 사용했던 모델을 실행시키기만 하면 크게 신경쓸게 없었다. 회사를 다니며 혼자 공부해야 했기 때문에 MSA구축에만 집중 할 수 있는 3번 프로젝트를 선택했다.
3번 프로젝트의 이름이 나랏말싸피
이다.
나랏말싸피는 위에서 적은 것 처럼 사용자의 손글씨를 폰트로 변환시키는 서비스다.
주요 기능의 흐름은 다음과 같다.
다람쥐 헌 쳇바퀴에 타고파
라는 문장을 적고 사진을 촬영한다.이 외에도 다른 사람의 폰트를 보거나 폰트가 적용된 게시판 기능 등이 있다.
프론트엔드는 최대한 건드리지 않으려고 하기 때문에 프론트엔드에서 어떤 요청을 보내는지(API 서버에서 어떤 요청을 받았는지), 정리해보겠다.
이렇게 정리하면 각 API들을 서비스별로 나누기 쉽지 않을까 하는 생각도 있다.
Get
user/checknickname/{nickname}Post
user/loginPost
user/Get
user/Put
user/Put
user/toggleLikePost
user/downloadGet
user/downloadGet
user/checkTokenPost
note/Get
note/{location}Delete
note/Get
font/Get
font/detail/{fontSeq}Get
font/checkname/{fontName}Post
font/Put
font/각 API들을 서비스별로 나눠보자
일단 나랏말싸피는 크게 폰트
, 사용자
, 낙서장
으로 나눌 수 있을거라 생각한다.
각 도메인별로 API를 할당하다가 고민이 되는게 있었다.
"6번 7번 8번은 어느 서비스로 할당 해야하는거지?"
다음 폰트들은 사용자 개개인의 정보지만 폰트를 다루는 API들이다.
처음 개발을 할때는 폰트를 다루지만 결국 사용자 정보라고 생각했기 때문에 User Controller에서 처리했다. (이때도 확신을 가지진 못했다.)
이를 서비스별로 확실하게 나누려다 보니 더 애매해졌다.
아직 답을 내리진 못했다. MSA를 설계하는 방법에 대해 좀 더 알아보고 결정을 해야할 것 같다.
User Service
Get user/checknickname/{nickname}
- 닉네임 중복 확인
Post user/login
- 로그인
Post user/
- 회원가입
Get user/
- 회원정보 반환
Put user/
- 회원정보 수정
Get user/checkToken
- 토큰 확인용
Note Service
Post note/
- 낙서장 등록
Get note/{location}
- 지역별 낙서장 목록 반환
Delete note/
- 낙서장 삭제
FontInfo Service
Get font/
- 현재 등록된 폰트 목록 반환
Get font/detail/{fontSeq}
- 폰트 상세정보 반환
Get font/checkname/{fontName}
- 폰트 이름 중복확인
Put font/
- 폰트 정보 수정
MakeFont Service
Post font/
- 폰트 제작요청
폰트제작을 따로 뺀 이유는 프로젝트의 메인 기능이기도 하고 MessageQueue와 엮여있어 분리하는게 프로젝트 구성에 더 쉬울거라는 생각을 했기 때문이다.
고민중
Put user/toggleLike
- 폰트 즐겨찾기 등록/해제
Post user/download
- 다운로드 로그 저장
Get user/download
- 다운로드 폰트목록 반환
여기에 Service discovery (Eureka) 도 추가해야 한다.
현재 생각은
Docker
AWS
부족하다면 GCP
Redis
사용gRPC
를 사용Springboot
, golang
, fastAPI
, Node.js
, fastAPI
Django or flask
로 구성kafka
사용Spring Cloud Gateway
사용로컬 디렉토리 혹은 S3
사용MSA의 특성상 각각 서비스는 다른 언어와 프레임워크로 구성되어도 상관 없다는 점을 활용해 다양한 언어와 프레임워크를 사용해 볼 생각이다.