์ธ๋ถ ํด ๋ณ๊ฒฝ์ ํ๋๋ฆฌ์ง ์๋ ์๋ฒ ์ฝ๋ ์์ฑ๊ธฐ
์ธ๋ถ ํด ๋ณ๊ฒฝ์ ํ๋๋ฆฌ์ง ์๋ ์๋ฒ ์ฝ๋ ์์ฑ๊ธฐ ๊ด๋ จ
์๋ ํ์ธ์. ๊ฐ๋จ์ธ๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์ Joon์ ๋๋ค. ์ ๋ ๊ฐ๋จ์ธ๋ ์ ์ ๋ค์๊ฒ ๋ ๋ง์ ๊ฐ์น๋ฅผ ์ง์์ ์ผ๋ก ์ ๋ฌํ ์ ์๋ ๊ตฌ์กฐ, ์ฆ ์ง์ ์ฑ์ฅ์ด ๊ฐ๋ฅํ ๊ตฌ์กฐ์ ๊ด์ฌ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ต๊ทผ ์ ๊ฐ ๊ฒฝํํ ์ง์ ์ฑ์ฅ ๊ฐ๋ฅํ ์ํํธ์จ์ด ๊ตฌ์กฐ ์ค๊ณ ๊ฒฝํ์ ๊ณต์ ํ๊ณ ์ ๊ธ์ ์๋๋ค.
์ง์ ์ฑ์ฅ์ด ๊ฐ๋ฅํ ๊ตฌ์กฐ๋ ๋ฌด์์ผ๊น์? ์ฐ๋ฆฌ๊ฐ ๊ฐ๋ฐํ๋ ์ํํธ์จ์ด๋ ๋ณ๊ฒฝ์ด ๋งค์ฐ ์ฆ์ต๋๋ค. ์๊ตฌ ์ฌํญ์ด ๋ฐ๋ ๋๋ง๋ค ์ฝ๋์ ํฐ ๋ณ๊ฒฝ์ด ํ์ํ ์ํํธ์จ์ด๋ ์ง์ ์ฑ์ฅ์ด ์ด๋ ค์ธ ๊ฒ๋๋ค. ์ฆ, ์ฌ๋ฌ ์๊ตฌ ์ฌํญ ๋ณ๊ฒฝ์๋ ์ฝ๊ฒ ์ ์ํ ์ ์๋ ๊ตฌ์กฐ๊ฐ ์ง์ ์ฑ์ฅ ๊ฐ๋ฅํ ๊ตฌ์กฐ์ผ ๊ฒ์ ๋๋ค.
์ต๊ทผ ๊ฐ๋จ์ธ๋์์๋ Braze๋ผ๋ ์ธ๋ถ ํด์ ๋์ ํ ๋์ฆ๊ฐ ์๊ฒผ์ต๋๋ค. ์ธ๋ถ ํด์ ๋ด๋ถ ๋๋ฉ์ธ์ ๋นํด ํจ์ฌ ๋ ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ๋๊ณ , ๊ทธ ๋ณ๊ฒฝ์ ์ ์์ธกํ๊ธฐ๋ ์ด๋ ต์ต๋๋ค. ์ฌ์ง์ด๋ ์์ ๋ค๋ฅธ ์ธ๋ถ ํด์ ์ฌ์ฉํ๊ฒ ๋ค๋ ์์ฌ ๊ฒฐ์ ์ด ์์ ์๋ ์์ต๋๋ค. ๊ทธ๋์ Braze ๊ด๋ จ ๋ณ๊ฒฝ์ ์ด ์๊ธฐ๋๋ผ๋ ๋ด๋ถ ํต์ฌ ๋๋ฉ์ธ ๋ชจ๋ธ์ ์ํฅ ๋ฐ์ง ์๋๋ก ์ค๊ณํด์ผ ํ์ต๋๋ค. ์ฆ, ๋ด๋ถ ๋๋ฉ์ธ ๋ชจ๋ธ์ด ์ธ๋ถ ํด ๊ด๋ จ ์ฝ๋์ ์์กดํ์ง ์๋๋ก ํ๋๋ฐ ์ง์คํ์ต๋๋ค.
์์ ์ค ์ฌ๋ฌ ๋ฒ์ ์ค๊ณ ์์ ์ด ์์๊ณ , ๊ฐ ์ค๊ณ ๋จ๊ณ์์ ์ง์ ์ฑ์ฅ ๊ฐ๋ฅํ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ด๋ค ๊ณ ๋ฏผ์ ํ๋์ง๋ฅผ ์๊ฐํ๊ฒ ์ต๋๋ค. ์ง์ ์ฑ์ฅ์ด ๊ฐ๋ฅํ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ ์ ๊ฒฝ ์ธ ๊ฒ์ด ๋งค์ฐ ๋ง์ ํ ๋ฐ, ์ด ๊ธ์์๋ ๊ทธ ์ค์์๋ ์ธ๋ถ ํด์ ์์กดํ์ง ์๋ ๋ด๋ถ ๋๋ฉ์ธ ๋ชจ๋ธ์ ๋ง๋๋ ๊ฒ์ ์ง์คํ๋ ค ํฉ๋๋ค.
Backgrounds
๊ฐ ์ค๊ณ ๋จ๊ณ๋ฅผ ์ดํด ๋ณด๊ธฐ์ ์์ ์์ ๋ฐฐ๊ฒฝ์ ๋จผ์ ์๊ฐํ๊ฒ ์ต๋๋ค. Braze๋ ๋ฌด์์ด๊ณ ์ ๋์ ํ๋ ค๊ณ ํ๋์ง, ์ด๋ค ์๊ตฌ ์ฌํญ์ด ์์๋์ง, ๊ฐ๋จ์ธ๋ API ์๋ฒ๋ ์ด๋ค ์ํ์ธ์ง๋ฅผ ํ์ธํ๊ฒ ์ต๋๋ค.
Braze
๊ฐ๋จ์ธ๋์์๋ ์๋ด ์ ์ฒญ์ด ์๋ฃ๋์๋ค๋ ์๋ฆผ, ๊ฒ์๊ธ์ ๋ต๊ธ์ด ๋ฌ๋ ธ๋ค๋ ์๋ฆผ, ์ด๋ฒคํธ ๊ด๊ณ ๋ฑ ๋ค์ํ ์ ๋ณด๋ฅผ ์ด๋ฉ์ผ, SMS, ํธ์ ๋ฑ์ ์ด์ฉํด ์ ์ ์๊ฒ ๋ฐ์กํ๊ณ ์์ต๋๋ค. ๊ธฐ์กด์๋ ์ด๋ฌํ ์ฑ ์ธ๋ถ ์ ๋ณด ์ ๋ฌ์ ๊ฐ๋จ์ธ๋ ์๋น์ค ๋ด์์ ์์ฒด์ ์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์์์ผ๋, ์ ์ ๋ค์ด ์ํ๋ ์ปจํ ์ธ ๋ฅผ ๋ ์ฝ๊ฒ ์ ๊ณตํ๊ธฐ ์ํด Braze๋ผ๋ ์ธ๋ถ ํด์ ์ด์ฉํ๊ฒ ๋์์ต๋๋ค.
Braze๋ฅผ ์ด์ฉํ๋ฉด ๋ณดํก์ค ์ด๋ฒคํธ๋ฅผ ๋ง์ด ์ฐพ์ ๋ณธ ์ ์ ๋ค์๊ฒ ์ต๊ทผ ์ผ์ฃผ์ผ ๋์ ๊ฐ์ฅ ๋ง์ ์ ์ ๊ฐ ํ์ธํ ๋ณดํก์ค ์ด๋ฒคํธ๋ฅผ ํธ์๋ก ๋ฐ์กํ๋ ๋ฑ, ์ ์ ๋ค์ ๊ด์ฌ์ฌ์ ๋ง๋ ์ปจํ ์ธ ๋ฅผ ์ฝ๊ฒ ์ ๊ณตํ ์ ์์ต๋๋ค.
Braze ๋์ ๊ด๋ จ ์๊ตฌ์ฌํญ
Braze ๋์ ๊ณผ ๊ด๋ จํด์ ๋ ๊ฐ์ง ์ฃผ์ ์๊ตฌ ์ฌํญ์ด ์์์ต๋๋ค.
์ ์ ์ ์ ๋ณด ์์ ๋์ ์ฌ๋ถ๋ฅผ Braze์ ๋๊ธฐํ ํ ๊ฒ.
Braze๋ฅผ ์ด์ฉํด ์ ์ ๋ค์๊ฒ ์ ๋ณด๋ฅผ ๋ฐ์กํ๊ธฐ ์ํด์๋ ์ ์ ๋ค์ด ์ ๋ณด ์์ ์ ๋์ํ๋์ง๋ฅผ ํ์ธํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ Braze์ ๊ฐ ์ ์ ์ ์ ๋ณด ์์ ๋์ ์ฌ๋ถ๋ฅผ ์ต์ ๋ฒ์ ์ผ๋ก ์ ์ฅํด์ผ ํฉ๋๋ค. ์๋ฒ ๋จ์์ ํ์ํ ์์ ์ ์ ์ ์ ์๋ ์ธ ๊ฐ์ง ์ ๋ณด ์์ ๋์ ์ฌ๋ถ๊ฐ ์์ ๋๋ฉด ์ด๋ฅผ Braze์๋ ๋๊ธฐํํ๋ ๊ฒ์ ๋๋ค.
- ๊ด๊ณ ์ฑ ํธ์ ์์ ๋์ ์ฌ๋ถ
- SMS ์์ ๋์ ์ฌ๋ถ
- Email ์์ ๋์ ์ฌ๋ถ
Braze ๊ณผ๊ธ ์ ์ฑ ์ ๋ฐ๋ผ ๋น์ฉ์ ์ต์ํ ํ ๊ฒ.
Braze๋ ์ ๋ฐ์ดํธ๊ฐ ์์ฒญ๋ ํ๋ ์์ ๋น๋กํด ๊ณผ๊ธํ๋ ์ ์ฑ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ค์ ์ ๋ฐ์ดํธ๊ฐ ๋ฐ์ํ๋ ํ๋ ์๊ฐ ์๋ ์ ๋ฐ์ดํธ๊ฐ ์์ฒญ๋ ํ๋ ์์ ๋น๋กํด ๋น์ฉ์ด ๋ฐ์ํ๋ฏ๋ก, ์ ๋ง ์ ๋ฐ์ดํธ๊ฐ ํ์ํ ํ๋๋ง ๊ณจ๋ผ๋ด์ด Braze์ ์ ๋ฐ์ดํธ๋ฅผ ์์ฒญํด์ผ ํฉ๋๋ค.
๊ฐ๋จ์ธ๋ API ์๋ฒ
๊ฐ๋จ์ธ๋ ๋ฐฑ์๋์๋ ๊ตฌ API ์๋ฒ(์ดํ ๊ตฌ์๋ฒ)์ ์ API ์๋ฒ(์ดํ ์ ์๋ฒ)๊ฐ ๋์์ ๋์ํ๊ณ ์์ต๋๋ค. ํ์ฌ ์๋ก ๋ง๋ค์ด์ง๋ ๋๋ฉ์ธ ๋ชจ๋ธ์ ์ ์๋ฒ์ ์์ฑํ๊ณ ์์ผ๋ฉฐ, ์ ์ ์ ๊ฐ์ด ์ค๋๋ ๋๋ฉ์ธ ๋ชจ๋ธ์ ๊ตฌ์๋ฒ์ ์์ฑ๋์ด ์์ต๋๋ค.
Braze ํ์ฉ์ ํ์ํ ์ ์ ๊ด๋ จ ์ฝ๋๋ ๊ตฌ์๋ฒ์ ์์ฑ๋์ด ์๊ณ , Braze์ ๊ด๋ จํด์ ์๋ก ์์ฑํ๋ ์ฝ๋๋ค์ ์ ์๋ฒ์ ์์ฑ๋๋ค๋ ์ ์ ์ฃผ๋ชฉํด ์ฃผ์ธ์.
Design
์ด์ ๊ฐ ์ค๊ณ ๋จ๊ณ๋ฅผ ์ดํด ๋ณด๊ฒ ์ต๋๋ค. ์ค๊ณ์๋ ํฌ๊ฒ ๋ ๋ฒ์ ๋ณ๊ฒฝ์ด ์์์ต๋๋ค. ๊ฐ ๋จ๊ณ๋ฅผ Design V1 ~ V3๋ก ๋ผ๋ฒจ๋ง, ์๋ ๋ด์ฉ๋ค์ ๊ฐ ๋จ๊ณ๋ณ๋ก ์์ ํ๊ฒ ์ต๋๋ค.
- ์ด๋ป๊ฒ ๋์ํ๋๊ฐ?
- ์ ์ด๋ ๊ฒ ์ค๊ณํ๋๊ฐ?
- ์ง์ ์ฑ์ฅ์ด ๊ฐ๋ฅํ ๊ตฌ์กฐ์ธ๊ฐ?
๊ฐ ๋จ๊ณ๋ณ ๋ค์ด์ด๊ทธ๋จ์ ๋ฐ์ดํฐ ํ๋ฆ, ํน์ ํ๋ก๊ทธ๋จ ์ปจํธ๋กค์ ํ๋ฆ์ ํํํ ๊ฒ์ผ๋ก, '์ด๋ป๊ฒ ๋์ํ๋๊ฐ?'์ ํจ๊ป ๋ณด์๋ ๊ฒ์ ๊ถ์ฅ ๋๋ฆฝ๋๋ค.
Design V1
Braze์ ๋๊ธฐํํ ์ ์ ์ ์ ๋ณด๋ค์ ๊ตฌ์๋ฒ์ ์์ผ๋ฉฐ, ๊ตฌ์๋ฒ API ๋์ ์ค์ ๊ฐ์ด ๋ณ๊ฒฝ๋ฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด, ์ ์ ๊ฐ ํ์ ์ ๋ณด๋ฅผ ์์ ํ๋ฉด ๊ตฌ์๋ฒ์ ์๋ ํ์ ์ ๋ณด ์์ API๊ฐ ํธ์ถ๋ ๊ฒ์ ๋๋ค. ์ด ๋ ์ ์ ์ ์ ๋ณด ์์ ๋์ ์ฌ๋ถ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์ ์๋ฒ์ ์๋ Braze ๊ด๋ จ ์ฝ๋๊ฐ ๋์, Braze์ ์ ๋ณด ์์ ๋์ ์ฌ๋ถ๋ฅผ ์์ ํ๋๋ก ์์ฒญํด์ผ ํฉ๋๋ค.
์ด๋ป๊ฒ ๋์ํ๋๊ฐ?
- ๊ตฌ์๋ฒ์์ ์ ์ ์ ์ ๋ณด ์์ ๋์ ์ฌ๋ถ๊ฐ ๋ณ๊ฒฝ๋๋ฉด Internal Event๋ฅผ ๋ฐํํฉ๋๋ค.
- Event Handler๊ฐ Internal Event๋ฅผ ์์ , AWS SNS๋ก ๋ฉ์์ง๋ฅผ ์ ๋ฌํฉ๋๋ค.
- SNS๋ฅผ ๊ตฌ๋ ํ๊ณ ์๋ SQS๋ก ๋ฉ์์ง๊ฐ ์ ์ฌ๋ฉ๋๋ค.
- ์ ์๋ฒ์ SQS Listener๊ฐ ๋ฉ์์ง๋ฅผ ์์ , Braze API caller method๋ฅผ ํธ์ถํฉ๋๋ค.
- Braze API caller๊ฐ Braze API๋ฅผ ํธ์ถํด ์ ์ ์ ์ ๋ณด ์์ ๋์ ์ฌ๋ถ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
์ ์ด๋ ๊ฒ ์ค๊ณํ๋๊ฐ?
Design V1์์ ์ง์คํ ๋ถ๋ถ์ ์๋์ ๊ฐ์ต๋๋ค.
1. ๊ตฌ์๋ฒ์ ๋์์ด ์ ์๋ฒ์ Braze์ ํต์ ์ ์ํฅ์ ๋ฐ์ง ์๋๋ก ํ๊ธฐ ์ํด, ๊ตฌ์๋ฒ์ ์ ์๋ฒ์ ํต์ ์ ๋น๋๊ธฐ๋ก ํฉ๋๋ค.
๋ง์ฝ ๊ตฌ์๋ฒ์ ์ ์๋ฒ์ ํต์ ์ด ๋น๋๊ธฐ ๋ฐฉ์์ด ์๋๋ผ๋ฉด, ์ ์๋ฒ์ Braze์ ํต์ ์ค ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ฑฐ๋ Braze๊ฐ ์ ์๋ฒ๋ก ๋ฐํํ๋ ์๋ต์ด ์ง์ฐ๋๋ ๊ฒฝ์ฐ ๊ตฌ์๋ฒ์ ํ์ ์ ๋ณด ์์ API๋ ์ํฅ์ ๋ฐ์ต๋๋ค. ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ ์ค Amazon AWS SQS๋ฅผ ์ฌ์ฉํด ๊ตฌ์๋ฒ์ ์ ์๋ฒ์ ํต์ ์ ๋น๋๊ธฐ๋ก ๋ง๋ค์์ต๋๋ค.
2. Braze ๋น์ฉ์ ์ต์ํํ๊ธฐ ์ํด ๊ฐ ์ ๋ณด ์์ ๋์ ์ฌ๋ถ ๋ณ๊ฒฝ์ ๋ฐ๋ก ํธ๋ํนํฉ๋๋ค.
์ ๋ง ๋ณ๊ฒฝ์ด ๋ฐ์ํ ์ ๋ณด ์์ ๋์ ์ฌ๋ถ ํ๋๋ง Braze์ ๋๊ธฐํํ๊ธฐ ์ํด, ๊ฐ ์ ๋ณด ์์ ๋์ ํ๋๋ง๋ค SQS๋ฅผ ํ๋์ฉ ์ด์ํฉ๋๋ค.
์ง์ ์ฑ์ฅ์ด ๊ฐ๋ฅํ ๊ตฌ์กฐ์ธ๊ฐ?
Design V1์ ์ง์ ์ฑ์ฅ์ด ๊ฐ๋ฅํ์ง ์์ ๊ตฌ์กฐ์ ๋๋ค.
1. ์ธ๋ป ๋ณด๋ฉด ๊ตฌ์๋ฒ๋ Braze ์ปจํ ์คํธ์ ์์ ํ ๋ถ๋ฆฌ๋์ด ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ฌ์ค์ ๊ทธ๋ ์ง ์์ต๋๋ค.
Update ํ๋ ์ ๋น๋ก ๊ณผ๊ธ ์ฒด๊ณ๋ Braze-specificํฉ๋๋ค. ์ฆ, ๋น์ฉ ์ต์ ํ๋ฅผ ์ํด ํ๋๋ณ๋ก SQS๋ฅผ ๋๊ณ ๊ฐ SQS์ ๋ฉ์์ง๋ฅผ ๋๋์ด ๋ฐํํ๋ ๊ฒ์ Braze ์ปจํ ์คํธ์ ์ํฅ ๋ฐ์ ์ค๊ณ์ ๋๋ค. Braze๊ฐ ์๋ ๋ค๋ฅธ ํด์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ๊ตฌ์๋ฒ๊น์ง ์์ ํด์ผ ํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
2. ์ ์๋ฒ์ ์์ฑํ module(braze module
)์ด ์ถฉ๋ถํ ์์ ๋จ์๋ก ๊ตฌ์ฑ๋์ง ์์์ต๋๋ค.
SQS Listener๋ ์ธ๋ถ๋ก๋ถํฐ ์จ ์์ฒญ์ ๋ฐ์๋ด๋ ์ธํฐํ์ด์ค์
๋๋ค. ์ ์ ์ ์ ๋ณด ์์ ๋์ ์ฌ๋ถ๊ฐ ๋ณ๊ฒฝ๋๋ฉด Braze์ ์ด๋ฅผ ์๋ฆฌ๋ ๊ฒ์ ๋น์ฆ๋์ค ๋ก์ง์
๋๋ค. ํ์ฌ ์์ ๋ค๋ฅธ ์ญํ ์ ํ๋ ๋ ๊ฐ์ฒด๊ฐ ํ layer์ ๋ญ์ณ ์์ด, Braze ๊ด๋ จ ๋ณ๊ฒฝ์ ์ด ์๊ธฐ๋ฉด braze module
์ ํต์งธ๋ก ์์ ํด์ผ ํฉ๋๋ค.
Design V2
Design V1์ ๋ฌธ์ ์ ์ ์์ ํ์ฌ Design V2๋ฅผ ๋ง๋ญ๋๋ค.
์ด๋ป๊ฒ ๋์ํ๋๊ฐ?
- ๊ตฌ์๋ฒ์์ ์ ์ ์ ์ ๋ณด ์์ ๋์ ์ฌ๋ถ๊ฐ ๋ณ๊ฒฝ๋๋ฉด Internal Event๋ฅผ ๋ฐํํฉ๋๋ค.
- Event Handler๊ฐ Internal Event๋ฅผ ์์ , AWS SNS๋ก ๋ฉ์์ง๋ฅผ ์ ๋ฌํฉ๋๋ค.
- SNS๋ฅผ ๊ตฌ๋ ํ๊ณ ์๋ SQS๋ก ๋ฉ์์ง๊ฐ ์ ์ฌ๋ฉ๋๋ค.
- SQS๋ฅผ ๊ตฌ๋ ํ๊ณ ์๋ SQS Listener๊ฐ ๋ฉ์์ง๋ฅผ ์์ , Logic(service)์ ์ ๋ฌํฉ๋๋ค.
- Logic์ด ์ค์ ๋ณ๊ฒฝ์ด ๋ฐ์ํ ํ๋๋ฅผ ๊ตฌ๋ณ, ํด๋น ํ๋๋ฅผ ์ ๋ฐ์ดํธํ๋ Braze API caller method๋ฅผ ํธ์ถํฉ๋๋ค.
- Braze API caller๊ฐ Braze API๋ฅผ ํธ์ถํด ์ ์ ์ ์ ๋ณด ์์ ๋์ ์ฌ๋ถ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
์ ์ด๋ ๊ฒ ์ค๊ณํ๋๊ฐ?
Design V1์ ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง ํ์ธํ๊ฒ ์ต๋๋ค.
์ธ๋ป ๋ณด๋ฉด ๊ตฌ์๋ฒ๋ Braze ์ปจํ ์คํธ์ ์์ ํ ๋ถ๋ฆฌ๋์ด ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ฌ์ค์ ๊ทธ๋ ์ง ์์ต๋๋ค.
Update ํ๋ ์ ๋น๋ก ๊ณผ๊ธ ์ฒด๊ณ๋ Braze-specificํฉ๋๋ค. ์ฆ, ์ต์ ํ๋ฅผ ์ํด ํ๋๋ณ๋ก SQS๋ฅผ ๋๊ณ ๊ฐ SQS์ SNS๋ฅผ ๋๋์ด ๋ฐํํ๋ ๊ฒ์ Braze์ ์ํฅ ๋ฐ์ ์ค๊ณ์ ๋๋ค. Braze๊ฐ ์๋ ๋ค๋ฅธ ํด์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์์ ํด์ผ ํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
๊ตฌ์๋ฒ์์ Braze ์ปจํ ์คํธ๋ฅผ ๋ผ์ด ๋ด๊ธฐ ์ํด ์ ์ ์ ์ ๋ณด ์์ ๋์ ์ฌ๋ถ ๋ณ๊ฒฝ SNS๋ฅผ ๊ตฌ๋ ํ๋ SQS๋ฅผ ํ๋๋ก ๋๊ณ , ์ด๋ค ์ ๋ณด ์์ ๋์ ์ฌ๋ถ๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ Internal Event Handler๊ฐ Braze ์ปจํ ์คํธ์ ๋ ๋ฆฝ๋ ํ๋์ ๋ฉ์์ง๋ฅผ SNS์ ์ ๋ฌํ๋๋ก ํฉ๋๋ค.
์ ๋ง ์ ๋ฐ์ดํธ๊ฐ ํ์ํ ์ ๋ณด ์์ ๋์ ์ฌ๋ถ ํ๋๋ฅผ ๊ตฌ๋ณํ๋ ์ฝ๋๋ ์ ์๋ฒ์ ์์ฑ๋์ด, ๊ตฌ์๋ฒ์๋ ๋ ์ด์ Braze ์ปจํ ์คํธ๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค. Braze๊ฐ ์๋ ๋ค๋ฅธ ํด์ ์ฌ์ฉํ๋๋ผ๋ ์ ์ ๊ฐ ์ ๋ณด ์์ ์ ๋์ํ๋์ง ์ฌ๋ถ๋ ํธ๋ํนํด์ผ ํ ๊ฒ์ด๋ฏ๋ก, ๋ค๋ฅธ ํด์ ์ฌ์ฉํ๊ฒ ๋์์ ๋ ๊ตฌ์๋ฒ์ ์๋ ์ฝ๋๋ ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์ต๋๋ค.
์ ์๋ฒ์ ์์ฑํ module(
braze module
)์ด ์ถฉ๋ถํ ์์ ๋จ์๋ก ๊ตฌ์ฑ๋์ง ์์์ต๋๋ค.SQS Listener๋ ์ธ๋ถ๋ก๋ถํฐ ์จ ์์ฒญ์ ๋ฐ์๋ด๋ ์ธํฐํ์ด์ค์ ๋๋ค. ์ ์ ์ ์ ๋ณด ์์ ๋์ ์ฌ๋ถ๊ฐ ๋ณ๊ฒฝ๋๋ฉด Braze์ ์ด๋ฅผ ์๋ฆฌ๋ ๊ฒ์ ๋น์ฆ๋์ค ๋ก์ง์ ๋๋ค. ํ์ฌ ์์ ๋ค๋ฅธ ์ญํ ์ ํ๋ ๋ ๊ฐ์ฒด๊ฐ ํ layer์ ๋ญ์ณ ์์ด, Braze ๊ด๋ จ ๋ณ๊ฒฝ์ ์ด ์๊ธฐ๋ฉด
braze module
์ ํต์งธ๋ก ์์ ํด์ผ ํฉ๋๋ค.
์ ์๋ฒ์ module๋ ์ญํ ์ ๋ฐ๋ผ ๋ ์ธ๋ถํํฉ๋๋ค. ์ธ๋ถ์์ ์ธํฐํ์ด์ค ์ญํ ์ ํ๋ SQS Listener๋ฅผ api module
์, ์ค์ ์
๋ฐ์ดํธ๊ฐ ๋ฐ์ํด Braze์ notify ํด์ผ ํ ํ๋๊ฐ ๋ฌด์์ธ์ง๋ฅผ ๊ตฌ๋ณํ๋ ๋ก์ง์ logic module
์, Braze์ ํต์ ํ๋ ๋ถ๋ถ์ braze module
์ ๋ก๋๋ค.
์ง์ ์ฑ์ฅ์ด ๊ฐ๋ฅํ ๊ตฌ์กฐ์ธ๊ฐ?
Design V2 ์ญ์ ์ง์ ์ฑ์ฅ์ด ๊ฐ๋ฅํ์ง ์์ ๊ตฌ์กฐ์ ๋๋ค.
1. ์ฌ์ ํ ์ ์๋ฒ์ ์์ฑํ module๋ค์ ์๊ตฌ ์ฌํญ ๋ณ๊ฒฝ์ ์ฝํ ๊ตฌ์กฐ์ ๋๋ค.
์์ ๋ง์๋๋ ธ๋ฏ์ด Braze์ ๊ฐ์ ์ธ๋ถ ํด ๊ด๋ จ ์ฝ๋๋ ๋ด๋ถ ๋๋ฉ์ธ ๋ชจ๋ธ์ ๋นํด ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. Braze ๋์ ๋ค๋ฅธ ์ธ๋ถ ํด์ ์ฌ์ฉํ๊ฒ ๋ค๋ ๋น์ฆ๋์ค ์์ฌ ๊ฒฐ์ ์ ์ ์ , ๊ณ์ ๋ฑ ๋ด๋ถ ๋๋ฉ์ธ ๋ชจ๋ธ์ ์๋ก ๋ง๋ค์ด์ผ ํ๋ค๋ ์์ฌ ๊ฒฐ์ ๋ณด๋ค ๋ ์ผ์ด๋จ์ง ํฉ๋๋ค.
public class MemberConsentLogic {
private final BrazeMemberConsentNotifier notifier;
public MemberConsentLogic(BrazeMemberConsentNotifier notifier) {
this.notifier = notifier;
}
public void notify(MemberConsents memberConsents) {
if (Objects.nonNull(memberConsents.getAgreeAdvtsPush()) {
notifier.notifyAgreeAdvtsPush(memberConsents.getAgreeAdvtsPush());
}
if (Objects.nonNull(memberConsents.getAgreeSms()) {
notifier.notifyAgreeSms(memberConsents.getAgreeSms());
}
if (Objects.nonNull(memberConsents.getAgreeEmail()) {
notifier.notifyAgreeEmail(memberConsents.getAgreeEmail());
}
}
}
ํ์ฌ๋ Logic์ด Braze Notifier์ ์์กดํ๊ณ ์๋๋ฐ, ๋ฐ๋ผ์ Braze ๋์ ๋ค๋ฅธ ์ธ๋ถ ํด์ ์ฌ์ฉํ๊ฒ ๋๋ฉด Logic์ ์์ ํด์ผ ํฉ๋๋ค. ์ฆ, logic module
์ด ์์ ๋์ด์ผ ํฉ๋๋ค.
public class MemberConsentLogic {
private final AnotherToolNotifier notifier;
public MemberConsentLogic(AnotherToolNotifier notifier) {
this.notifier = notifier;
}
public void notify(MemberConsents memberConsents) {
notifier.notify(memberConsents);
}
}
์์ ๊ฐ์ด ๋ก์ง์ ์ฌ์์ฑํด์ผ ํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
Design V3(latest)
Design V2์ ๋ฌธ์ ์ ์ ์์ ํ์ฌ Design V3๋ฅผ ๋ง๋ญ๋๋ค.
์ด๋ป๊ฒ ๋์ํ๋๊ฐ?
- ๊ตฌ์๋ฒ์์ ์ ์ ์ ์ ๋ณด ์์ ๋์ ์ฌ๋ถ๊ฐ ๋ณ๊ฒฝ๋๋ฉด Internal Event๋ฅผ ๋ฐํํฉ๋๋ค.
- Event Handler๊ฐ Internal Event๋ฅผ ์์ , AWS SNS๋ก ๋ฉ์์ง๋ฅผ ์ ๋ฌํฉ๋๋ค.
- SNS๋ฅผ ๊ตฌ๋ ํ๊ณ ์๋ SQS๋ก ๋ฉ์์ง๊ฐ ์ ์ฌ๋ฉ๋๋ค.
- SQS๋ฅผ ๊ตฌ๋ ํ๊ณ ์๋ SQS Listener๊ฐ ๋ฉ์์ง๋ฅผ ์์ , Logic(service)์ ์ ๋ฌํฉ๋๋ค.
- Logic์ Notifier interface method๋ฅผ ํธ์ถํฉ๋๋ค.
- Notifier interface๋ฅผ ๊ตฌํํ๋ Braze Notifier๊ฐ ๋ฉ์์ง๋ฅผ ์์ , ์ค์ ๋ก ๋ณ๊ฒฝ์ด ์ผ์ด๋ ํ๋๋ฅผ ๊ตฌ๋ณํด Braze์ ์ ์ ์ ์ ๋ณด ์์ ๋์ ์ฌ๋ถ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
์ ์ด๋ ๊ฒ ์ค๊ณํ๋๊ฐ?
Design V2์ ๋ฌธ์ ์ ์ ๋ค์ ํ ๋ฒ ์ดํด ๋ณด๊ฒ ์ต๋๋ค.
ํ์ฌ๋
logic module
์ดbraze module
์ ์์กดํ๊ณ ์๋๋ฐ, ๋ฐ๋ผ์ Braze ๋์ ๋ค๋ฅธ ์ธ๋ถ ํด์ ์ฌ์ฉํ๊ฒ ๋๋ฉดlogic module
์ด ์์ ๋์ด์ผ ํฉ๋๋ค.... ๋ก์ง์ ์ฌ์์ฑํด์ผ ํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
Braze ๋์ ๋ค๋ฅธ ์ธ๋ถ ํด์ ์ฌ์ฉํ๊ฒ ๋์์ ๋ braze module
๋ฟ๋ง ์๋๋ผ logic module
์๋ ๋ณ๊ฒฝ์ด ์๊ธฐ๊ฒ ๋๋ ๊ฒ์ด ๋ฌธ์ ์ธ๋ฐ, ์ด๋ logic module
์ด braze module
์ ์์กดํ๊ธฐ ๋๋ฌธ์
๋๋ค.
logic module
์ด ์์กดํ๋ ๋์์ด Braze-specificํ๊ธฐ ๋๋ฌธ์ Braze๋ฅผ ์ฌ์ฉํ์ง ์๊ฒ ๋๋ฉด logic module
์ด ์์ ๋์ด์ผ ํ๋ ๊ฒ์ธ๋ฐ์, ๊ทธ๋ ๋ค๋ฉด Braze๋ฅผ ์ฌ์ฉํ์ง ์๊ฒ ๋์์ ๋ logic module
์ด ์์ ๋์ง ์๋๋ก ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
MemberConsentLogic
์ด ์ด๋ ํ ํด์ ์ํฅ ๋ฐ์ง ์๋ generalํ, ์ถ์์ ์ธ ๊ฒ์ ์์กดํ๋ฉด ๋ฉ๋๋ค. ๋ํ ๊ทธ ์ถ์์ ์ธ ๊ฒ์ ์ค์ ๋ก Braze-specificํ๊ฒ ๊ตฌํํ๋ฉด ๋ฉ๋๋ค. ์ด ๋ ํด์ด ๋ณ๊ฒฝ๋์ด๋ MemberConsentLogic
์ด ์ํฅ์ ๋ฐ์ง ์๋๋ก ํ๊ธฐ ์ํด ๊ทธ ์ถ์์ ์ธ ๊ฒ์ logic module
๋ด๋ถ์ ๋ฐฐ์นํ์์ต๋๋ค. ๋ฐ๋ผ์ logic module
๊ณผ braze module
์ dependency ๋ฐฉํฅ์ด ๋ฐ์ ๋๊ฒ ๋ฉ๋๋ค.
public interface Notifier {
void notify(MemberConsents memberConsents);
}
public class MemberConsentLogic {
private final Notifier notifier;
public MemberConsentLogic(Notifier notifier) {
this.notifier = notifier;
}
public void notify(MemberConsents memberConsents) {
notifier.notify(memberConsents);
}
}
public class BrazeMemberConsentNotifier implements Notifier {
@Override
public void notify(MemberConsents memberConsents) {
if (Objects.nonNull(memberConsents.getAgreeAdvtsPush()) {
notifyAgreeAdvtsPush(memberConsents.getAgreeAdvtsPush());
}
if (Objects.nonNull(memberConsents.getAgreeSms()) {
notifyAgreeSms(memberConsents.getAgreeSms());
}
if (Objects.nonNull(memberConsents.getAgreeEmail()) {
notifyAgreeEmail(memberConsents.getAgreeEmail());
}
}
// ...
}
์ง์ ์ฑ์ฅ์ด ๊ฐ๋ฅํ ๊ตฌ์กฐ์ธ๊ฐ?
Braze๊ฐ ์๋ ๋ค๋ฅธ ํด์ ์ฌ์ฉํ๊ฒ ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
์ด์ braze module
๊ณผ logic module
์ ์์กด ๊ด๊ณ๋ฅผ ๋๊ณ , ์๋ก ์์ฑํ ๋ชจ๋์ด logic module
์ ์์กด, interface๋ฅผ ๊ตฌํํ๋ ์๋ก์ด notifier๋ฅผ ์์ฑํ๋ฉด ๋ฉ๋๋ค. Braze๊ฐ ์๋ ๋ค๋ฅธ ํด์ ์ฌ์ฉํ๋๋ผ๋, logic module
์ ์์ ํ ํ์๊ฐ ์์ต๋๋ค.
์ด์ ๊ฐ๋จ์ธ๋ ๋ด๋ถ ๋๋ฉ์ธ ๋ชจ๋ธ์๋ Braze ๊ด๋ จ ์ปจํ ์คํธ๊ฐ ๋จ์์์ง ์์ต๋๋ค. ์ฒซ ์ค๊ณ์ ๋นํด์๋ ๋ณ๊ฒฝ์ด ํจ์ฌ ์ฉ์ดํ, ์ง์ ์ฑ์ฅ์ด ๊ฐ๋ฅํ ๊ตฌ์กฐ๊ฐ ๋์์ต๋๋ค.
DIP(Dependency Inversion Principle)
์ง๊ธ๊น์ง ๊ฐ๋จ์ธ๋ ์๋ฒ์ ์๋ก์ด ์ธ๋ถ ํด Braze๋ฅผ ๋์ ํ๋ ๊ณผ์ ์ ์ด๋ป๊ฒ ์ง์ ์ฑ์ฅ์ด ๊ฐ๋ฅํ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ง, ํนํ ์ด๋ป๊ฒ ๋ด๋ถ ๋๋ฉ์ธ ๋ชจ๋ธ์ด ์ธ๋ถ ํด์ ์์กดํ์ง ์๋๋ก ํ ์ง ๊ณ ๋ฏผํ ๊ณผ์ ์ ์๊ฐํ์ต๋๋ค.
ํ์ง๋ง ์์์ ๋ณด์ฌ๋๋ฆฐ ์ค๊ณ๋ ์๋กญ๊ฒ ๋ฐ๊ฒฌ๋ ์ด๋ค ๊ฒ์ด ์๋๋๋ค. ์ ์ค๊ณ๋ Uncle Bob(Robert C. Martin)์ด ์๊ฐํ ๊ฐ๋ฐ ์ค๊ณ ์์น์ธ DIP๋ฅผ ์ ์ฉํ ์ฌ๋ก์ ๋๋ค. DIP๊ฐ ๋ฌด์์ธ์ง, ์ด ๊ธ์์ ์๊ฐํ ๊ฐ๋จ์ธ๋์ ์ฌ๋ก์๋ ์ด๋ป๊ฒ DIP๊ฐ ์ ์ฉ๋์๋์ง ๊ฐ๋ตํ ๋ณด์ฌ๋๋ฆฌ๊ณ ๋ง์น๊ฒ ์ต๋๋ค.
DIP์ ์ ์๋ ์๋์ ๊ฐ์ต๋๋ค.
DIP(Dependency Inversion Principle)
High-level module์ low-level module์ ์์กดํ์ง ์์์ผ ํฉ๋๋ค.
High-level module๊ณผ low-level module ๋ชจ๋ abstraction(ex. Java interface)์ ์์กดํด์ผ ํฉ๋๋ค.
Abstraction์ detail์ ์์กดํ์ง ์์์ผ ํฉ๋๋ค. Detail์ด abstraction์ ์์กดํด์ผ ํฉ๋๋ค.
์ฌ๊ธฐ์ module์ Java module์ด ์๋ Java class๋ก, ์๋ ๋ณธ๋ฌธ์์๋ high-level module ๋์ high-level class, low-level module ๋์ low-level class๋ก ํ๊ธฐํ๊ฒ ์ต๋๋ค.
- High-level class๋ low-level class์ ์์กดํ์ง ์์์ผ ํฉ๋๋ค.
- High-level class์ low-level class ๋ชจ๋ abstraction(ex. Java interface)์ ์์กดํด์ผ ํฉ๋๋ค.
- Abstraction์ detail์ ์์กดํ์ง ์์์ผ ํฉ๋๋ค. Detail์ด abstraction์ ์์กดํด์ผ ํฉ๋๋ค.
์ฆ ์ ์ธ ๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด DIP๊ฐ ์ ์ฉ๋๋ ๊ฒ์ธ๋ฐ์, ์ ์กฐ๊ฑด๋ค์ด dependency inversion๊ณผ ๋ฌด์จ ๊ด๊ณ๊ฐ ์์๊น์?
Inversion?
๋จผ์ , ์ญ์ (Inversion)์ด ์๋ค๋ ๊ฒ์ ๋ณดํต์ ๊ฒฝ์ฐ์ ๋ฐ๋๊ฐ ๋๋ค๋ ๊ฒ์ผ๋ก ์ดํดํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์์กด ๊ด๊ณ(Dependency)์ ์ญ์ (Inversion)์ด ์๋ค๋ ๊ฒ์ ๋ณดํต์ ๊ฒฝ์ฐ์ ์์กด ๊ด๊ณ๊ฐ ๋ฐ๋๊ฐ ๋๋ค๋ ๊ฒ์ผ๋ก ์ดํดํ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก high-level class๋ low-level class์ ์์กดํฉ๋๋ค. ์์ ๊ฐ์ด controller class๋ service class์ ์์กด, service class๋ repository class์ ์์กดํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค. Design V2์์๋ ๋ง์ฐฌ๊ฐ์ง๋ก high-level class๊ฐ low-level class์ ์์กดํ๋ ์ค๊ณ๋ฅผ ๋ณด์ฌ ๋๋ ธ์ต๋๋ค.
ํ์ง๋ง Braze ๊ด๋ จ ๋ณ๊ฒฝ์ด braze module
์ ๋์ด logic module
๊น์ง ์ํฅ์ ๋ฏธ์น๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ์ถ์๊ณ , ๋ฐ๋ผ์ MemberConsentLogic
์ด ํด์ ์ํฅ์ ๋ฐ์ง ์๋ ์ถ์์ ์ธ interface์ ์์กดํ๋๋ก ํ์ต๋๋ค. ๊ทธ ๊ณผ์ ์์ logic module
๊ณผ braze module
์ ์์กด ๊ด๊ณ๊ฐ ๋ฐ์ ๋์์ต๋๋ค.
์ฌ๊ธฐ์ ๋น๊ต์ high-level class์ธ MemberConsentLogic
์ ๋น๊ต์ low-level class์ธ BrazeMemberConsentNotifier
์ ์์กดํ์ง ์์ต๋๋ค. ๋น๊ต์ high-level class์ธ MemberConsentLogic
๊ณผ ๋น๊ต์ low-level class์ธ BrazeMemberConsentNotifier
๋ ๋ชจ๋ interface์ ์์กดํฉ๋๋ค. Interface๋ ๋ค๋ฅธ ์ด๋ค detail์ ์์กดํ์ง ์์ต๋๋ค. Braze ๋น์ฉ ์ ๊ฐ์ ์ํ ๋ก์ง ๋ฑ detail์ ๋ชจ๋ interface๊ฐ ์์ง ๋ชปํ๋ฉฐ, detail์ด interface์ ์์กดํ์ฌ ๊ตฌํ๋๊ณ ์์ต๋๋ค.
์ฆ, ๋ด๋ถ ๋๋ฉ์ธ ์ฝ๋๊ฐ Braze ์ปจํ ์คํธ์ ์ค์ผ๋์ง ์๋๋ก ํ ๊ฒฐ๊ณผ, DIP๊ฐ ์ ์ฉ๋์์ต๋๋ค.
๋์ผ๋ก, ๋ง์ ๊ฐ๋ฐ ์ค๊ณ ํจํด, ์์น๋ค๊ณผ ๊ฐ์ด DIP ์ญ์ trade-off๊ฐ ์กด์ฌํฉ๋๋ค. Runtime์์ผ ์์กด ๋์์ด ๊ฒฐ์ ๋์ด ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ด๋ ค์์ง๋ ๋ฑ, DIP๋ฅผ ์ ์ฉํ๋ฉด ๋ณ๊ฒฝ์ ๊ฐํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ผ๋ ๊ทธ๋ ๋ค๊ณ ๋ชจ๋ ์์กด ๊ด๊ณ์ DIP๋ฅผ ์ ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์ ์ข์ง๋ ์์ ๊ฒ์ ๋๋ค. ๋ณ๊ฒฝ์ ์ฌ์ง๊ฐ ๋ง์ง ์์ ์์กด ๊ด๊ณ์ DIP๋ฅผ ์ ์ฉํ๋ ๊ฒ์ ์ค๋ฒ ์์ง๋์ด๋ง์ ๋๋ค.
์ด ๊ธ์์ ์๊ฐํ ์ฌ๋ก ์ญ์ Braze๋ผ๋ ์ธ๋ถ ํด ์ฌ์ฉ ์ฌ๋ถ๋ ์ธ์ ๋ ๋ฐ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๋ณ๊ฒฝ์ ๊ฐํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ๋์ฑ ํ์ํ ๊ฒฝ์ฐ์๋ค๋ ์ ์ ์ฃผ๋ชฉํด ์ฃผ์๋ฉด ์ข๊ฒ ์ต๋๋ค.
์ด์์ผ๋ก ๊ฐ๋จ์ธ๋ ์๋ฒ์ ์๋ก์ด ํด์ ๋์ ํ๋ ๊ณผ์ ์์ ์ง์ ์ฑ์ฅ์ด ๊ฐ๋ฅํ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ด๋ค ๊ณผ์ ์ ๊ฑฐ์ณค๋์ง ์๊ฐ๋ฅผ ๋ง์น๊ฒ ์ต๋๋ค. ์ด๋ป๊ฒ ํ๋ฉด ์ธ๋ถ ํด์ ์ํฅ ๋ฐ์ง ์๋ ๋ด๋ถ ๋๋ฉ์ธ ๋ชจ๋ธ์ ๋ง๋ค ์ ์๋์ง ๊ถ๊ธํ์ ๋ถ๋ค๊ป ๋์์ด ๋๋ฉด ์ข๊ฒ ์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค.