๐ŸธHi-Clear(๋ฐฐ๋“œ๋ฏผํ„ด ๋ชจ์ž„ ๋ฐ ์ฝ”ํŠธ ์˜ˆ์•ฝ ์„œ๋น„์Šค)



๐Ÿ“š ๋ชฉ์ฐจ


  1. ํ”„๋กœ์ ํŠธ ๊ฐœ์š”
  2. ๋„๋ฉ”์ธ ๋ฐ ์„ค๊ณ„๋ฌธ์„œ
  3. ์„œ๋น„์Šค ์•„์นดํ…์ฒ˜
  4. ํ•ต์‹ฌ๊ธฐ๋Šฅ
  5. ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

๐Ÿ“ ํ”„๋กœ์ ํŠธ ๊ฐœ์š”


ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„ 24.10.21 ~ 24.11.21(1๊ฐœ์›”)

BE - 5๋ช…

์„œ๋น„์Šค ๊ฐœ์š”

  • ๋ฐฐ๋“œ๋ฏผํ„ด ๋™ํ˜ธ์ธ๋“ค์ด ์ •๊ธฐ์  ๋ชจ์ž„ ๊ณผ ์ผํšŒ์„ฑ ๋ชจ์ž„ ์œผ๋กœ ๋ฐฐ๋“œ๋ฏผํ„ด์„ ์น  ์ˆ˜ ์žˆ๋„๋ก ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ์„œ๋น„์Šค
  • ์œ„์น˜๊ธฐ๋ฐ˜ ์ฒด์œก๊ด€, ๋ฒˆ๊ฐœ, ํด๋Ÿฝ ์กฐํšŒ๊ธฐ๋Šฅ ์ œ๊ณต
  • ์‚ฌ์žฅ๋‹˜๋“ค์€ ์ฒด์œก๊ด€์„ ๋“ฑ๋กํ•˜๊ณ  ์ฝ”ํŠธ ์˜ˆ์•ฝ์„ ๋ฐ›๊ณ , ์œ ์ €๋“ค์€ ์‚ฌ์„ค ์ฒด์œก๊ด€ ์˜ˆ์•ฝ๊ฐ€๋Šฅ
  • ์œ ์ €๋“ค๊ฐ„ ํ‰๊ฐ€๋ฅผ ํ†ตํ•ด ์‹ค๋ ฅ ๋ฐ ๋งค๋„ˆ์ ์ˆ˜ ํ‰๊ฐ€ ๊ธฐ๋Šฅ ์ œ๊ณต

๐Ÿ–‹๏ธ ํ”„๋กœ์ ํŠธ ๋„๋ฉ”์ธ ๋ฐ ์™€์ด์–ดํ”„๋ ˆ์ž„


๐Ÿ‘จ๐Ÿปโ€๐ŸŽจ ํŒ€์› ์†Œ๊ฐœ


์‚ฌ์ง„ ์ด๋ฆ„ ๋‹ด๋‹น ๋„๋ฉ”์ธ ๋ธ”๋กœ๊ทธ ๋งํฌ GitHub ๋งํฌ
๊น€์„ฑ์ฃผ ๊น€์„ฑ์ฃผ ๋ฒˆ๊ฐœ, ์ฐธ์—ฌ์ž ๋ธ”๋กœ๊ทธ GitHub
๋‚จํƒœํ˜ ๋‚จํƒœํ˜ ์•Œ๋ฆผ,
๋ชจ์ž„, ๋ชจ์ž„๋ฉค๋ฒ„,
๋Œ“๊ธ€, ๋Œ€๋Œ“๊ธ€
๋ธ”๋กœ๊ทธ GitHub
์ •์˜ˆ์ง€ ์ •์˜ˆ์ง€ ์œ ์ € ๋ฆฌ๋ทฐ, ์ข‹์•„์š”,
๋ชจ์ž„ ๊ฒŒ์‹œ๊ธ€
๋ธ”๋กœ๊ทธ GitHub
์œค์ง€ํ˜„ ์œค์ง€ํ˜„ ๋ชจ์ž„์ผ์ •, ์˜ˆ์•ฝ ๋ธ”๋กœ๊ทธ GitHub
๊ฐ•๋™์ค€ ๊ฐ•๋™์ค€ ์œ ์ €, ์ฒด์œ ๊ด€,
์ฝ”ํŠธ, ์ฝ”ํŠธ์‹œ๊ฐ„
๋ธ”๋กœ๊ทธ GitHub

๐Ÿค– ์ ์šฉ ๊ธฐ์ˆ 


์–ธ์–ด & ํ”„๋ ˆ์ž„์›Œํฌ

spring security Badge jwt Badge jpa Badge

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

CI / CD

ํด๋ผ์šฐ๋“œ

ECS Badge EC2 Badge ECR Badge awselasticloadbalancing Badge RDS Badge S3 Badge

ํ…Œ์ŠคํŠธ

junit5 Badge postman Badge locust Badge

๐Ÿ–ผ๏ธ ์„œ๋น„์Šค ์•„ํ‚คํ…์ณ ๋ฐ CI/CD


[์š”์•ฝ]

  1. ๊นƒํ—ˆ๋ธŒ main ๋ธŒ๋žœ์น˜์— ์ฝ”๋“œ๋ฅผ ์˜ฌ๋ฆฌ๋ฉด workflow ํŒŒ์ผ์„ ํ†ตํ•ด ์ž๋™์œผ๋กœ build๊ฐ€ ๋˜๊ณ , ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑ
  2. ๋งŒ๋“  ๋„์ปค ์ด๋ฏธ๋ฅผ ECR โ€˜latestโ€™๋ผ๋Š” ์ด๋ฏธ์ง€ ํ…Œ๊ทธ๋ฅผ ๋ถ™์—ฌ ํ‘ธ์‹œ
  3. ECS(fargate)๋Š” workflow์—์„œ ์ง€์ •ํ•œ task definition์— ๋”ฐ๋ผ์„œ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ pull ํ•ด์™€ ๋ฐฐํฌ
  4. ์œ ์ € ํšŒ์›๊ฐ€์ž…์—์„œ ์ƒ์„ฑ๋˜๋Š” ์ด๋ฏธ์ง€๋Š” S3 ๋ฒ„์ผ“์—์„œ, ๋ฉ”์ธ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค (mySQL) ๊ด€๋ฆฌ๋Š” RDS ์—์„œ, ๊ทธ๋ฆฌ๊ณ  ๋ถ„์‚ฐ๋ฝ๊ณผ ์บ์‹ฑ์—์„œ ์‚ฌ์šฉํ•˜๋Š” redis๋Š” ๋ณ„๋„์˜ EC2์—์„œ ๊ด€๋ฆฌ

[Service Architecture ๊ณ ๋ ค์‚ฌํ•ญ]

  • Amazon ECR vs Docker Hub
    • Amazon ECR
      • ์žฅ์ : AWS IAM๊ณผ ํ†ตํ•ฉ๋˜์–ด AWS ๋‚ด ๋ณด์•ˆ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ„ํŽธํ•˜๋ฉฐ, ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์ •์ฑ…์„ ํ†ตํ•ด ์ด๋ฏธ์ง€ ์ ‘๊ทผ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Œ. AWS ์„œ๋น„์Šค์™€์˜ ์—ฐ๋™์ด ์‰ฌ์›€.
      • ๋‹จ์ : AWS์— ์ข…์†์ ์ด๋ฉฐ, AWS ์™ธ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์—์„œ์˜ ์‚ฌ์šฉ์ด ์ œํ•œ์ ์ผ ์ˆ˜ ์žˆ์Œ.
    • Docker Hub
      • ์žฅ์ : ํŠน์ • ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž์— ์ข…์†๋˜์ง€ ์•Š๊ณ , ๋ฉ€ํ‹ฐ ํด๋ผ์šฐ๋“œ ๋ฐ ์˜จํ”„๋ ˆ๋ฏธ์Šค ํ™˜๊ฒฝ์—์„œ ์œ ์—ฐํ•˜๊ฒŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ. Docker ๊ณ„์ •์œผ๋กœ ๋‹ค์–‘ํ•œ CI/CD ๋„๊ตฌ์™€ ์ž˜ ํ˜ธํ™˜๋จ (์˜ˆ: CircleCI, TravisCI).
      • ๋‹จ์ : ๋ณ„๋„์˜ Docker ์œ ์ € ์ธ์ฆ์ด ํ•„์š”ํ•˜๋ฉฐ, ๋ฌด๋ฃŒ ํ”Œ๋žœ์€ ์ œํ•œ๋œ private์ €์žฅ์†Œ ๋ฐ ์š”์ฒญ ์ œํ•œ์ด ์žˆ์–ด ๋น„์šฉ์ด ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ์Œ.
  • ECS vs. Kubernetes
    • ECS: AWS์— ์ตœ์ ํ™”๋˜์–ด ์„ค์ •๊ณผ ๊ด€๋ฆฌ๊ฐ€ ๋น„๊ต์  ์‰ฌ์›€. AWS ๋‚ด ์„œ๋น„์Šค์™€ ํ†ตํ•ฉ์ด ์ข‹๊ณ  ํŠธ๋ž˜ํ”ฝ์–‘์— ๋”ฐ๋ฅธ ์ž๋™ ํ™•์žฅ ์ง€์›.
    • Kubernetes: ํด๋ผ์šฐ๋“œ(AWS)์™€ ๋…๋ฆฝ์ ์ด๊ณ  ํ™•์žฅ์„ฑ์ด ์ข‹๊ณ , ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์—์„œ ์ผ๊ด€๋œ ์ปจํ…Œ์ด๋„ˆ ๊ด€๋ฆฌ๋ฅผ ์ œ๊ณต. ์ดˆ๊ธฐ ์„ค์ •๊ณผ ๊ด€๋ฆฌ๊ฐ€ ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Œ.
  • Elastic Load Balancing Algorithm: Round Robin ์•Œ๊ณ ๋ฆฌ์ฆ˜
    • ์„œ๋ฒ„๊ฐ„์˜ ์„ฑ๋Šฅ์ด ์œ ์‚ฌํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ์ž‘์—…๋“ค์ด ๊ฐ„๋‹จํ•˜๋ฏ€๋กœ __์ˆœ์„œ๋Œ€๋กœ ๋Œ์•„๊ฐ€๋ฉฐ ์ž‘์—…__์„ ๋‚˜๋ˆ„์–ด์ฃผ๋Š” ๋ผ์šด๋“œ๋กœ๋นˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ ์šฉ.

