Skip to content

13. Architecture

hataerin edited this page Nov 26, 2021 · 5 revisions

1์ฐจ ์•„ํ‚คํ…์ฒ˜

Warm Up!

1.Event Storming

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์— ๊ฐœ๋ณ„ ์„œ๋น„์Šค๋ฅผ ์†Œ๊ทœ๋ชจ ๋ชจ๋“ˆ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋„๋ก Microservice architecture๋ฅผ ๋„์ž…ํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค.

์„œ๋น„์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํŒ€์›๋“ค๊ณผ ํ•จ๊ป˜ DDD์˜ ์ „๋žต์  ์„ค๊ณ„์ธ ์ด๋ฒคํŠธ์Šคํ† ๋ฐ์„ ํ†ตํ•ด ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ๋„์ถœํ•˜์˜€๋‹ค.

event driven modeling activity

์ด ํ™œ๋™์„ ํ†ตํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„œ๋น„์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค.

  • Authentication Service (์ธ์ฆํ† ํฐ๊ด€๋ฆฌ)
  • User Service (์‚ฌ์šฉ์ž๊ด€๋ฆฌ)
  • Team Service (ํŒ€๊ด€๋ฆฌ)
  • Document Service (๋ฌธ์„œ๊ด€๋ฆฌ)
  • Document History Service (๋ฌธ์„œ์ด๋ ฅ๊ด€๋ฆฌ)
  • Editor Service (๊ณต๋™๋ฌธ์„œ์ž‘์„ฑ)
  • Video Conference Service (ํ™”์ƒ์ฑ„ํŒ…)
  • Chat Service (์ฑ„ํŒ…)

2.Data Modeling

๊ฐ ์„œ๋น„์Šค๋งˆ๋‹ค ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•ด์•ผํ•˜๋Š”์ง€ ์ƒ์„ธํ™”ํ•˜๊ธฐ ์œ„ํ•ด monolithic์ด๋ผ ๊ฐ€์ •ํ•˜๊ณ  aquery tool์„ ์ด์šฉํ•˜์—ฌ database๋ฅผ ์„ค๊ณ„๋ฅผ ํ•ด๋ณด์•˜๋‹ค.

1st data modeling


Architecturing

'microservice = ์„œ๋น„์Šค ๋ถ„๋ฆฌ'๋ผ๋Š” ๊ฒƒ์— ์ดˆ์ ์„ ๋‘์–ด ํด๋ผ์ด์–ธํŠธ๋Š” ํ•˜๋‚˜๋กœ ๊ฐœ๋ฐœํ•˜๋˜ ์„œ๋ฒ„ ์ชฝ์€ ์„œ๋น„์Šค๋งˆ๋‹ค ๋ชจ๋‘ ๋ถ„๋ฆฌ์‹œ์ผฐ๋‹ค.

bbzzkk ํŒ€์› ๋ชจ๋‘ AWS EC2๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐฐํฌํ•œ ๊ฒฝํ—˜์ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ํด๋ผ์ด์–ธํŠธ๋Š” ํ•˜๋‚˜์˜ EC2 ์ธ์Šคํ„ด์Šค์—, ์„œ๋ฒ„๋Š” ์„œ๋น„์Šค ๋ณ„๋กœ EC2 ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ƒ์„ฑํ•˜์˜€๋‹ค.

  • Client: React + Nginx
  • Document Service: SpringBoot + MySQL
  • Authentication Service: Express + MongoDB
  • User Service: Express + MongoDB
  • Team Service: Express + MongoDB
  • Editor Service: Express + MongoDB
  • Video Conference Service: Express
  • Chat Service: Express

์„œ๋น„์Šค๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด Client์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์„œ๋ฒ„๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ค‘์•™์— API GATEWAY๋ฅผ ๋‘์–ด client๊ฐ€ ํ•˜๋‚˜์˜ url๋กœ ์—ฌ๋Ÿฌ endpoint api๋ฅผ ํ˜ธ์ถœ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€๋‹ค. Express Gateway์™€ AWS API Gateway ๋‘˜ ์ค‘์— ํ•˜๋‚˜๋ฅผ ๊ณ ๋ฏผํ–ˆ์—ˆ๋‹ค. Express Gateway์—์„œ socket ์—ฐ๊ฒฐ์„ ์ง€์›ํ•˜์ง€ ์•Š์•„ AWS Gateway๋กœ ์„ ์ •ํ•˜์˜€๋‹ค.

