MSA

가수왕·2023년 2월 22일
0

MSA

목록 보기
1/2

1.개요

어느날 MSA에 갑자기 꽂혔다. 그래서 개인적으로 MSA프로젝트를 시작해보려 했지만 마땅한 주제가 떠오르지 않기도 했고, 프론트엔드를 개발해야 한다는 부담도 있었다. 그래서 작년 SSAFY 과정 중 진행했던 프로젝트 중 하나를 MSA구조로 변경해보기로 했다.
SSAFY 과정 중 3개의 프로젝트를 진행했다.

  1. WebRTC를 활용한 면접 스터디 서비스
  2. 빅데이터를 활용한 일상 큐레이팅 서비스
  3. AI를 활용한 손글씨 폰트화 서비스

이 중 3번 프로젝트를 선택했다. 1,2번 프로젝트는 API개발 이외에도 신경써야 할 게 좀 있었다.(OpenVidu 서버, Hadoop-cluster 구축 등) 3번은 단순히 사용했던 모델을 실행시키기만 하면 크게 신경쓸게 없었다. 회사를 다니며 혼자 공부해야 했기 때문에 MSA구축에만 집중 할 수 있는 3번 프로젝트를 선택했다.

2. 나랏말싸피

3번 프로젝트의 이름이 나랏말싸피 이다.
나랏말싸피는 위에서 적은 것 처럼 사용자의 손글씨를 폰트로 변환시키는 서비스다.
주요 기능의 흐름은 다음과 같다.

  1. 사용자는 다람쥐 헌 쳇바퀴에 타고파라는 문장을 적고 사진을 촬영한다.
  2. 해당 이미지를 나랏말싸피 페이지에 업로드해 한글자씩 크롭한다.
  3. 제작 요청을 보내면 AI를 활용해 해당 글자들을 바탕으로 2300자로 이루어진 폰트를 만든다.
  4. 제작된 폰트는 나랏말싸피 페이지 내에서 사용하거나 폰트파일(ttf)로 다운받아 사용한다.

이 외에도 다른 사람의 폰트를 보거나 폰트가 적용된 게시판 기능 등이 있다.

3. 나랏말싸피 API

프론트엔드는 최대한 건드리지 않으려고 하기 때문에 프론트엔드에서 어떤 요청을 보내는지(API 서버에서 어떤 요청을 받았는지), 정리해보겠다.
이렇게 정리하면 각 API들을 서비스별로 나누기 쉽지 않을까 하는 생각도 있다.

  1. Get user/checknickname/{nickname}
    • 닉네임 중복 확인
  2. Post user/login
    • 로그인
  3. Post user/
    • 회원가입
  4. Get user/
    • 회원정보 반환
  5. Put user/
    • 회원정보 수정
  6. Put user/toggleLike
    • 폰트 즐겨찾기 등록/해제
  7. Post user/download
    • 다운로드 로그 저장
  8. Get user/download
    • 다운로드 폰트목록 반환
  9. Get user/checkToken
    • 토큰 확인용
  10. Post note/
    • 낙서장 등록
  11. Get note/{location}
    • 지역별 낙서장 목록 반환
  12. Delete note/
    • 낙서장 삭제
  13. Get font/
    • 현재 등록된 폰트 목록 반환
  14. Get font/detail/{fontSeq}
    • 폰트 상세정보 반환
  15. Get font/checkname/{fontName}
    • 폰트 이름 중복확인
  16. Post font/
    • 폰트 제작요청
  17. Put font/
    • 폰트 정보 수정

4. 서비스 나누기

각 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
	- 다운로드 폰트목록 반환

5. 폰트 제작과정

  • 사용자가 손글씨 이미지를 업로드 하고 폰트 제작 요청을 하면 손글씨 이미지는 API서버인 스프링부트로 전송
  • 스프링부트는 손글씨 이미지를 공유폴더에 저장, fastAPI에 폰트 제작 요청

  • fastAPI에서 공유폴더에 저장된 11장의 손글씨 이미지를 바탕으로 약 2380장의 손글씨 이미지 생성
  • 약 2380장의 이미지를 다시 공유폴더에 저장
  • node.js에 폰트파일 제작 요청

  • node.js는 공유폴더에 저장된 2380장의 이미지를 벡터이미지로 변환
  • 벡터 이미지를 바탕으로 .ttf .woff 파일 생성
  • 공유폴더에 폰트파일 저장, 제작 완료 응답 반환

  • fastAPI는 공유폴더에 저장된 폰트파일 2개를 S3서버에 저장

6. 기존 아키텍처

7. MSA


여기에 Service discovery (Eureka) 도 추가해야 한다.
현재 생각은

  • 모든 구성요소는 컨테이너화 해 실행 Docker
  • Cloud 환경 배포, 일단 AWS 부족하다면 GCP
  • API Gateway에서 인증/인가절차를 진행하고 각각의 서비스에 요청을 라우팅
  • 인증 인가를 위해 Redis 사용
  • Service별 통신은 gRPC 를 사용
  • 폰트는 한번에 1개만 제작 그렇기에 MQ를 통해 관리
  • Service들은 Springboot, golang, fastAPI, Node.js, fastAPI Django or flask로 구성
  • DB는 MySQL을 기본적으로 사용하지만 1~2개 정도는 postgreSQL사용
  • MQ는 kafka 사용
  • API Gateway는 Spring Cloud Gateway 사용
  • Storage는 로컬 디렉토리 혹은 S3사용

MSA의 특성상 각각 서비스는 다른 언어와 프레임워크로 구성되어도 상관 없다는 점을 활용해 다양한 언어와 프레임워크를 사용해 볼 생각이다.

0개의 댓글