[CI/CD ๊ณ ๋ ค์‚ฌํ•ญ]

  • Jenkins vs GitHub Actions
    • Jenkins
      • ์˜จํ”„๋ ˆ๋ฏธ์Šค ํ™˜๊ฒฝ์—์„œ ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์— ์šฉ์ด.
      • ๋ณต์žกํ•œ CI/CD ์›Œํฌํ”Œ๋กœ์™€ ๋‹ค์–‘ํ•œ ์™ธ๋ถ€ ๋„๊ตฌ ํ†ตํ•ฉ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์šฉ์ด.
    • GitHub Actions
      • GitHub๋ฅผ ์ฃผ์š” ์ฝ”๋“œ ์ €์žฅ์†Œ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ, CI/CD ์„ค์ •์„ ๊ฐ„๋‹จํžˆ ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ์— ์šฉ์ด.
      • ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ์›Œํฌํ”Œ๋กœ๋ฅผ ์„ ํ˜ธํ•˜๋ฉฐ, ๋ณ„๋„์˜ ์„œ๋ฒ„ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

[๊ฒฐ๋ก ]

  • ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์ธ ๊ฒƒ๊ณผ AWS์™€ Github์„ ๋ฉ”์ธ์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์—ฌ CI/CD๋กœ๋Š” Github Actions, ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜ ๊ด€๋ จ ํŠค์€ ๋ชจ๋‘ AWS์—์„œ ์‚ฌ์šฉ

    service_architecture

๐Ÿ›Ž๏ธ ํ•ต์‹ฌ ๊ธฐ๋Šฅ


๊ณต๊ฐ„ ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•œ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ํ–ฅ์ƒ

  • [์‚ฌ์šฉ๊ธฐ์ˆ ] MySQL์˜ ์ตœ์†Œ ๊ฒฝ๊ณ„ ์‚ฌ๊ฐํ˜•์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๋ถ„ํ•˜๋Š” R-Tree ์ž๋ฃŒ๊ตฌ์กฐ ๊ธฐ๋ฐ˜์˜ ๊ณต๊ฐ„์ธ๋ฑ์Šค ์‚ฌ์šฉ

  • [๋„์ž…์ด์œ ]

  • double๊ฐ’์œผ๋กœ ์ขŒํ‘œ๋ฅผ ๋ฐ›๊ณ  ๊ณ„์‚ฐํ•˜๊ฒŒ๋˜๋ฉด ๋ชจ๋“  ๋ฐ์ดํ„ฐ์—๋Œ€ํ•ด ๋ณต์žกํ•œ ์ˆ˜์‹์„ ๊ณ„์‚ฐ

  • ๊ฑฐ๋ฆฌ๊ณ„์‚ฐ์˜ ๊ฒฝ์šฐ ์ธ๋ฑ์Šค ๋ฏธ์ ์šฉ ์„ฑ๋Šฅ์ €ํ•˜ ๋ฐœ์ƒ

  • [์ˆ˜์น˜/๊ฒฐ๊ณผ]

  • ์‘๋‹ต์†๋„ 567ms โ†’ 157ms (260% ํ–ฅ์ƒ)

  • ๋ถ€ํ•˜๋Ÿ‰ ์ฆ๊ฐ€ ์‹œ 10953ms โ†’ 165ms (6500% ํ–ฅ์ƒ)

