/alimi

๐ŸŒŸ ๊ฒฝํฌ๋Œ€ํ•™๊ต ์ปค๋ฎค๋‹ˆํ‹ฐ ์ฟ ๋ฎค์˜ ์•Œ๋ฆผ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค. ๋ฉ”์‹œ์ง€ํ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋™์ž‘.

Primary LanguageJava

alimi - ๋ฉ”์‹œ์ง€ ๊ธฐ๋ฐ˜ ์•Œ๋ฆผ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค

์•Œ๋ฆฌ๋ฏธ(์ดํ•˜ alimi)๋Š” ์ฟ ๋ฎค์˜ ์•Œ๋ฆผ์ด๋ผ๋Š” ์—”ํ‹ฐํ‹ฐ์™€ ํ‘ธ์‹œ ์•Œ๋ฆผ ๊ด€๋ จ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ์ฟ ๋ฎค์˜ ์—ฌ๋Ÿฌ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋กœ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌ ๋ฐ›์•„ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘์—…ํ•˜๋ฉฐ **๋Š์Šจํ•˜๊ฒŒ ๊ฒฐํ•ฉ(Loesely coupled)**ํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ง• ๋ฐ ๋™์ž‘ ๋ฐฉ์‹

  • ๋ณธ alimi ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋Š” ์ค‘์•™ DB๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. alimi์šฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ธ khumu_notification_{{ํ™˜๊ฒฝ ์ด๋ฆ„}} ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์—๊ฒŒ ๋‹ค๋ฅธ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋“ค์˜ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ๋ฐ์ดํ„ฐ๋ฅผ replicate(๋ณต์ œ)ํ•ด alimi DB์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ํ•„์š”ํ•œ field๋งŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์•™ DB์™€ ๋‚ฎ์€ ์˜์กด์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    ๋˜ํ•œ ๋ถˆํ•„์š”ํ•œ ์ฐธ์กฐ ๊ด€๊ณ„๋ฅผ ์—†์•ฐ์œผ๋กœ์จ ํ…Œ์ŠคํŠธ๋‚˜ ๋ฐ์ดํ„ฐ ๊ตฌ์„ฑ์„ ์ข€ ๋” ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฉ”์‹œ์ง• ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘์—…ํ•˜๋ฉฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋“ค๊ณผ ๋Š์Šจํ•˜๊ฒŒ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง• ์„œ๋น„์Šค๋Š” AWS์˜ SNS ์™€ SQS๋ฅผ ์กฐํ•ฉํ•ด ์ด์šฉ ์ค‘์ž…๋‹ˆ๋‹ค.

    e.g. ๋Œ“๊ธ€ ์ƒ์„ฑ์— ๋Œ€ํ•œ ์•Œ๋ฆผ ์ž‘์—…

    1. ๋Œ“๊ธ€ ์ƒ์„ฑ ์ด๋ฒคํŠธ๋ฅผ SNS์—๊ฒŒ Publishํ•ฉ๋‹ˆ๋‹ค.
    2. SNS๋Š” ์ž์‹ ์˜ ๊ตฌ๋…์ž๋“ค์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ alimi๋ฅผ ์œ„ํ•œ SQS์—๋„ ๋ฉ”์‹œ์ง€๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
    3. alimi๋Š” SQS์—์„œ ๋Œ“๊ธ€ ์ƒ์„ฑ ์ด๋ฒคํŠธ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์™€ ํ•ด๋‹น ๋Œ“๊ธ€ ์ƒ์„ฑ์— ๋Œ€ํ•œ ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜์‹ ์ž๋“ค์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
    4. ์กฐํšŒ๋œ ์ˆ˜์‹ ์ž๋“ค์—๊ฒŒ ์•Œ๋ฆผ์„ ์ƒ์„ฑํ•˜๊ณ , ์ถ”๊ฐ€์ ์œผ๋กœ ํ‘ธ์‹œ ์•Œ๋ฆผ๋„ ๋ฐ›๋Š” ์ˆ˜์‹ ์ž๋“ค์—๊ฒ ํ‘ธ์‹œ ์•Œ๋ฆผ๋„ Publishํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ํŒ

  • JPA + MySQL setting ์ฐธ๊ณ  - https://victorydntmd.tistory.com/321
  • Spring ๋ฐฐํฌ ์‹œ resources/ ๊ฒฝ๋กœ์˜ ํŒŒ์ผ์„ ์ฐพ๊ธฐ ํž˜๋“  ๊ฒฝ์šฐ
    • ClassPath๋ฅผ ์ด์šฉํ•ด์•ผ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ํŽธํ•œ๋ฐ... Jar๋กœ ๋นŒ๋“œํ•œ ๋’ค credential๋“ค์„ ์™ธ๋ถ€์—์„œ ์ถ”๊ฐ€ํ•˜๋ ค๋‹ค๋ณด๋‹ˆ ๋กœ์ปฌ์—์„  ClassPath๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋ฐฐํฌ ์‹œ์—๋Š” ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•ด ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค.
    • Jar ๋นŒ๋“œ ์‹œ์— ์กด์žฌํ•˜๋Š” ํŒŒ์ผ๋“ค์€ jar๋กœ ๋ฐฐํฌ, ์‹คํ–‰ ์‹œ์—๋„ ClassPath๋กœ๋„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

(Deprecated) ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋กœ Redis๋ฅผ ์ด์šฉํ•˜๊ธฐ

ํ˜„์žฌ๋Š” AWS์˜ SNS + SQS ๋ฅผ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋กœ ํ•ด์„œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋“ค์ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘์—…ํ•˜์ง€๋งŒ ๊ธฐ์กด์—๋Š” Redis์˜ Pub/Sub์„ ์ด์šฉํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋กœ์„œ์˜ Redis์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ์ ์„ ๋Š๋ผ๊ฒŒ ๋๊ณ  ํ˜„์žฌ๋Œ€๋กœ AWS์˜ SNS์™€ SQS๋ฅผ ๋„์ž…ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋กœ์„œ์˜ Redis ๋‹จ์ 

  • Consumer group ๊ฐ™์€ ๊ฐœ๋…์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

    ๋งŒ์•ฝ ํŠน์ • topic์„ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ตฌ๋…ํ•œ๋‹ค๋ฉด ๊ตฌ๋… ์ค‘์ธ ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ๋ฉ”์‹œ์ง€๊ฐ€ Publish๋˜๋Š” ๋‹จ์ ์ด ์กด์žฌํ–ˆ์Šต๋‹ˆ๋‹ค.

  • Subscriber๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋ฉ”์‹œ์ง€๋Š” ์œ ์‹ค๋œ๋‹ค.

    ๋ฉ”์‹œ์ง€ ํ ์„œ๋น„์Šค๋“ค์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ตฌ๋…์ž๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”์‹œ์ง€ ํ์—์„œ ๋ณด๊ด€ํ•˜๊ณ  ์žˆ๋Š” ๋ฐ˜๋ฉด Redis๋Š” ๋‹จ์ˆœํžˆ ๋ฐ”๋กœ ๋ฐ”๋กœ Pushํ•˜๋Š” ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์‹œ์ ์— ๊ตฌ๋…์ž๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”์‹œ์ง€๊ฐ€ ์œ ์‹ค๋  ์ˆ˜ ๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค Redis๋Š” ๋ฉ”์‹œ์ง€ "ํ"๋ผ๊ณ  ๋ณผ ์ˆ˜๋„ ์—†๊ธด ํ•ฉ๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ๋ฐฉ๋ฒ• ๋ฐ ์ •๋ฆฌ

ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค์—๊ฒŒ ๋‹ค๋ฅธ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋“ค์˜ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ๋ฐ์ดํ„ฐ๋ฅผ replicate(๋ณต์ œ)ํ•ด alimi DB์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ํ•„์š”ํ•œ field๋งŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์•™ DB์™€ ๋‚ฎ์€ ์˜์กด์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ถˆํ•„์š”ํ•œ ์ฐธ์กฐ ๊ด€๊ณ„๋ฅผ ์—†์•ฐ์œผ๋กœ์จ ํ…Œ์ŠคํŠธ๋‚˜ ๋ฐ์ดํ„ฐ ๊ตฌ์„ฑ์„ ์ข€ ๋” ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฉ”์‹œ์ง• ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•ด ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ž‘์—…ํ•˜๋ฉฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋“ค๊ณผ ๋Š์Šจํ•˜๊ฒŒ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง• ์„œ๋น„์Šค๋Š” AWS์˜ SNS ์™€ SQS๋ฅผ ์กฐํ•ฉํ•ด ์ด์šฉ ์ค‘์ž…๋‹ˆ๋‹ค.

    e.g. ๋Œ“๊ธ€ ์ƒ์„ฑ์— ๋Œ€ํ•œ ์•Œ๋ฆผ ์ž‘์—…

    1. ๋Œ“๊ธ€ ์ƒ์„ฑ ์ด๋ฒคํŠธ๋ฅผ SNS์—๊ฒŒ Publishํ•ฉ๋‹ˆ๋‹ค.
    2. SNS๋Š” ์ž์‹ ์˜ ๊ตฌ๋…์ž๋“ค์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ alimi๋ฅผ ์œ„ํ•œ SQS์—๋„ ๋ฉ”์‹œ์ง€๊ฐ€ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
    3. alimi๋Š” SQS์—์„œ ๋Œ“๊ธ€ ์ƒ์„ฑ ์ด๋ฒคํŠธ ๋ฉ”์‹œ์ง€๋ฅผ ๊ฐ€์ ธ์™€ ํ•ด๋‹น ๋Œ“๊ธ€ ์ƒ์„ฑ์— ๋Œ€ํ•œ ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜์‹ ์ž๋“ค์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.
    4. ์กฐํšŒ๋œ ์ˆ˜์‹ ์ž๋“ค์—๊ฒŒ ์•Œ๋ฆผ์„ ์ƒ์„ฑํ•˜๊ณ , ์ถ”๊ฐ€์ ์œผ๋กœ ํ‘ธ์‹œ ์•Œ๋ฆผ๋„ ๋ฐ›๋Š” ์ˆ˜์‹ ์ž๋“ค์—๊ฒ ํ‘ธ์‹œ ์•Œ๋ฆผ๋„ Publishํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ํŒ

  • JPA + MySQL setting ์ฐธ๊ณ  - https://victorydntmd.tistory.com/321
  • Spring ๋ฐฐํฌ ์‹œ resources/ ๊ฒฝ๋กœ์˜ ํŒŒ์ผ์„ ์ฐพ๊ธฐ ํž˜๋“  ๊ฒฝ์šฐ
    • ClassPath๋ฅผ ์ด์šฉํ•ด์•ผ ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ํŽธํ•œ๋ฐ... Jar๋กœ ๋นŒ๋“œํ•œ ๋’ค credential๋“ค์„ ์™ธ๋ถ€์—์„œ ์ถ”๊ฐ€ํ•˜๋ ค๋‹ค๋ณด๋‹ˆ ๋กœ์ปฌ์—์„  ClassPath๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋ฐฐํฌ ์‹œ์—๋Š” ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•ด ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค.
    • Jar ๋นŒ๋“œ ์‹œ์— ์กด์žฌํ•˜๋Š” ํŒŒ์ผ๋“ค์€ jar๋กœ ๋ฐฐํฌ, ์‹คํ–‰ ์‹œ์—๋„ ClassPath๋กœ๋„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ๋ฐฉ๋ฒ• ๋ฐ ์ •๋ฆฌ

  • JUnit5๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ test๋ฅผ ์ง„ํ–‰
  • @SpringBootTest
    • Junit5์—์„œ๋Š” @RunWith๋ฅผ ๋”ฐ๋กœ ์ •์˜ํ•  ํ•„์š” ์—†๋‹ค.
    • JUnit4์—์„œ๋Š” @RunWith์— ์ ์ ˆํ•œ RunnerClass๋ฅผ ์ •์˜ํ•ด์ค˜์•ผํ•œ๋‹ค.
  • @ExtendWith ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ํ™•์žฅ์ ์œผ๋กœ ์ถ”๊ฐ€ํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • @ExtendWith(SpringExtension.class) - Spring ์•ฑ ์„œ๋น„์Šค๋ฅผ ์ „์ฒด ๋‹ค ๋„์šฐ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ Bean ์ฃผ์ž…๊ณผ ๊ฐ™์€ ์Šคํ”„๋ง์˜ ๊ธฐ๋Šฅ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • @ExtendWith(MockitoExtension.class) - Spring๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋กํ•ด์ฃผ๋Š” Mock์„ ์ด์šฉํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰
  • @Mock - MockitoExtension์„ ํ†ตํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ ํ•ด๋‹น ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. Bean์œผ๋กœ์„œ ์ด์šฉํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
  • @MockBean - SpringExtension์„ ํ†ตํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ ํ•ด๋‹น ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. Bean์œผ๋กœ์„œ ์ด์šฉ๋œ๋‹ค.
  • @Spy - @Mock์€ ์ •๋ง ์•„๋ฌด ๋™์ž‘์•ˆํ•˜๋Š” ๊ฐ€์งœ ํƒ€์ž…์„ ์ด์šฉํ•˜๋„๋กํ•˜๋Š” ๋ฐ˜๋ฉด, Spy๋Š” ์‹ค์ œ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. (MockitoExtension์„ ์‚ฌ์šฉํ•  ๋•Œ)
  • @Spy - @Spy๋ฅผ @Bean์œผ๋กœ ์ด์šฉํ•  ๋•Œ (SpringExtension์„ ์‚ฌ์šฉํ•  ๋•Œ)
  • @InjectMock - @Mock์ด๋‚˜ @MockBean, @Spy ๋“ฑ์œผ๋กœ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•ด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

์ฐธ๊ณ