์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฐฉ์‹์œผ๋กœ ์ค‘์•™ Session Storage์„ ๋‘์–ด Session ๋ฐฉ์‹์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋กœ๊ทธ์ธ ์‹œ JWT๋ฅผ ๋ฐœํ–‰ํ•˜์—ฌ JWT ์ธ์ฆ ๋ฐฉ์‹์„ ๋„์ž…ํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค. ๊ฐ ์„œ๋น„์Šค์—์„œ๋Š” ์šฐ์„ ์ ์œผ๋กœ JWT๋ฅผ ํ™•์ธํ•˜์—ฌ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์ธ์ง€ ํ™•์ธํ•˜๊ณ  request ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ด๋‹ค.

1์ฐจ์•„ํ‚คํ…์ฒ˜

๊ณ ์ฐฐ

  1. ํ•˜๋‚˜์˜ AWS EC2์— server ์ฝ”๋“œ์™€ database๋ฅผ ๊ฐ™์ด ๋ฐฐํฌํ–ˆ์„ ๊ฒฝ์šฐ microservice ์žฅ์ ์„ ์ตœ๋Œ€ํ™”ํ•˜์ง€ ๋ชปํ•œ๋‹ค.

ํ•ด๋‹น ์ธ์Šคํ„ด์Šค(๋…ธ๋“œ)์— 3 tier layer๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

์ฒซ ๋ฒˆ์งธ, ํ•ด๋‹น ์ธ์Šคํ„ด์Šค์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ์‚ฌ์šฉ์ž๋Š” ํ•ด๋‹น ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•œ๋‹ค. ๋‘ ๋ฒˆ์งธ, ํ•ด๋‹น ์ธ์Šคํ„ด์Šค ๊ฐ€ ์ฃฝ๊ฒŒ ๋˜๋ฉด database๊ฐ€ ์ดˆ๊ธฐํ™” ๋˜์–ด ์ €์žฅ๋œ ์ •๋ณด๊ฐ€ ์‚ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ˜„์žฌ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” database๋ฅผ ๋”ฐ๋กœ ์„œ๋น„์Šค๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒŒ ์ข‹์„ ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ–ˆ๋‹ค.

  • MySQL Service
  • MongoDB Service
  1. command๋ฅผ ํ•˜๋‚˜์”ฉ ์ž…๋ ฅํ•ด์„œ nginx๋ฅผ ๊ตฌ์„ฑํ•˜์˜€๋‹ค. ํ™˜๊ฒฝ ์„ค์ • ์ž๋™ํ™”๊ฐ€ ์ •-๋ง ํ•„์š”ํ•˜๋‹ค๊ณ  ๋Š๊ผˆ๋‹ค. nginx์™€ ๊ฐ™์€ middleware์™€ service ๊ด€๋ จ config๋ฅผ AMI๋‚˜ docker image๋กœ ๊ตฌ์„ฑํ•ด์„œ ๋น ๋ฅด๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•˜์˜€๋‹ค.


2์ฐจ ์•„ํ‚คํ…์ฒ˜

2์ฐจ ์•„ํ‚คํ…์ฒ˜

  1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€์‘ํ•˜๋Š” EC2 ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.
  2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์žˆ๋Š” EC2 ์ธ์Šคํ„ด์Šค์— ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™”์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด ์™ธ๋ถ€ ์Šคํ† ๋ฆฌ์ง€ EBS๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.
  3. EC2 ์ธ์Šคํ„ด์Šค๋ผ๋ฆฌ ์—ฐ๋™์„ ์šฐ์„ ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด API Gateway๋ฅผ ์ œ์™ธํ•˜์—ฌ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋‹จ์ˆœํ™”ํ•˜์˜€๋‹ค.


3์ฐจ ์•„ํ‚คํ…์ฒ˜

3์ฐจ ์•„ํ‚คํ…์ฒ˜

  1. ๊ฐ ์„œ๋น„์Šค๋งˆ๋‹ค Auto scaling group์„ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ณ ์œ  AMI(Amazon machine image)๋กœ ๋งŒ๋“ค์–ด ํŠน์ • ์„œ๋น„์Šค ec2 ์ธ์Šคํ„ด์Šค์˜ cpu ์‚ฌ์šฉ๋ฅ ์ด 80% ์ด์ƒ์ผ ๋•Œ ํ•ด๋‹น AMI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ EC2 ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ํ•˜์˜€๋‹ค.


4์ฐจ ์•„ํ‚คํ…์ฒ˜

4์ฐจ ์•„ํ‚คํ…์ฒ˜