Elastic Search๋ฅผ ํ™œ์šฉํ•œ ๋ฒˆ๊ฐœ๊ฒ€์ƒ‰

  • [์‚ฌ์šฉ๊ธฐ์ˆ ] Elastic Search ์™€ nori ํ˜•ํƒœ์†Œ ๋ถ„์„ ํ”Œ๋Ÿฌ๊ทธ์ธ

  • [๋„์ž…์ด์œ ] ๋ฒˆ๊ฐœ ์ œ๋ชฉ ๋ฐ ์ฃผ์†Œ๋กœ ์œ ์ €๊ฐ€ ๊ฒ€์ƒ‰์‹œ ๋” ๋น ๋ฅธ ๊ฒฐ๊ณผ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด

  • [๋„์ž…๋ฐฉ์‹]
    elastic search์˜ ํšจ์œจ์„ ๊ทน๋Œ€ํ™” ํ•˜๊ธฐ ์œ„ํ•ด index ํ•„ํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ๊ฒŒ ์ ์šฉ์‹œ์ผฐ๋‹ค. ๊ฐํƒ„์‚ฌ์™€ ๋ถ€์‚ฌ๋ฅผ ์ œ์™ธ ์‹œํ‚ค๊ณ , ๋ฒˆ๊ฐœ๋“ค ์ œ๋ชฉ์—์„œ ์˜๋ฏธ๊ฐ€ ์—†๋Š” โ€˜๋ฒˆ๊ฐœโ€™ ๋ฐ ์œ ์‚ฌ์–ด๋“ค์„ stopwords๋กœ ๋“ฑ๋ก ์‹œ์ผฐ๋‹ค. ๋˜ํ•œ nori_tokenizer๊ฐ€ ๋‹จ์–ด๋กœ ์บ์น˜ํ•˜์ง€ ๋ชปํ•œ โ€˜๋ฏผํ„ดโ€™ ๊ณผ โ€˜๋ฐฐ๋ฏผโ€™์ด๋ผ๋Š” ๋‹จ์–ด๋“ค์„ (โ€˜๋ฐฐ๋“œ๋ฏผํ„ดโ€™์˜ ์ค„์ธ ๋ง) synonym์œผ๋กœ ๋“ฑ๋กํ•ด ์ฃผ์—ˆ๋‹ค.

    Meeting Nori
  • [์ˆ˜์น˜/๊ฒฐ๊ณผ]
    '/v1/search' API๊ฐ€ ๊ธฐ๋ณธ JPQL %like% ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒ€์ƒ‰์ด๊ณ  '/v2/search' API๊ฐ€ Elastic Search๋ฅผ ๋„์ž…ํ•œ ์ฟผ๋ฆฌ์ด๋‹ค.
    Elastic Search์˜ ๋„์ž…์œผ๋กœ ๊ฒ€์ƒ‰ ์ฟผ๋ฆฌ์˜ ์†๋„๊ฐ€ ์•ฝ 30% ํ–ฅ์ƒ๋˜์—ˆ๋‹ค.

    Meeting Nori

์œ ์ € ๋ฆฌ๋ทฐ ์ƒ์„ฑ ๋ถ„์‚ฐ๋ฝ

  • [์‚ฌ์šฉ๊ธฐ์ˆ ] Redis๋ฅผ ์‚ฌ์šฉํ•œ ๋ถ„์‚ฐ๋ฝ

  • [๋„์ž…์ด์œ ] ๋ถ„์‚ฐ๋ฝ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์ด ๊ฒฝ์Ÿ ์ƒํƒœ์— ๋“ค์–ด๊ฐ€๋Š”๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ  ๋ฐ์ดํ„ฐ์˜ ์ •ํ•ฉ์„ฑ์„ ์œ ์ง€, ์„œ๋ฒ„ ๋ถ€ํ•˜๋ฅผ ๊ด€๋ฆฌ ํ•˜๊ธฐ ์œ„ํ•ด

  • [์ˆ˜์น˜/๊ฒฐ๊ณผ] ์ค‘๋ณต ์š”์ฒญ์ด ๋ฐฉ์ง€๋˜์–ด ์ฒ˜๋ฆฌ์‹œ๊ฐ„์ด ์•ฝ [83% ์ฆ๊ฐ€] ํ•˜์˜€์œผ๋ฉฐ, ๋ฆฌ๋ทฐ ์ค‘๋ณต ์ƒ์„ฑ์ด ๊ฐ์†Œํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • ๋ถ„์‚ฐ๋ฝ ๋„์ž… ์ „

  • ๋ถ„์‚ฐ๋ฝ ๋„์ž… ํ›„

  • RPS ๋น„๊ต

์บ์‹ฑ์„ ์ ์šฉํ•œ ์œ ์ € ๋ฆฌ๋ทฐ ์„œ๋น„์Šค

  • [์‚ฌ์šฉ๊ธฐ์ˆ ] Redis ์บ์‹ฑ

  • [๋„์ž…์ด์œ ] Redis์˜ ์บ์‹ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ DB ์ ‘๊ทผ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ํฌ๊ฒŒ ํ–ฅ์ƒํ•˜๊ณ  ์„œ๋ฒ„์˜ ๋ถ€ํ™”๋ฅผ ์ตœ์†Œํ™” ํ•˜๊ธฐ ์œ„ํ•ด

  • [์ˆ˜์น˜/๊ฒฐ๊ณผ] ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์กฐํšŒ ๊ธฐ๋Šฅ์˜ ์‘๋‹ต ์‹œ๊ฐ„์ด ์•ฝ [91% ๊ฐ์†Œ] , DB์— ๊ฑธ๋ฆฌ๋Š” ๋ถ€ํ•˜๊ฐ€ ๊ฐ์†Œํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • ์บ์‹ฑ ๋„์ž… ์ „

  • ์บ์‹ฑ ๋„์ž… ํ›„

  • ์‘๋‹ต ์‹œ๊ฐ„

์˜ˆ์•ฝ ๋™์‹œ์„ฑ ์ œ์–ด

  • [์‚ฌ์šฉ๊ธฐ์ˆ ] Redis์˜ SETNX, EXPIRE ๊ธฐ๋Šฅ

  • [๋„์ž…์ด์œ ] ๋ถ„์‚ฐ๋ฝ์„ ๊ตฌํ˜„ํ•˜์—ฌ ๋™์‹œ์— ์—ฌ๋Ÿฌ ๋ช…์˜ ์‚ฌ๋žŒ๋“ค์ด ์˜ˆ์•ฝํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ค‘๋ณต ์˜ˆ์•ฝ ์ƒ์—‰์„ ์ œ์™ธํ•˜๊ธฐ ์œ„ํ•ด์„œ

  • [์ˆ˜์น˜/๊ฒฐ๊ณผ] ๋ถ„์‚ฐ๋ฝ์„ ์ด์šฉํ–ˆ์„ ๋•Œ ์˜ˆ์•ฝ 1๊ฐœ๋งŒ ์ƒ์„ฑ๋˜๊ณ (2653๊ฐœ ์š”์ฒญ, 2652๊ฐœ ์‹คํŒจ, 1๊ฐœ ์„ฑ๊ณต), ๋ฝ์„ ๊ฑธ๊ธฐ ์ „๋ณด๋‹ค RPS(์ดˆ๋‹น ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์š”์ฒญ ์ˆ˜)๊ฐ€ 149.8->168.9๋กœ ํ–ฅ์ƒ๋˜์—ˆ๋‹ค.

    Requests, Fails, Current RPS

SSE ์•Œ๋ฆผ ๊ธฐ๋Šฅ

  • [์‚ฌ์šฉ๊ธฐ์ˆ ]

    • SSE : ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‹ค์‹œ๊ฐ„ ๋ฐ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ํ‘ธ์‹œ
    • Redis Pub/Sub : ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค ์—ญํ• ์„ ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ์ด๋ฒคํŠธ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ „๋‹ฌ
  • [๋„์ž…์ด์œ ]

    • Redis Pub/Sub์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์„œ๋ฒ„๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์‰ฝ๊ฒŒ ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ  ์„œ๋ฒ„ ๊ฐ„์˜ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ์„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉฐ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • [์ˆ˜์น˜/๊ฒฐ๊ณผ]

    • SSE๋งŒ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ๋ณด๋‹ค Redis๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ 1000๋ช… ์ด์ƒ์˜ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ ‘์† ์‹œ ์•ฝ 30~40% ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

    • ์ค‘์œ„๊ฐ’

    • ์ƒ์œ„ 95%

