๐Ÿ“ˆ Stalk Project๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

Stalk ํ”„๋กœ์ ํŠธ๋ฅผ ์†Œ๊ฐœํ•˜๊ณ , ํ”„๋กœ์ ํŠธ์˜ ์ด์Šˆ๋“ค์„ ๋ชจ์•„ ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

๐ŸŒฑ ๊ฐœ์š”

์—ฌ๋Ÿฌ ์ฆ๊ถŒ์‚ฌ์˜ ์ข…๋ชฉ ํƒ์ƒ‰ ๋ฐ ์ตœ๋Œ€ 5๋…„๊ฐ„์˜ ๊ฐœ์žฅ๊ฐ€, ์ข…๊ฐ€, ์ €๊ฐ€, ๊ณ ๊ฐ€ ๋“ฑ ์„ธ๋ถ€ ์ •๋ณด ์ œ๊ณต๊ณผ ํˆฌ์ž์ž ๊ฐ„ ์ธ์‚ฌ์ดํŠธ ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.

Stalk ํ”„๋กœ์ ํŠธ๋Š” MSA ํ™˜๊ฒฝ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ธฐํš๋œ ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

๊ธฐ์กด Tosstock ํ”„๋กœ์ ํŠธ์—์„œ MSA๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฐ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ ์ž ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค Tosstock ํ”„๋กœ์ ํŠธ๋Š” User, Post, Newsfeed, Stock ์ •๋„์˜ ํฐ ๋„๋ฉ”์ธ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด MSA๋กœ ํ™•์žฅํ•  ์‚ฌ์ด์ฆˆ์˜ ํ”„๋กœ์ ํŠธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

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

Stalk ํ”„๋กœ์ ํŠธ์˜ 1์ฐจ ๋ชฉํ‘œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Main Branch Merge๋งˆ๋‹ค ๊ฐœ์ธ ์„œ๋ฒ„์—์„œ ๋ฐ”๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•
  • MSA ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•˜์—ฌ User, Post, Newsfeed, Stock ๋„๋ฉ”์ธ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌ
  • ์‹ค์ œ ์„œ๋น„์Šค๋˜๊ณ  ์žˆ๋Š” ์—ฌ๋Ÿฌ ๋น„์ฆˆ๋‹ˆ์Šค ๊ตฌ์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ API ์ œ๊ณต
  • ๊ฐ์ข… ๋ชจ๋‹ˆํ„ฐ๋ง, MSA ๋กœ๊น… ๋“ฑ์˜ ํˆด ์‚ฌ์šฉ
  • Java -> Kotlin ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜

๊ฐ€์žฅ ํฐ ๋ชฉํ‘œ๋Š” ์—ฌ๊ธฐ์„œ ๊ฐœ๋ฐœํ•œ ๋ชจ๋“  ์ง€์‹๋“ค์„ ์ œ๊ฐ€ ์ถฉ๋ถ„ํžˆ ๊ณ ๋ฏผํ•˜๊ณ  ์ ์šฉํ•ด๋ณด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์—๋Š” ์ ˆ๋Œ€์ ์ธ ๊ธฐ์ˆ , ์€ํƒ„ํ™˜์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜๊ณ  ๊นŠ๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๐Ÿ’ช๐Ÿป


๐ŸŒฑ 1์ฐจ ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ์•ˆ

ํ˜„์—…์—์„œ๋Š” ๋ฌด์ž‘์ • ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค์ž!! ๊ฐ€ ์•„๋‹ˆ๋ผ ๋™๋ฃŒ๋“ค๊ณผ ์ถฉ๋ถ„ํ•œ ํ˜‘์˜ ๋์— ์ž‘์—…์˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‘๊ณ  ์ง„ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ ์•ˆ์—์„œ ๊ณ ๋ฏผํ•ด์•ผํ•  ๊ฒƒ๋“ค์ด ์ธํ”„๋ผ, ํ™˜๊ฒฝ ๋“ฑ์„ ํ•จ๊ป˜ ๊ณ ๋ คํ•˜๋ฉด์„œ ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‘๊ณ  ์ดˆ๊ธฐ ๊ณ„ํš ๋ฐ ๊ตฌ์„ฑ์•ˆ์„ ์„ธ์›Œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. (์ดˆ๊ธฐ์— ์„ธ์›๋˜ ๊ณ„ํš์ด ์ดํ›„์— ์™„์„ฑ๋œ ํ”„๋กœ์ ํŠธ์˜ ๊ตฌ์„ฑ๊ณผ ์–ผ๋งˆ๋‚˜ ์ฐจ์ด์ ์ด ์žˆ๋Š”์ง€ ๋น„๊ต ๋ถ„์„ํ•ด๋ณด๊ณ  ์Šค์Šค๋กœ๋ฅผ ๋ณด์™„ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.)