ํŒ€์› ์ค‘์— ๊ณผ์ •์—์„œ ๋ฐฐ์› ๋˜ k8s ๊ฐœ๋…์„ ๋ณต์Šตํ•˜๊ณ  ๋” ๊นŠ์ด ๊ณต๋ถ€ํ•˜๊ณ  ์‹ถ๋‹ค๋Š” ํŒ€์›์ด ์žˆ์–ด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ํ™˜๊ฒฝ์„ ํ†ตํ•ด ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐ์ ์„ ์ฐพ๊ณ ์ž ํ–ˆ๋‹ค. ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฌด์ค‘๋‹จ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์— ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ k8s ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” AWS EKS๋ฅผ ๋„์ž…ํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค.

  • ํ•˜๋‚˜์˜ k8s ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์— Client์™€ ๋ชจ๋“  ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ํ•˜๋‚˜์˜ EKS ingress point๋กœ ์š”์ฒญ์„ ํ•˜๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— AWS API Gateway๋ฅผ ์ œ์™ธ์‹œํ‚ฌ ๊ฒƒ์ด๋‹ค.
  • eks๋ฅผ ์ง€์›ํ•˜๋Š” CI๋กœ circle CI๋ฅผ ๋„์ž…ํ•  ์˜ˆ์ •์ด๋‹ค.
  • eks ํด๋Ÿฌ์Šคํ„ฐ์— ์ ‘๊ทผํ•˜๋Š” ์‚ฌ์šฉ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด openID๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

AWS EKS google OpenID connect

ํ•˜๋‚˜์˜ k8s ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์— Client์™€ ๋ชจ๋“  ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•  ์˜ˆ์ •์ด๋‹ค. EC2์— ๋ฐฐํฌ๋œ ๊ฐ ์„œ๋น„์Šค๋“ค์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์—์„œ Deployment์™€ Service ๊ฐ์ฒด์˜ ์Œ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ์ฆ‰, ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๊ฐ€์žฅ ์ž‘์€ ์„œ๋น„์Šค ๊ธฐ๋Šฅ ๋‹จ์œ„๋Š” Deployment + Service์ด๋‹ค. ingress controller๋Š” nginx-ingress ์ด์šฉํ•˜๊ณ  ์ปจํŠธ๋กค๋Ÿฌ์—๋Š” ssl ์ธ์ฆ์„ ์ ์šฉํ•  ์˜ˆ์ •์ด๋‹ค. ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์€ ํ•˜๋‚˜์˜ EKS nginx ingress ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์ „๋‹ฌ๋œ๋‹ค.

ํ•˜๋‚˜์˜ ์„œ๋น„์Šค๋‹น ๊ฐ DB๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•œ MSA ์•„ํ‚คํ…์ฒ˜๋ผ๊ณ  ๋ฐฐ์› ๋‹ค. ํ•˜์ง€๋งŒ ๊ตณ์ด ๋ฌผ๋ฆฌ์ ์œผ๋กœ DB๋ฅผ ๋ถ„๋ฆฌํ•ด์•ผํ•˜๋Š”๊ฐ€? ๊ฐ ์„œ๋น„์Šค๋ณ„๋กœ ๋…๋ฆฝ์ ์œผ๋กœ collection์„ ์ด์šฉํ•˜๋ฉด ๋˜์ง€ ์•Š๋Š”๊ฐ€๋ผ๋Š” ์˜๊ฒฌ์ด ๋‚˜์™”์—ˆ๋‹ค. ์ด๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž์ฒด๋ฅผ ํ•˜๋‚˜์˜ ์„œ๋น„์Šค ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” mongo db์™€ mysql๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์„œ๋น„์Šค ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜์˜€๋‹ค. ์ฆ‰, ์‹ค์งˆ์ ์œผ๋กœ MongoDB์— ์ ‘๊ทผํ•˜๋Š” ๊ฐ ์„œ๋น„์Šค๋Š” ๊ฐ์ž ๋…๋ฆฝ์ ์ธ collection์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

google client id, aws s3 client id, db password์™€ ๊ฐ™์€ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” .env, application.properties ํŒŒ์ผ์€ ์™ธ๋ถ€์— ๋…ธ์ถœ์ด ๋˜๋ฉด ์•ˆ๋œ๋‹ค. .gitignore ํŒŒ์ผ์„ ํ™œ์šฉํ•˜์—ฌ github์— ํ•ด๋‹น ํŒŒ์ผ์ด ์˜ฌ๋ผ๊ฐ€์ง€ ์•Š๋„๋ก ํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ์„œ๋น„์Šคํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•ด๋‹น ๋น„๋ฐ€์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ข‹์„๊นŒํ•˜๋Š” ๊ณ ๋ฏผ์„ ๊ฐ•ํ›ˆ๊ธฐ ๋ฉ˜ํ† ๋‹˜๊ป˜ ๊ณต์œ ํ–ˆ์—ˆ๋‹ค. k8s์—์„œ ์ง€์›ํ•˜๋Š” configmap ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ํด๋Ÿฌ์Šคํ„ฐ์— ์žˆ๋Š” ๊ฐ ์„œ๋น„์Šค์—์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ํ•ด๋‹น ์ •๋ณด๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

Clone this wiki locally