์ง€์˜ค์ฝ”๋”ฉ

  • [์‚ฌ์šฉ๊ธฐ์ˆ ] ์ง€์˜ค์ฝ”๋”ฉ

  • [๋„์ž…์ด์œ ] ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ์ขŒํ‘œ๊ฐ’์„ ์•Œ๊ณ  ์ž…๋ ฅํ•˜๊ธฐ ์–ด๋ ค์›€(์ฃผ์†Œ ์ž…๋ ฅ)

  • [์ˆ˜์น˜/๊ฒฐ๊ณผ]

    • ์ž˜๋ชป๋œ ์ฃผ์†Œ ์ž…๋ ฅ

    • ์˜ฌ๋ฐ”๋ฅธ ์ฃผ์†Œ ์ž…๋ ฅ

ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…(ํŠธ๋Ÿฌ๋ธ” ์ œ๋ชฉ ํด๋ฆญํ•˜์—ฌ ์ž์„ธํžˆ ๋ณด๊ธฐ)


[CI/CD] Task Fail Error

[์š”์•ฝ]

  • ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋ชป์ฐพ๋Š” ์˜ค๋ฅ˜: workflowํŒŒ์ผ์—์„œ docker image๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ…Œ๊ทธ์ด๋ฆ„๊ณผ task deifnition์—์„œ ์ฐพ๋Š” ๋„์ปค ์ด๋ฏธ์ง€์˜ ํ…Œ๊ทธ ์ด๋ฆ„์„ ์ผ์น˜ ์‹œ์ผœ์„œ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ
  • task definition์„ ๋ชป์ฐพ๋Š” ์˜ค๋ฅ˜: AWS ECS์—์„œ ์ตœ์‹  task definition์„ ์ง์ ‘ ๋‹ค์šด๋ฐ›๋Š” shell command ๋ฅผ ์ฐพ์•„์„œ ํ•ด๊ฒฐ

[์—๋Ÿฌ ์ƒํ™ฉ 1]
workflow ํŒŒ์ผ๋กœ deploy ๊ณผ์ • ์ค‘ ํ…Œ์Šคํฌ๊ฐ€ ์‹œ์ž‘ํ›„, ๋ชจ๋‘ fail, ํ–ฅํ›„ ์žฌ์‹œ๋„ํ›„ โ€˜Max attempts exceededโ€™ ์—๋Ÿฌ ๋ฐœ์ƒ cicd_error1

[์›์ธ ๋ถ„์„ 1]
ECR์— ์žˆ๋Š” ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š”๋ฐ ์‹คํŒจ๋ฅผ ํ•œ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•˜์—ฌ, image tag๋ฅผ โ€˜latestโ€™๋กœ ์ˆ˜์ • ๋ฐ task definition์—์„œ๋„ โ€˜latestโ€™๋ผ๋Š” image tag๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ฐพ๋„๋ก ์ˆ˜์ • ๋˜ํ•œ, ๋” ์ด์ƒ task definition์„ ์ง์ ‘์ ์ธ shell command๋กœ ๋ถ€๋ฅด์ง€ ์•Š๊ณ  ๋‹ค์‹œ workflow command๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ˆ˜์ •

cicd_solve1

[์—๋Ÿฌ ์ƒํ™ฉ 2]
์ˆ˜์ •ํ›„, AWS ECS (Elastic Container Service)์—์„œ ์‚ฌ์šฉํ•˜๋Š” task definition ํŒŒ์ผ์ด ์ง€์ •๋œ ๊ฒฝ๋กœ์— ์—†๋‹ค๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ

cicd_error2

[์›์ธ ๋ถ„์„ 2]
task definition์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก revision๋ฒˆํ˜ธ(18)๋ฅผ command์— ํฌํ•จ

cicd_solve2

[์—๋Ÿฌ ์ƒํ™ฉ 3]
revision ๋ฒˆํ˜ธ๊ฐ€ ํ‘œ๊ธฐ๋œ task definition๋„ ๋ชป์ฐพ๋Š” ์—๋Ÿฌ๋ฐœ์ƒ cicd_error3

[์›์ธ ๋ถ„์„ 3]
task definition์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก revision๋ฒˆํ˜ธ(18)๋ฅผ command์— ํฌํ•จ ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€๋ฅผ ์ฐพ์•„๋ณด๋‹ˆ task definition์„ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์ €์žฅํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ AWS์—์„œ ๋‹ค์šดํ•ด๊ฐ€๋Š” shell command ๋ฅผ ์“ฐ๋ฉด๋œ๋‹ค๊ณ  ํ•˜์—ฌ์„œ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •.

- name: Download task definition
  run: |
    aws ecs describe-task-definition --task-definition my-task-definition-family --query taskDefinition > task-definition.json

[Trouble shooting ์„ฑ๊ณต!]
cicd_success

