์๋ฆฌ๋ฏธ(์ดํ alimi
)๋ ์ฟ ๋ฎค์ ์๋ฆผ
์ด๋ผ๋ ์ํฐํฐ์ ํธ์
์๋ฆผ ๊ด๋ จ ๋ค์ํ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ ์๋น์ค์
๋๋ค. ์ฟ ๋ฎค์ ์ฌ๋ฌ ๋ง์ดํฌ๋ก์๋น์ค๋ก๋ถํฐ ๋ฉ์์ง
๋ฅผ ์ ๋ฌ ๋ฐ์ ๋น๋๊ธฐ์ ์ผ๋ก ์์
ํ๋ฉฐ **๋์จํ๊ฒ ๊ฒฐํฉ(Loesely coupled)**ํฉ๋๋ค.
-
๋ณธ alimi ๋ง์ดํฌ๋ก์๋น์ค๋ ์ค์ DB๋ฅผ ์ด์ฉํ์ง ์์ต๋๋ค. alimi์ฉ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ธ
khumu_notification_{{ํ๊ฒฝ ์ด๋ฆ}}
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.ํ์ํ ๊ฒฝ์ฐ ๋ฉ์์ง ๋ธ๋ก์ปค์๊ฒ ๋ค๋ฅธ ๋ง์ดํฌ๋ก์๋น์ค๋ค์ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ replicate(๋ณต์ )ํด alimi DB์ ๋ฐ์ํฉ๋๋ค. ์ด๋ ํ์ํ field๋ง ์ ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ค์ DB์ ๋ฎ์ ์์กด์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
๋ํ ๋ถํ์ํ ์ฐธ์กฐ ๊ด๊ณ๋ฅผ ์์ฐ์ผ๋ก์จ ํ ์คํธ๋ ๋ฐ์ดํฐ ๊ตฌ์ฑ์ ์ข ๋ ์ฝ๊ฒ ํ ์ ์์ต๋๋ค.
-
๋ฉ์์ง ์๋น์ค๋ฅผ ์ด์ฉํด ๋น๋๊ธฐ์ ์ผ๋ก ์์ ํ๋ฉฐ ๋ง์ดํฌ๋ก์๋น์ค๋ค๊ณผ ๋์จํ๊ฒ ๊ฒฐํฉํฉ๋๋ค. ๋ฉ์์ง ์๋น์ค๋ AWS์
SNS
์SQS
๋ฅผ ์กฐํฉํด ์ด์ฉ ์ค์ ๋๋ค.e.g. ๋๊ธ ์์ฑ์ ๋ํ ์๋ฆผ ์์
- ๋๊ธ ์์ฑ ์ด๋ฒคํธ๋ฅผ SNS์๊ฒ Publishํฉ๋๋ค.
- SNS๋ ์์ ์ ๊ตฌ๋ ์๋ค์๊ฒ ๋ฉ์์ง๋ฅผ ์ ๋ฌํฉ๋๋ค. ์ด๋ alimi๋ฅผ ์ํ SQS์๋ ๋ฉ์์ง๊ฐ ์ ๋ฌ๋ฉ๋๋ค.
- alimi๋ SQS์์ ๋๊ธ ์์ฑ ์ด๋ฒคํธ ๋ฉ์์ง๋ฅผ ๊ฐ์ ธ์ ํด๋น ๋๊ธ ์์ฑ์ ๋ํ ์๋ฆผ์ ๋ฐ์ ์์ ์๋ค์ ์กฐํํฉ๋๋ค.
- ์กฐํ๋ ์์ ์๋ค์๊ฒ ์๋ฆผ์ ์์ฑํ๊ณ , ์ถ๊ฐ์ ์ผ๋ก ํธ์ ์๋ฆผ๋ ๋ฐ๋ ์์ ์๋ค์๊ฒ ํธ์ ์๋ฆผ๋ Publishํฉ๋๋ค.
- JPA + MySQL setting ์ฐธ๊ณ - https://victorydntmd.tistory.com/321
- Spring ๋ฐฐํฌ ์ resources/ ๊ฒฝ๋ก์ ํ์ผ์ ์ฐพ๊ธฐ ํ๋ ๊ฒฝ์ฐ
- ClassPath๋ฅผ ์ด์ฉํด์ผ ์๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๊ธฐ๊ฐ ํธํ๋ฐ... Jar๋ก ๋น๋ํ ๋ค credential๋ค์ ์ธ๋ถ์์ ์ถ๊ฐํ๋ ค๋ค๋ณด๋ ๋ก์ปฌ์์ ClassPath๋ฅผ ์ฌ์ฉํ๊ณ , ๋ฐฐํฌ ์์๋ ์ ๋ ๊ฒฝ๋ก๋ฅผ ์ค์ ํด ์ ๋ ๊ฒฝ๋ก๋ฅผ ์ด์ฉํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ ์ค์ ๋๋ค.
- Jar ๋น๋ ์์ ์กด์ฌํ๋ ํ์ผ๋ค์ jar๋ก ๋ฐฐํฌ, ์คํ ์์๋ ClassPath๋ก๋ ์ฌ๋ฐ๋ฅด๊ฒ ์ฐพ์ ์ ์์ต๋๋ค.
ํ์ฌ๋ AWS์ SNS
+ SQS
๋ฅผ ๋ฉ์์ง ๋ธ๋ก์ปค๋ก ํด์ ๋ง์ดํฌ๋ก์๋น์ค๋ค์ด ๋น๋๊ธฐ์ ์ผ๋ก ์์
ํ์ง๋ง ๊ธฐ์กด์๋ Redis์ Pub/Sub์ ์ด์ฉํด ๋ฉ์์ง๋ฅผ ์ ๋ฌํ์ต๋๋ค. ํ์ง๋ง ์ฌ์ฉํ๋ฉด์ ๋ฉ์์ง ๋ธ๋ก์ปค๋ก์์ Redis์ ๋ํด ๋ช ๊ฐ์ง ๋ฌธ์ ์ ์ ๋๋ผ๊ฒ ๋๊ณ ํ์ฌ๋๋ก AWS์ SNS์ SQS๋ฅผ ๋์
ํ๊ฒ ๋์์ต๋๋ค.
-
Consumer group ๊ฐ์ ๊ฐ๋ ์ด ์กด์ฌํ์ง ์๋๋ค.
๋ง์ฝ ํน์ topic์ ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๊ตฌ๋ ํ๋ค๋ฉด ๊ตฌ๋ ์ค์ธ ๋ชจ๋ ํ๋ก์ธ์ค์๊ฒ ๋ฉ์์ง๊ฐ Publish๋๋ ๋จ์ ์ด ์กด์ฌํ์ต๋๋ค.
-
Subscriber๊ฐ ๋์ํ์ง ์๋ ๊ฒฝ์ฐ ๋ฉ์์ง๋ ์ ์ค๋๋ค.
๋ฉ์์ง ํ ์๋น์ค๋ค์ ์ผ๋ฐ์ ์ผ๋ก ๊ตฌ๋ ์๊ฐ ๋์ํ์ง ์์ผ๋ฉด ๋ฉ์์ง ํ์์ ๋ณด๊ดํ๊ณ ์๋ ๋ฐ๋ฉด Redis๋ ๋จ์ํ ๋ฐ๋ก ๋ฐ๋ก Pushํ๋ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์ ํด๋น ์์ ์ ๊ตฌ๋ ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ์ง ์์ผ๋ฉด ๋ฉ์์ง๊ฐ ์ ์ค๋ ์ ๋ฐ์ ์์ต๋๋ค. ์ฌ์ค Redis๋ ๋ฉ์์ง "ํ"๋ผ๊ณ ๋ณผ ์๋ ์๊ธด ํฉ๋๋ค.
ํ์ํ ๊ฒฝ์ฐ ๋ฉ์์ง ๋ธ๋ก์ปค์๊ฒ ๋ค๋ฅธ ๋ง์ดํฌ๋ก์๋น์ค๋ค์ ์ด๋ฒคํธ๋ฅผ ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ replicate(๋ณต์ )ํด alimi DB์ ๋ฐ์ํฉ๋๋ค. ์ด๋ ํ์ํ field๋ง ์ ์ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ค์ DB์ ๋ฎ์ ์์กด์ฑ์ ์ ์งํ ์ ์์ต๋๋ค.
๋ํ ๋ถํ์ํ ์ฐธ์กฐ ๊ด๊ณ๋ฅผ ์์ฐ์ผ๋ก์จ ํ ์คํธ๋ ๋ฐ์ดํฐ ๊ตฌ์ฑ์ ์ข ๋ ์ฝ๊ฒ ํ ์ ์์ต๋๋ค.
-
๋ฉ์์ง ์๋น์ค๋ฅผ ์ด์ฉํด ๋น๋๊ธฐ์ ์ผ๋ก ์์ ํ๋ฉฐ ๋ง์ดํฌ๋ก์๋น์ค๋ค๊ณผ ๋์จํ๊ฒ ๊ฒฐํฉํฉ๋๋ค. ๋ฉ์์ง ์๋น์ค๋ AWS์
SNS
์SQS
๋ฅผ ์กฐํฉํด ์ด์ฉ ์ค์ ๋๋ค.e.g. ๋๊ธ ์์ฑ์ ๋ํ ์๋ฆผ ์์
- ๋๊ธ ์์ฑ ์ด๋ฒคํธ๋ฅผ SNS์๊ฒ Publishํฉ๋๋ค.
- SNS๋ ์์ ์ ๊ตฌ๋ ์๋ค์๊ฒ ๋ฉ์์ง๋ฅผ ์ ๋ฌํฉ๋๋ค. ์ด๋ alimi๋ฅผ ์ํ SQS์๋ ๋ฉ์์ง๊ฐ ์ ๋ฌ๋ฉ๋๋ค.
- alimi๋ SQS์์ ๋๊ธ ์์ฑ ์ด๋ฒคํธ ๋ฉ์์ง๋ฅผ ๊ฐ์ ธ์ ํด๋น ๋๊ธ ์์ฑ์ ๋ํ ์๋ฆผ์ ๋ฐ์ ์์ ์๋ค์ ์กฐํํฉ๋๋ค.
- ์กฐํ๋ ์์ ์๋ค์๊ฒ ์๋ฆผ์ ์์ฑํ๊ณ , ์ถ๊ฐ์ ์ผ๋ก ํธ์ ์๋ฆผ๋ ๋ฐ๋ ์์ ์๋ค์๊ฒ ํธ์ ์๋ฆผ๋ 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 ๋ฑ์ผ๋ก ์์ฑํ ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
- Test๊ด๋ จ ์ฌ๋ฌ Anootations - https://goddaehee.tistory.com/211
- Mock vs Spy - https://stackoverflow.com/questions/28295625/mockito-spy-vs-mock