์ด๋ฏธ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ํ”„๋กœ์ ํŠธ๋„ ์žˆ์–ด, ์ดˆ๊ธฐ์— ์–ด๋–ค ์„ธํŒ…๊ณผ ์ž‘์—…์„ ์šฐ์„ ํ• ์ง€๊ฐ€ ๊ณ ๋ฏผ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, MSA๋ฅผ ๋„์ž…ํ•˜๊ฒŒ ๋˜๋ฉด์„œ ๊ธฐ์กด์— ๋ฐ”๋กœ ๋ชจ๋†€๋ฆฌ์‹์œผ๋กœ ๋งŒ๋“ค์—ˆ๋˜ ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ์ƒ๊ฐ์„ ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ƒ๊ฐ ๋์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํฐ ์ฃผ์ œ๋“ค์„ ์ˆœ์„œ๋กœ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ
    • ๋กœ์ปฌ์—์„œ๋งŒ ํ…Œ์ŠคํŠธํ•  ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ตฌํ˜„ํ•œ ์„œ๋น„์Šค๋“ค์ด ํด๋ผ์šฐ๋“œ ๋“ฑ์—์„œ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ์ฃผ๊ธฐ์ ์ธ ํ™•์ธ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จ
    • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ๊ฑฐ๋Œ€ํ•ด์ง€๋งŒ ๊ทธ๋งŒํผ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ๋„ ๊ณ ๋ฏผํ•œ๊ฒŒ ๋งŽ์•„์ง€๊ฒŒ ๋˜๋Š”๋ฐ, ๋‚˜์ค‘์— ์„œ๋น„์Šค๋“ค์ด ์–ฝํ˜€์„œ ๋‚ญํŒจ๋ฅผ ๋ณด๊ฒŒ ๋  ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ
    • ์ง€๊ธˆ์€ ํ•˜๋‚˜์˜ ์„œ๋ฒ„์—์„œ Docker network๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ IP ํ†ต์‹ ์„ ํ•ด์„œ ์„œ๋ฒ„ ๋น„์šฉ์ด ๋“ค์ง€๋Š” ์•Š์ง€๋งŒ, ์ดํ›„ CI/CD ํˆด๋งˆ๋‹ค ํด๋ผ์šฐ๋“œ ์„œ๋ฒ„๋ฅผ ๋‘๊ณ  ๋™์ž‘์‹œํ‚ค๊ฒŒ ๋  ๋•Œ ๋ฐœ์ƒํ•˜๊ฒŒ ๋  ์„œ๋ฒ„ ๋น„์šฉ์ด ๋‹จ์ 
  2. MSA ํ™˜๊ฒฝ ๊ตฌ์„ฑ
    • CI/CD ๊ตฌ์„ฑ๊ณผ ๋น„์Šทํ•œ ์ด์œ ๋กœ 2๋ฒˆ์งธ์— ์ž‘์—… ์ง„ํ–‰
  3. ๊ฐ ๋„๋ฉ”์ธ ๋ฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ตฌํ˜„

์ด๋Ÿฐ ํฐ ํ‹€์„ ๋†“๊ณ  ๊ฐœ๋ฐœ ๊ณ„ํš์„ ์„ธ์› ์Šต๋‹ˆ๋‹ค.

๐Ÿฅ• ํ”„๋กœ์ ํŠธ ์˜ˆ์ƒ ์„ค๊ณ„

Tosstock-12

  • CI / CD

    • Jenkins๋Š” ๋ชจ๋“  Spring ์„œ๋ฒ„์˜ CI/CD ์ž‘๋™ ํ˜„ํ™ฉ์„ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • Ansible๋Š” ์ง€์ •๋œ ๊ฐ๊ฐ ๋‹ค์ค‘ํ™”๋œ ๋„๋ฉ”์ธ ์„œ๋ฒ„(docker container)์— ๋ฐฐํฌ ์ž‘์—…์„ ์ž๋™ํ™”ํ•˜๋Š” ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์„ฑํ•˜๋Š” ํˆด๋“ค๋กœ Jenkins์™€ Ansible์„ ์‚ฌ์šฉํ•˜๋ ค ํ•ฉ๋‹ˆ๋‹ค. Jenkins๋Š” CI(Continuous Integration)๊ณผ CD(Continuous Delivery)๋ฅผ ๋‹ด๋‹นํ•  ์˜ˆ์ •์ด๋ฉฐ, Ansible๊ฐ€ CD(Continuous Deploy)๋ฅผ ๋‹ด๋‹นํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

  • Server Architecture

    • API Gateway๋Š” ๋ถ„์‚ฐ๋œ ๋„๋ฉ”์ธ API ์š”์ฒญ์„ ํ•˜๋‚˜๋กœ ๋ชจ์œผ๋Š” ์—ญํ• ๊ณผ ์ธ๊ฐ€๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
    • Eureka๋Š” ๋ฐฐํฌ๋œ ์„œ๋ฒ„ IP์™€ Port๋ฅผ ํ™•์ธํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • Config๋Š” ๊ฐ Spring ์„œ๋น„์Šค์˜ ์„ค์ •ํŒŒ์ผ์„ ๊ด€๋ฆฌํ•˜๊ณ  ์€๋‹‰ํ™”ํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜๋กœ๋Š” API Gateway, Eureka, Config๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ MSA ์•„ํ‚คํ…์ฒ˜ ๊ตฌ์„ฑ์„ ์ตœ๋Œ€ํ•œ ๋‹จ์ˆœํ™”ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • Infra

    • MySQL์€ ๊ธฐ๋ณธ์ ์ธ RDB๋กœ ์‚ฌ์šฉ๋˜์–ด์งˆ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.
    • Redis๋Š” ๋กœ๊ทธ์ธ ๋‹จ๊ณ„์—์„œ Session / Token ์Šคํ† ๋ฆฌ์ง€๋กœ ์‚ฌ์šฉ๋˜์–ด์งˆ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.
    • RabbitMQ๋Š” Spring Config์—์„œ ์„ค์ • ํŒŒ์ผ ์ •๋ณด๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•  ๋•Œ, RabbitMQ์˜ broadcast ๋ฐฉ์‹์œผ๋กœ ๋ชจ๋“  Spring ์„œ๋น„์Šค์— ์—…๋ฐ์ดํŠธ๋œ ์„ค์ • ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•˜๋„๋ก ์‚ฌ์šฉ๋  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.
    • Kafka๋Š” ๋‰ด์Šคํ”ผ๋“œ ์‹œ์Šคํ…œ, ๋„๋ฉ”์ธ ์„œ๋น„์Šค ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค ๋“ฑ์— ์‚ฌ์šฉ๋˜์–ด์งˆ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

๐ŸŒฑ ์ •๋ฆฌ

๋งŽ์€ ๊ธฐ์ˆ ์ด ๋“ค์–ด๊ฐ„๋งŒํผ ๊ธฐ๋ณธ๊ธฐ๋ฅผ ์†Œํ™€ํžˆ ํ•˜์ง€ ์•Š๋„๋ก ํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ฐ ์„œ๋น„์Šค๋“ค์„ ๊ตฌํ˜„ํ•ด๋‚˜๊ฐ€๋ฉด์„œ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜์—ˆ๋Š”์ง€, ์™œ ๊ตฌํ˜„ํ–ˆ๋Š”์ง€, ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ๋“ฑ์˜ ์‚ฌ๋ก€๋“ค์„ ์†Œ๊ฐœํ•  ์ƒ๊ฐ์— ๊ดœํžˆ ์„ค๋ ˆ๋Š” ํ•˜๋ฃจ์ž…๋‹ˆ๋‹ค.


๐Ÿง‘๐Ÿปโ€๐Ÿ’ป Stalk ํ”„๋กœ์ ํŠธ์˜ ๋‹ค์–‘ํ•œ ์ด์•ผ๊ธฐ

ยฉ 2021. All rights reserved.