์ธ๋ฑ์Šค ์ ์šฉ๊ณผ์ •
  • [๋ฌธ์ œ]

    • MySQL ๊ณต๊ฐ„ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ๋ฑ์Šค๋ฅผ ์ ์šฉ์‹œ์ผœ ๊ฒ€์ƒ‰๊ธฐ๋Šฅ์„ ํ–ฅ์ƒน์‹œํ‚ค๊ณ ์žํ•จ
    • ST_Distance_Sphere๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์ธ๋ฑ์Šค๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์Œ
  • [๊ณผ์ •]

    • R-Tree ์ž๋ฃŒ๊ตฌ์กฐ ๊ธฐ๋ฐ˜ ๊ณต๊ฐ„ ์ธ๋ฑ์Šค ์‚ฌ์šฉ
    • ์ฟผ๋ฆฌ ์‹คํ–‰๊ณ„ํš์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ๋ฑ์Šค ์ ์šฉ ํ™•์ธ
    • ST_Distance_Sphere๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํ•„ํ„ฐ๋ง ํ•œ ํ›„ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
    • ST_Contains๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ๋ฑ์‹ฑํ•˜๋Š” ์ „๋žต ๊ตฌ์„ฑ
  • [๊ฒฐ๊ณผ]

  • ์ธ๋ฑ์‹ฑ ์ ์šฉ ํ›„ ์‘๋‹ต์†๋„ ์ตœ์†Œ 260% ์—์„œ ๋ถ€ํ•˜๋Ÿ‰ ์ฆ๊ฐ€ ์‹œ ์ตœ๋Œ€ 6500% ํ–ฅ์ƒ์œผ๋กœ ์„ฑ๋Šฅ์ฐจ์ด ๊ทน๋Œ€ํ™”

์œ ์ €๋ฆฌ๋ทฐ ๋ถ„์‚ฐ๋ฝ
  • [๋ฌธ์ œ]
    • ๋ฆฌ๋ทฐ ์ƒ์„ฑ์‹œ ์ค‘๋ณต๋˜๋Š” ๋ฆฌ๋ทฐ ๋ฐœ์ƒ์„ ์ค„์ด๊ณ ์ž ๋ถ„์‚ฐ๋ฝ์„ ์ ์šฉ์‹œํ‚ค๊ณ ์ž ํ•จ
    • ๋ถ„์‚ฐ๋ฝ์„ ๊ฑธ์—ˆ์œผ๋‚˜, ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ์ถฉ๋ณต๋˜๋Š” ์š”์ฒญ์ด 2~3๊ฑด ๋ฐœ์ƒํ•˜๋Š”๊ฒƒ์„ ๋ฐœ๊ฒฌ
  • [๊ณผ์ •]
    • ๋ฝ์„ ํš๋“ํ•˜๊ณ  ํ•ด์ œํ•˜๋Š” ๊ณผ์ •์ด ๋„ˆ๋ฌด ๋น ๋ฅด๊ฒŒ ์ง„ํ–‰๋˜์–ด ์ผ๋ถ€ ์š”์ฒญ์ด ๋ฝ์„ ๋ฐ›์ง€ ์•Š์€ ์ฑ„ ํ†ต๊ณผ๋˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ํ™•์ธ

    • ๋ฝ ํš๋“ - ํ•ด์ œ ๊ณผ์ •์—์„œ ํ…€์„ ์ฃผ๊ธฐ์œ„ํ•ด Thread.sleep(100);์„ ์ด์šฉ

  • [๊ฒฐ๊ณผ]
    • ๋ถ„์‚ฐ๋ฝ ์ ์šฉ ํ›„ ์ฒ˜๋ฆฌ์‹œ๊ฐ„ ์„ฑ๋Šฅ์ด ์•ฝ 83% ์ฆ๊ฐ€ํ•˜์—ฌ ์„ฑ๋Šฅ ๊ทน๋Œ€ํ™”

โœ๏ธ ํšŒ๊ณ 


๊ฐ•๋™์ค€

  • DB์ธ๋ฑ์‹ฑ์— ๋Œ€ํ•ด ์‹ฌ๋„์žˆ๊ฒŒ ํ•™์Šตํ•˜๊ณ  ์ ์šฉ ํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์•˜์Šต๋‹ˆ๋‹ค, Elasticsearch๋ฅผ ์ ์šฉ์‹œ์ผœ๋ดค์œผ๋‚˜ ๊ธฐ์ดˆ์ ์ธ ์ˆ˜์ค€์œผ๋กœ๋งŒ ์ ์šฉํ•ด๋ด์„œ ์•„์‰ฌ์› ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๋ฒˆ์—๋Š” ์กฐ๊ธˆ Elastcisearch๋ฅผ ๊ณ ๋„ํ™”ํ•˜์—ฌ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์˜ ์™„์„ฑ๋„๋ฅผ ๋†’์—ฌ๋ณด๊ณ ์‹ถ์Šต๋‹ˆ๋‹ค.

๊น€์„ฑ์ฃผ

  • CI/CD ๊ด€๋ จํ•˜์—ฌ MSA ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ ธ๊ฐ€์ง€ ๋ชปํ•œ ๊ฒƒ ์ด ์•„์‰ฝ๋‹ค. ํ•˜์ดํด๋ฆฌ์–ด ์–ดํ”Œ์ด ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋งŒํผ ์‚ฌ์žฅ๋‹˜์˜ ์ฒด์œก๊ณผ ๊ด€๋ฆฌ, ๋ชจ์ž„๊ด€๋ฆฌ, ๋ฒˆ๊ฐœ๊ด€๋ฆฌ, ์œ ์ €์˜ˆ์•ฝ๊ด€๋ฆฌ ๋“ฑ์œผ๋กœ ์„œ๋ฒ„๋ฅผ ์„ธ๋ถ„ํ™” ํ•ด์„œ ๊ด€๋ฆฌํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ฐ€์ ธ์œผ๊ฐ”๋ฉด ๋” ์ข‹์•˜์„ ๊ฒƒ ๊ฐ™๋‹ค.

๋‚จํƒœํ˜

  • ์•Œ๋ฆผ ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด์„œ SSE์™€ ๋ฉ”์‹œ์ง€ํ, Redis Pub/SUb์— ๋Œ€ํ•œ ๋‚ด์šฉ ์ •๋ฆฌ์™€ ์ œ๊ฐ€ ๊ตฌ์ถ•ํ•˜๋ ค๋Š” ์„œ๋น„์Šค์˜ ํ๋ฆ„, ๊ตฌ์กฐ๋ฅผ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ธฐ๋„ ํ–ˆ์œผ๋ฉฐ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ…๊ณผ ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง์ด ๋‘๋ ค์›Œ ์‹ค์ œ ์ฝ”๋“œ ์ž‘์„ฑ ์‹œ์ž‘์ด ๋Šฆ์–ด์กŒ์Šต๋‹ˆ๋‹ค.
  • ๊ณ„ํšํ–ˆ๋˜๊ฒƒ ๋ณด๋‹ค ๊ตฌํ˜„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ ธ๊ณ  ๋‹ค์‹œ ํ•˜๊ฒŒ๋œ๋‹ค๋ฉด ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ๊ณผ ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•˜๋ ค๋Š” ์„œ๋น„์Šค์˜ ํ๋ฆ„๊ณผ ๊ตฌ์กฐ๋ฅผ ์ž˜ ์ •๋ฆฌํ•˜๊ณ  ์‹ค์ œ ๊ตฌํ˜„ ์‹œ์ž‘์„ ๋น ๋ฅด๊ฒŒ ์‹œ์ž‘ํ•˜์—ฌ ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๋‘๋ ค์›Œํ•˜์ง€ ์•Š๊ณ  ์ž˜ ๊ธฐ๋กํ•ด๋ณด๊ณ ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹œ๋„ํ•ด๋ณด์ง€ ๋ชปํ•œ RabbitMQ์™€ Kafka ์ ์šฉ์„ ๋„์ „ํ•ด๋ณด๊ณ ์‹ถ์Šต๋‹ˆ๋‹ค.

์ •์˜ˆ์ง€

  • Redis๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ„์‚ฐ๋ฝ์„ ์ ์šฉํ–ˆ์„๋•Œ, ํ”„๋กœ์ ํŠธ์˜ ํŠน์„ฑ์ƒ ๋ฌด๊ฑฐ์šด Redisson๋ณด๋‹ค๋Š” ๊ฐ€๋ณ๊ณ  ์„ฑ๋Šฅ์ด ์ข‹์€ Lettuce๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋Š”๋ฐ ๊ธฐํšŒ๊ฐ€ ๋œ๋‹ค๋ฉด Redisson์„ ํ™œ์šฉํ•ด๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์œค์ง€ํ˜„

  • ๋™์‹œ์„ฑ ์ œ์–ด๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ๋ถ„์‚ฐ๋ฝ์„ ์ ์šฉํ–ˆ๋Š”๋ฐ DB ์กฐํšŒํ•  ๋•Œ ์บ์‹œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ฃผ ์กฐํšŒ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜์—ฌ, ๋ฐ˜๋ณต์ ์ธ DB ์กฐํšŒ๋ฅผ ์ค„์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.