ํ๋ก์ ํธ ์งํ ๊ธฐ๊ฐ
2024.03 - 2024.11
ํ์ ๋ฐ ์ญํ
์ญํ | ์ด๋ฆ | ๋ด๋น |
---|---|---|
ํ์ฅ | ์์ฌํ | Back-end, ์ ์ญ ๊ฐ๋ฐ ํ๊ฒฝ ๋ฐ ์ธํ๋ผ ๊ตฌ์ถ, P2P ๋ฐ ์๊ฒฉ์ ์ด |
ํ์ | ์์คํธ | Back-end, ๊ฐ์ ๊ด๋ จ API, ๋ค๋์ผ ๋ชจ๋ํฐ๋ง ๊ตฌํ |
ํ์ | ์ด์๋น | Back-end, ํ์ ๊ด๋ จ API, ์ธ์ฆ, ๊ฒฐ์ ํ๋ก์ธ์ค ๋ฐ IAMPORT ์ฐ๋ |
ํ์ | ๊นํ์ | Front-end, ๊ต์์์ฉ Web Application |
ํ์ | ์ด์ง๋ฏผ | Front-end, ํ์์ฉ Desktop Application (Web to App) |
Repository
Organization
Core API Server
Event Server
์์ ์ปจ๋ฒค์ ๋ฐ Docs
๊ธฐ๋ณธ ์ฝ๋ ์์ฑ ์ปจ๋ฒค์
์์
์ปจ๋ฒค์
(Git)
๊ณ์ธต๋ณ ๋ชจ๋์ ์ฃผ์ ์ฑ
์ ๋ฐ ๊ณ ๋ คํ ์
ํ
์คํธ ์ฝ๋ ์์ฑ ์ ๋ต
Web RTC ์ฐ๋ํ๊ธฐ
์ฃผ์ ๋ฐ ๋ฌธ์ ์ ์
4์ฐจ ์ฐ์ ์๋๋ฅผ ๋ง์, ์ด๋ฑ ๊ต์ก๊ธฐ๊ด๋ถํฐ ๊ณ ๋ฑ ๊ต์ก๊ธฐ๊ด๊น์ง ์์ธ๋ฌ ์ปดํจํฐ๋ฅผ ํ์ฉํ ์ค์ต ์์ ์ด ์ ์ ํ๋๋๋ ์ถ์ธ์ด๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์ ๋ค์ด ๋ช๋ช ์๋ค.
- ๊ต๊ฐ์ฌ์ ์๊ฐ ๊ด๋ฆฌ ๋ฐ ์์ ํจ์จ์ฑ: ๊ต๊ฐ์ฌ๋ ์ง๋ฌธ์ด ๋ค์ด์ค๋ฉด ์๋ฆฌ๋ก ๊ฐ์ ํ๋ํ๋ ๋ด์ฃผ๋ ๋ชจ์ต์ ํํ ๋ณผ ์ ์๋ค. ํด๋น ๊ณผ์ ์ด ์ถ์ ๋๋ฉด ์๊ฐ์๋ชจ, ์ง๋๋ ์ ๋๋ก ๋ชป๋๊ฐ๊ณ ์์ง์ ๊ต์ก์ ๋ฐ์ ์ ์๋ค.
- ํ์๋ค์ ํ์ต ํ๊ฒฝ ๋ฐ ํ๋ ๊ด๋ฆฌ: ๋ถ์ ํ์๋ ์์ ์๊ฐ ์ค ์ปดํจํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ธ์ ์ธ ํ์๋ฅผ ํ๋ ๋ฑ ํ์๋ค์ ํต์ ์ ์ด๋ ค์
- ์ค์ตํ๊ฒฝ์ ์ด์ ๋ฐ ๊ด๋ฆฌ: ๊ต์ก๊ธฐ๊ด์ ์์ง์ ๊ต์ก์ ์ํด ์ค์ตํ๊ฒฝ์ ์ ๊ณตํ ์ฑ ์์ด ์์ผ๋, ์ค์ตํ๊ฒฝ์ ์ด์ ๋ฐ ๊ด๋ฆฌ๊ฐ ๋ฏธํกํ ๊ฒฝ์ฐ๊ฐ ์์.
์ง์ง ๋ฌธ์ ์ ์
์ ์ ํ๋๋๋ ์ปดํจํฐ ์ค์ต ๊ธฐ๋ฐ์ ๊ต์ก ํ๊ฒฝ์์ ํ์๋ค์ ์์ง์ ๊ต์ก์ ๋ณด์ฅํ ์ ์๋๋ก ์ค์ต ์ธํ๋ผ๋ฅผ ๊ฐ์ ํ ์ ์๋ SW ์๋ฃจ์
์ ๊ฐ๋ฐํ์.
์ฃผ์ ๊ตฌ์ฒดํ
๋ชจ๋ํฐ๋ง
๊ต์์๊ฐ ํ์ ์ฐธ์ฌ์๋ค์ ์คํฌ๋ฆฐ์ ์ค์๊ฐ์ผ๋ก 1:N ์ผ๋ก ๋ชจ๋ํฐ๋ง ํ ์ ์๋ ์๋น์ค
- ํ์ ์ฌ์ฉ์๊ฐ ์์ฉ ํ๋ก๊ทธ๋จ ์ด๊ธฐ ์คํ์ ํ์ ์ฌ์ฉ์์ ์นด๋ฉ๋ผ, ์์ฑ, ๋ชจ๋ํฐ ํ๋ฉด์ ์ ๊ทผ ์ฌ๋ถ ๊ถํ ํ์ฉ ์ํ๊ฐ ๋๋ค.
- ๊ทธ ํ ๊ต์์๊ฐ ์์ฑํ ๊ฐ์์ค์ ๋ค์ด๊ฐ๋ฉด ๊ต์์๋ ํ์ ์ฌ์ฉ์์ ๋ชจ๋ํฐ๋ฅผ ๋ณผ ์ ์๋ค. (๊ต์ 1 : ํ์ N)
ํ๋ฉด ๊ณต์
๊ต์์๊ฐ ํ์ ์ฐธ์ฌ์์ค ํ ๋ช ์ ์ ํ์(๋ชจ๋ํฐ๋ง ํน์ ํ์ ํ๋ฉดํด๋ฆญ) ์ง๋ชฉํ ํ์ ์ฌ์ฉ์์ 1๋1๋ก P2P๊ฐ ์ด๋ฃจ์ด์ง๋ ์๋น์ค
- ์๋ก ๊ตํํ๋ ๋ฏธ๋์ด๋ [๊ต์์ : ์์ฑ, ์นด๋ฉ๋ผ(์ผ๊ตด)], [ํ์ : ์ปดํจํฐ ์คํฌ๋ฆฐ]
- ๊ต์์๊ฐ ์์ฑํ ๋ฐฉ์ ๋ค์ด์์๋ ํ์ ์ฐธ์ฌ์์ค ๊ต์์๊ฐ ์ ํํ ํด๋น ํ์ ์ฌ์ฉ์์ ๊ต์์๊ฐ 1๋ 1๋ก ์์ฑ ๋ฐ ํ๋ฉด์ ๊ณต์ ํ ์ ์๋ค.
- ์ด๋ ํ์์ ๊ต์์์ ์บ ํ๋ฉด๊ณผ ์์ฑ์ ๋ค์ ์ ์์ผ๋ฉฐ, ๊ต์์๋ ํ์์ ๋ชจ๋ํฐ ํ๋ฉด ๋ฐ ์์ฑ์ ๋ค์ ์ ์๋ค.
์๊ฒฉ ๋ฐ์คํฌํฑ
๊ต์์๊ฐ ํ์ ์ฌ์ฉ์์ ์ปดํจํฐ์ ์ ๊ทผํ์ฌ ์ง์ ์ฝ๋ ์์ ๋ฐ ์ผ์ ์ก์ ์ ์ทจํ ์ ์๋ ์๋น์ค
- ๊ต์์๊ฐ ํ์ ์ฌ์ฉ์์ ์ปดํจํฐ์ ์ ๊ทผํ์ฌ ํน์ ์ก์ ์ ์ทจํ ์ ์๋ค.(๋ง์ฐ์ค ํด๋ฆญ, ํค๋ณด๋ ํด๋ฆญ)
์์ต์ฑ ๋ชจ๋ธ
SaaS์ ์์ต์ฑ ๋ชจ๋ธ๋ก์ ํ์ฅ์ ์ํ ๊ฒฐ์ ๋ชจ๋ ์ฐ๋
๊ฒฐ๊ณผ๋ฌผ
์์ธ
๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ์ํ๊ธฐ ์ํ ERD ๋ค์ด์ด๊ทธ๋จ์ด๋ค. ์ต์ ์์ค MVP๋ฅผ ์ํ ์ต์ ํ ์ด๋ธ์ ์ ์ํ์๋ค.
์ฌ์ฉ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ๋๋ ์น์ฌ์ดํธ๋ฅผ ์ด์ฉํ๋ ๊ณผ์ ์ ์๊ฐ์ ํํํ ํ๋ก์ฐ์ด๋ค. ํด๋น ๋ฆฌ์์ค์ ์ฃผ์ ์ ์์ฌํญ์ ์๋์ ๊ฐ๋ค.
- ์ธ์ฆ ํ์ด์ง : ์ฌ์ฉ์๋ฅผ ์๋ณํ๊ธฐ ์ํ ์ฌ์ฉ์ ๋ฑ๋ก ๋ฐ ์ฌ์ฉ์ ์ธ์ฆ๊ณผ ๊ด๋ จ๋ ๊ธฐ๋ฅ. ์ฌ์ฉ์์ ๊ถํ์ ๊ต์์์ ํ์์ผ๋ก ๋๋๋ค.
- ๋ฉ์ธ ํ์ด์ง : ์ฌ์ฉ์๋ค์ ์์ ์ด ์์๋ ๊ฐ์๋ค์ ๋ฆฌ์คํธ๋ฅผ ์ฒดํฌํ ์ ์๋ค. ๊ต์์๋ ๊ฐ์๋ฅผ ์์ฑํ ์ ์๊ณ ํ์์ ์ฐธ์ฌ์์ฒญ์ ๊ฐ์์ ์์๋ ์ ์๋๋ก ํ๋ค.
- ๊ฐ์ ์์ธ : ๊ต์์๋ค์ ์๋์ ์ฃผ์ ๊ธฐ๋ฅ๋ค์ ์ํํ ์ ์๋ค.
- ๋ชจ๋ํฐ๋ง : ํ์๋ค์ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ํํ๋ก ๋ชจ๋ํฐ๋งํ๋ค. ์ด๋ ํ์์ ์์ฉ ํ๋ก๊ทธ๋จ ์ ์ + ๊ต์์์ ๊ฐ์ ํ์ฑํ๋ฅผ ์ ์ ๋ก ํ๋ค.
- P2P ์คํธ๋ฆฌ๋ฐ : ๋ชจ๋ํฐ๋ง ์ค์ธ ํ์์ ๊ทธ๋ฆฌ๋๋ฅผ ํด๋ฆญ ์ P2P ํต์ ์ ์์ํ๋ค. ์๋ก ๊ตํ๋๋ ๋ฏธ๋์ด๋ ๋ค์๊ณผ ๊ฐ๋ค โํ์ : ์์ ์ ์คํฌ๋ฆฐ, ๊ต์์ : ์์ฑ๊ณผ ์บ ์ฝ๋
- ์๊ฒฉ ์ ์ด : P2P ์คํธ๋ฆฌ๋ฐ ์ค ๊ต์์๊ฐ ํ์์ ์คํฌ๋ฆฐ์ ์๊ฒฉ ์ ์ดํ ์ ์๋ค.
- ํ์์ฉ ์์ฉ ํ๋ก๊ทธ๋จ : ๊ฐ ํ์๋ค์ ์ค์ต ์ปดํจํฐ์ ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋จ์ ์ค์นํ์ฌ ์คํํ ๊ฒฝ์ฐ ์ํธ์์ฉ์ด ๊ฐ๋ฅํด์ง๋ค. ํด๋น ์์ฉ ํ๋ก๊ทธ๋จ์ Electron์ ์ฌ์ฉํ์ฌ ๋น๋ํ๋ค.
- Electron์ ์น ํ์ค ๊ธฐ์ (HTML/Javascript)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฉํฐ ํ๋ซํผ ํ๊ฒฝ์ ์์ฉ ํ๋ก๊ทธ๋จ์ผ๋ก ๋น๋๊ฐ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ธฐ์ ์ด๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฐ ์์ฐ์ฑ๊ณผ ์์ดํ OS ํ๊ฒฝ์์์ ์ง์์ ๋ชฉํ๋ก ํ์ฌ ์ฑํํ์๋ค.
- Front-end Server : ์ฌ์ฉ์๋ค์ ํ์ ๊ธฐ๋ฅ, ๊ฐ์์ค ์์ฑ ๋ฐ ์ฐธ์ฌ ๋ฑ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ์ ์ํํ๊ณ , ๊ต์์์ ํ์ ๋ชจ๋ํฐ๋ง ๋ฐ P2P, ์๊ฒฉ ๋ฐ์คํฌํ์ ์ํํ ์ ์๋๋ก UI๋ฅผ ์ ๊ณตํ๋ค.
- API Server : ํ์ํ API๋ฅผ ์ ๊ณตํ๋ ์๋ฒ๋ฅผ ๊ตฌ์ฑํ๋ค. ๋ ๋์๊ฐ์ ์๋น์ค๋ฅผ ๋ถ๋ฆฌํ์ฌ ์๋ฒ๋ฅผ ๊ตฌ์ฑํ ์ ์๋์ง์ ๋ํ ๊ฒํ ๋ฅผ ์ํ์ค์ด๋ค.
- Core-API : ์ธ์ฆ, ์ฌ์ฉ์ ์๋ณ, ๊ฐ์์ค ์์ฑ ๋ฐ ์ฐธ์ฌ ๋ฑ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ ์ํ
- Monitoring-API : ์์ฉ ํ๋ก๊ทธ๋จ์ผ๋ก๋ถํฐ ์ฃผ๊ธฐ์ ์ผ๋ก ์คํฌ๋ฆฐ ํ๋ฉด ๋ฐ ์ ์์๊ฐ์ Push๋ฐ๊ณ , ์น ํ์ด์ง์๊ฒ ์ง์์ ์ผ๋ก ํด๋น ๋ชจ๋ํฐ๋ง ๋ฆฌ์คํธ๋ฅผ Pollingํ๋๋ก ๋น๋๊ธฐ ๋์์ ํนํ๋ API๋ฅผ ๊ตฌ์ถํ๋ค.
- Event Server : P2P ํต์ ์ ์์ํ ๋ ํ์ํ ์๊ทธ๋๋ง ์๋ฒ(Signaling Server)์ ์ญํ ์ ํ๋ฉด์ ์๊ฒฉ ๋ฐ์คํฌํฑ์ ๊ตฌํํ๊ธฐ ์ํ ์ด๋ฒคํธ ์ค์ฌ ํ๋ก๊ทธ๋๋ฐ์ ํ๊ธฐ ์ํ ์๋ฒ์ด๋ค.
- ํ์๋ค์ ์์ฉ ํ๋ก๊ทธ๋จ์์๋ ์ง์์ ์ผ๋ก ์ฌ์ฉ์์ ์คํฌ๋ฆฐ ์ด๋ฏธ์ง์ Timestamp๋ฅผ ์๋ฒ๋ก Pushํ๋ค. ๊ฐ๊ฐ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ ๋ฆฝ์ ์ธ ๊ฐ๊ฒฉ์ ๋ฐ๋ผ์ Pushํ๋ค.
- ๊ต์์์ ์น(๋ชจ๋ํฐ๋ง ํ๋ฉด)์์๋ ์ผ์ ๊ฐ๊ฒฉ๋ง๋ค ํด๋น ๋ชจ๋ํฐ๋ง ์ ๋ณด์ ๋ฆฌ์คํธ๋ฅผ Pollingํ์ฌ ์ฃผ๊ธฐ์ ์ผ๋ก ํ์๋ค์ ์คํฌ๋ฆฐ๊ณผ ์ ์ ์ฌ๋ถ(Timestamp)๋ฅผ ์ฒดํฌํ๋ค.
- ๊ต์์์ ํ์์ด ๊ฐ์์ ์บ ์ฝ๋ ํ๋ฉด(๊ต์์)๊ณผ ์ปดํจํฐ ์คํฌ๋ฆฐ ํ๋ฉด(ํ์)์ 1:1 ์ค์๊ฐ์ผ๋ก ๊ณต์ ํ ์ ์๋๋ก ํ๋ค.
- ๊ณต์ ๋ ํ๋ฉด์ ๊ธฐ๋ฐ์ผ๋ก ๊ต์์๊ฐ ํ์์ ์ปดํจํฐ๋ฅผ ์๊ฒฉ์ผ๋ก ์ ์ดํ ์ ์๋๋ก ํ๋ค.
๊ต์์๊ฐ ํ์๊ณผ 1:1๋ก ๋ฏธ๋์ด๋ฅผ ์ค์๊ฐ์ผ๋ก ๊ตํํ๊ธฐ ์ํด์ Web RTC ๊ธฐ์ ์ ์ฑํํ์๋ค.
- WebRTC(Web Real-Time Communication)๋ ์น ๋ธ๋ผ์ฐ์ ๊ฐ์ ์ค์๊ฐ์ผ๋ก ์์ฑ, ์์ ๋ฐ ๋ฐ์ดํฐ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ์คํ ์์ค.
- Google Meet, Zoom, Facebook Messenger ๋ฑ ์ค์๊ฐ ๋ฏธ๋์ด ์คํธ๋ฆฌ๋ฐ์ด ์ฌ์ฉ๋๋ ์ดํ๋ฆฌ์ผ์ด์ ์์ ๋ง์ด ์ฌ์ฉ
- ์ด๊ธฐ ์ฐ๊ฒฐ์ ์ฑ๊ณตํ ์ดํ์๋ P2P Connection์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค๋ ํน์ง
Web RTC์ ์ฃผ์ ๊ตฌ์ฑ ์์์ ๊ตฌํ ๊ณํ
- STUN ์๋ฒ : ํด๋ผ์ด์ธํธ๋ค์ด ์๋ก์๊ฒ ์ง์ ์ฐ๊ฒฐ์ด ๊ฐ๋ฅํ๋๋ก ์ธ๋ถ์์ ์ ๊ทผ ๊ฐ๋ฅํ ์ฃผ์์ ๋ฐฉ๋ฒ์ ์๋ ค์ฃผ๋ ์ญํ . ํด๋ผ์ด์ธํธ๋ STUN ์๋ฒ์๊ฒ ์์ ์ Public IP ์ฃผ์ ๋ฐ ํฌํธ๋ฅผ ์์ฒญํ๊ณ , ์ด ์ ๋ณด๋ฅผ ์๋ Peer์ ๊ณต์ ํ๋ค.
- STUN ์๋ฒ๋ก๋ Google์์ ์ ๊ณตํ๋ STUN ์๋ฒ๋ฅผ ์ฌ์ฉ
- ์๊ทธ๋๋ง ์๋ฒย :ย ํต์ ์์์ ์ํ ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ๊ตํํ๋ ์ค๊ณ ์๋ฒ์ ์ญํ . ํด๋ผ์ด์ธํธ๋ค์ด ์๋ก์ ์ฃผ์๋ฅผ ์์๋ด๊ณ ํต์ ์ ์์ํ๊ธฐ ์ํด์๋ ์๊ทธ๋๋ง ์๋ฒ๊ฐ ํ์ํ๋ค.ย ํด๋ผ์ด์ธํธ๋ค ๊ฐ์ ์ฐ๊ฒฐ ๋ฉํ๋ฐ์ดํฐ ๋ฐ ํต์ ์ ์ํ ์ ์ด ๋ฉ์์ง๋ฅผ ์ ๋ฌํด์ค๋ค.
- ์๊ทธ๋๋ง ์๋ฒ๊ฐ ํ์ํ๋ฏ๋ก ๋ฌธ์ ์๋จ์์ ์ค๋ช ํ๋ Event Server๋ฅผ ๊ตฌ์ถํ์ฌ ์๋ก์ Connection ์ ๋ณด๋ฅผ ๊ตํํ๋๋ก ์ค๊ฐํ ์ ์๋๋ก ์์คํ ์ ๊ตฌ์ถํ๋ค.
- Connection ๊ณผ์ : Offer/Answer(SDP ๊ตํ) โ ICE Candidate ๊ณผ์ ์ ๊ฑฐ์ณ ์๋ก์ ๋ฏธ๋์ด ์คํธ๋ฆผ Connection ์ ๋ณด๋ฅผ ๊ตํํ๋ค.
Web RTC๋ฅผ ์ฑํํ ์ด์
- P2P Connection : WebRTC๋ P2P ์ฐ๊ฒฐ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ฉฐ ์ด๊ธฐ ์ฐ๊ฒฐ ๊ณผ์ ์ ์ ์ธํ๊ณ ๋ ์๋ฒ๋ฅผ ๊ฒฝ์ ํ์ง ์์ผ๋ฏ๋ก Latency๊ฐ ๋งค์ฐ ๋ฎ๊ณ ์๋ฒ์ ์์กด๋๋ฅผ ์ค์ผ ์ ์๋ค.
- Bandwidth ์๋ ์กฐ์ : ๋คํธ์ํฌ ์ํ๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ์ด์ ๋ง์ถ์ด ์ฒ๋ฆฌ ์๋๋ฅผ ์กฐ์ ํ ์ ์๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋คํธ์ํฌ ์ฌ์ฉ์ ์ต์ ํํ ์ ์๋ค.
- ๋ฏธ๋์ด ํผํฌ๋จผ์ค : ์ ๋น์ฉ์ผ๋ก ์์คํ ์ ๊ตฌ์ถํ ๋ ๋น๊ต์ ์์์ ์ด๋น ํ๋ ์ ์๊ฐ ๋๊ณ , ์์ฒด์ ์ธ ์ฝ๋ฑ์ ์ํด ์ ๋ช ํ ํ์ง์ ์ ์งํ๋ฉฐ ์์์ ์คํธ๋ฆฌ๋ฐ ํ ์ ์๋ค.
- ๋ณด์: ์คํธ๋ฆผ์ ์ํธํํ๊ธฐ ๋๋ฌธ์ ์ ์ก๋๋ ๋ฐ์ดํฐ์ ๊ธฐ๋ฐ์ฑ์ ์ ์งํ ์ ์๋ค. ๋ฐ๋ผ์ ๋ฏผ๊ฐํ ์ ๋ณด๋ฅผ ๊ตํํ๋ ํ๋ฉด ๊ณต์ ๊ณผ์ ์ ๋ณด์์ฑ์ ์งํฌ ์ ์๋ค.
P2P ์ฐ๊ฒฐ์ ํ ๋, Websocket์ ์ฌ์ฉํ์ฌ ์๊ทธ๋๋ง ์ญํ ์ ํ๋ค. ์ฐ๋ฆฌ์ ์๊ตฌ์ฌํญ์์ ์ ์์ ๋ฐ๋์ ๊ต์์์ ํ์์ด 1:1๋ก ๋งค์นญ๋์ด์ผ ํ๋ฉฐ ์ ์ ์์์ ๋ํ ๊ท์น์ด ์์๋ค.
Connection ๊ท์น : ์ด์์ ์ธ P2P๋ A ์ ์์๋ผ๋ฆฌ 1:1 ํต์ , B ์ ์์๋ผ๋ฆฌ 1:1 ํต์ ์ ํ์ฌ์ผ ํ๋ค.
- ๊ต์์๋ ํ์์ด ์ ์ํ์ง ์์ Room์๋ ์ ๊ทผ ๋ถ๊ฐ๋ฅ (ํ์์ ํ๋ฉด์ด ์์ผ๋ฏ๋ก ๊ฐ์ํ ํ์๋ ์๋ค.)
- ๊ต์์๋ ํ์์ ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ํจ๊ป ์ฐ๊ฒฐ์ด ๋์ด์ ธ์ผ ํ๋ค.
- ํ์์ด Room์ ์ ์ ๋์ค, ๋์ผํ ํ์์ ๋ค๋ฅธ ์ธ์ ์ด ๊ฐ์ Room์ ์ ์ํ ๋ ๊ธฐ์กด ์ ์์ค์ด๋ ์ธ์ ์ ๊ฐ์ ์ ์ ์ข ๋ฃ๊ฐ ๋์ด์ผ ํ๋ค.
- ๊ต์์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ธ๋ผ์ฐ์ ์์ Room์ ์ ์ ๋์ค, ๋๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ์์ ๊ฐ์ Room์ ์ ์ํ ๋ ๊ธฐ์กด ์ ์์ค์ด๋ ๋ธ๋ผ์ฐ์ ๋ ๊ฐ์ ๋ก ์ ์ ์ข ๋ฃ๋์ด์ผ ํ๋ค.
์๊ตฌ์ฌํญ์ ๋ํ ์ ์ ๊ท์น์ ์ํด์ ์์ผ ๋ค์์คํ์ด์ค ๋ณ ์ธ์ ์ ์ ์ดํ๊ธฐ ์ํ Locking์ ๊ตฌํ์ด ํ์ํ๋ค. RDBMS Locking, Zookeeper ๋ฑ ๋ค์ํ Locking์ ๊ตฌํํ๊ธฐ ์ํ ๋๊ตฌ๋ค์ด ์์์ผ๋ฉฐ ๊ทธ ์ค Redis๋ฅผ ์ฑํํ์ฌ ์ปค์คํ ๋ฝ์ ๊ตฌํํ์๋ค.
Redis๋ฅผ ์ฑํํ ์ด์
- Redis์ In-Memory์ ํน์ฑ ์ ๋์ ํผํฌ๋จผ์ค๋ฅผ ๋ฐํํ๋ค.
- ํ๋ฐ์ฑ ๋ฐ์ดํฐ์ธ Connection์ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ ํฉํ๋ค.
- ๋ถ์ฐ ๋ฝ์ ์ง์ํ๊ธฐ ๋๋ฌธ์ ๋ถ์ฐ ํ๊ฒฝ์์์ ๋๊ธฐํ ๋ฑ์ ์ด์๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ ๋ฆฌํ๋ค.
์ปค์คํ ๋ฝ์ ํ๋ก์ธ์ค
- ๋ฝ ํ๋ : ํ์์ด๋ ๊ต์์๊ฐ Room์ ์ ์ํ๋ ค๊ณ ํ ๋, ๋จผ์ Redis์์ ํด๋น Room์ ๋ํ ๋ฝ์ ํ๋ํ๋ค. ๋ง์ฝ ์ด๋ฏธ ๋ฝ์ด ์กด์ฌํ๋ฉด ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ ์ ์ ์ค์์ ์๋ฏธํ๋ฏ๋ก, ์๋ก์ด ์ ์ ์๋๋ฅผ ๊ฑฐ๋ถํ๊ฑฐ๋ ๊ธฐ์กด ์ ์์ ์ข ๋ฃํ๋ค.
- ๋ฝ ํด์ : ํ์์ด๋ ๊ต์์๊ฐ Room์์ ๋๊ฐ๋ฉด Redis์์ ๋ฝ์ ํด์ ํ์ฌ ๋ค๋ฅธ ์ฌ์ฉ์๊ฐ Room์ ์ ์ํ ์ ์๋๋ก ํ๋ค.
- ์๋ ํด์ : ๋ง์ฝ ํด๋ผ์ด์ธํธ๊ฐ ๋น์ ์์ ์ผ๋ก ์ข ๋ฃ๋๊ฑฐ๋ ์ฐ๊ฒฐ์ด ๋์ด์ก์ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ Disconnection์ ๋ํ ์ด๋ฒคํธ ์ฒ๋ฆฌ ๋ฐ ๋ฝ์ TTL์ ์ค์ ํ์ฌ ์๋์ผ๋ก ํด์ ๋๋๋ก ์ค์ ํ๋ค.
- Event Sever์๋ P2P ์ฐ๊ฒฐ์ ์ฌ์ฉํ ๊ณ ์ ํ ์๋ณ์(๊ฐ์ - ํ์)์ผ๋ก ๊ตฌ๋ถ๋๋ Room์ด ์กด์ฌํ๋ฉฐ, ํด๋น ๊ทธ๋ฃน ๋ด์ ์๋ ํด๋ผ์ด์ธํธ๋ผ๋ฆฌ์ ์ด๋ฒคํธ Subscribe์ Publish๊ฐ ์ด๋ฃจ์ด์ง๋ค.
- P2P ์คํธ๋ฆฌ๋ฐ์ด ์งํ ์ค์ผ ๋ Event-Driven ๋ฐฉ์์ผ๋ก ์๊ฒฉ ์ ์ด๊ฐ ์ด๋ฃจ์ด์ง๋ค.
์๊ฒฉ ์ ์ด ํ๋ก์ธ์ค
์๊ฒฉ ๋ฐ์คํฌํ์ ์๋ ๋ฐฉ์์ ์์ ์ฐจํธ์ ๊ฐ์ด ๋ค์ ๊ณผ์ ์ ๋ฐ๋ฅธ๋ค.
- ๊ต์์์ ์ด๋ฒคํธ ๋ฐ์(๋ง์ฐ์ค Up/Down, ํค๋ณด๋ Up/Down ๋ฑ) ์ Event ์๋ฒ๋ก Publishํ๋ค.
- ํด๋น ์ด๋ฒคํธ๋ฅผ Listenํ๊ณ ์๋ ํ์์ด Message๋ฅผ Subscribeํ๋ค.
- ํ์์ ์์ฉ ํ๋ก๊ทธ๋จ์ ํด๋น ๋ฉ์์ง๋ฅผ ๋ฐํ์ผ๋ก O์ I/O ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํจ๋ค
- ์ฌ์ฉ์๊ฐ DIDACTO ํ๋ฆฌ๋ฏธ์ ์ด์ฉ๊ถ์ ์ธํฐ๋ท ๊ฒฐ์ ๋กํ์ฌ๊ธ ๊ตฌ๋ ํ ์ ์๊ฒํ๋ค.
- ๊ฒฐ์ ๊ณผ์ ์ค ์ค๋ฅ ๋ฐ์์ ์ฌ์ฉ์์๊ฒ ๊ฒฐ์ ๋ฅผ ์์ฒญํ์ง ์๊ฑฐ๋ ์ทจ์๋๊ฒ๋ ํ ์ ์๊ฒํ๋ค.
๊ตญ๋ด PG๊ฒฐ์ ์ฐ๋์ ์ฝ๊ฒํด์ฃผ๋ ๊ฒฐ์ API์
๋๋ค.
PG๋ Payment gateway์ ์ฝ์์ธ๋ฐ, ์ ์ฉ์นด๋์ฌ์ ์ง์ ๊ณ์ฝํ๊ธฐ ์ด๋ ค์ด ์จ๋ผ์ธ ์ผํ๋ชฐ์ ๋์ ํด ๊ฒฐ์ ์ ์ ์ฐ ์
๋ฌด๋ฅผ ๋ํํด ์ฃผ๋ ์
์ฒด์
๋๋ค.
์ ์ฉ์นด๋, ์ค์๊ฐ ๊ณ์ข์ด์ฒด, ๊ฐ์๊ณ์ข, ๊ฐํธ๊ฒฐ์ ์๋น์ค(์: ์นด์นด์คํ์ด, ํ์ด์ฝ) ๋ฑ์ ์ฐ์ด๋ฉฐ ๋ณด์์ ์ค์ํฉ๋๋ค.
ํฌํธ์์ ๋์ ๊ณผ์ ์ ๊ฒฐ์ โ ์๋ฃ โ ๊ฒฐ์ ์ ๋ณด๋ฅผ ์๋ฒ๋ก ์ ์ก โ ์๋ฒ์์ ๊ฒ์ฆ์ฒ๋ฆฌํ ๊ฒฐ์ ์๋ฃ ์ ์์๋๋ก ์งํ์ด ๋๋ค.
ํ์์ด DIDACTO ํ๋ฆฌ๋ฏธ์ ์๋น์ค๋ฅผ ๊ตฌ๋ ํ๊ธฐ ์ํด ๊ฒฐ์ ํ์๋ฅผ ํํ ์ ๋ค์ ๊ณผ์ ์ ๋ฐ๋ฅธ๋ค.
- ๋ฑ๋ก๋์ด์๋ ์ค์ ์์ํฌํธ ID๋ฅผ ํตํ์ฌ IMP ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ์ด๊ธฐํ
- ์๋ฒ์ ์ฃผ๋ฌธ ์์ฑ ํ ๋ฐ์์จ ์ฃผ๋ฌธID๋ฅผ ํตํ์ฌ IMP ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ๊ฒฐ์ ๋ฐฉ์๊ณผ ๊ฒฐ์ ๊ธ์ก, ์ฃผ๋ฌธ ์ ๋ณด๋ฅผ ๋ด์ ๊ฐ์ฒด๋ก ๊ฒฐ์ ์์ฒญ์ ๋ณด๋
- IMP ๊ฒฐ์ ์ฑ๊ณต์ ๊ฒฐ์ ๊ณ ์ ๋ฒํธ์ ์ฃผ๋ฌธ๋ฒํธ ์๋ฒ์ ์ ๋ฌ
- ์๋ฒ ์ค๋ฅ๋ก ์ธํด ์ฃผ๋ฌธID ๋ฏธ์์ฑ or ๊ฒฐ์ ๊ธ์ก์ ํด๋ผ์ด์ธํธ ์ธก์์ ์๋์ ์ผ๋ก ์กฐ์์ ๊ฒฐ์ ์ทจ์ ๋ฐ ๊ฒฐ์ ๊ฐ ๋ถ๊ฐ๋ฅํ๋๋ก ๋ก์ง ์ค๊ณ
๊ฒฐ์ ๊ฒ์ฆ๋ถ๋ถ
iamportClient.cancelPaymentByImpUid(new CancelData(iamportResponse.getResponse().getImpUid(), true, new BigDecimal(iamportPrice)));
throw new RuntimeException("๊ฒฐ์ ๊ธ์ก ์๋ณ์กฐ ์์ฌ");
PortOne์ชฝ์ API๋ฅผ ์ด์ฉํ๋ฉด ๊ฒฐ์ ์ทจ์๋ฅผ ๊ตฌํํ ์ ์๋ค.
์ฌ์ฉ์๊ฐ ์ค์ ํด๋์ ๊ฐ๊ฒฉ์ ์์๋ก ์กฐ์ํ์ฌ ๊ฒฐ์ ๋ฅผ ํ๋ ค๊ณ ํ ๋ ์ค์ ๊ฒฐ์ ๊ฐ ์๋ฃ๋์์ด๋ ์๋ฒ์ธก์์ ๊ฒฐ์ ์ทจ์๋ฅผ ํด์ค ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์นํ ์ด๋ ํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์์ ๋(๊ฒฐ์ ๊ฐ ์๋ฃ๋์์ ๋) ์ค์ ํด๋์ URL๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค.
๋ง์ฝ ๊ฒฐ์ ๊ฐ ์ฑ๊ณตํ๋ค๋ฉด ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ค์ ํด๋์ URL๋ก ๋ณด๋ผ ์ ์๊ฒ ๋๋ค.
curl -H "Content-Type: application/json" -X POST -d '{ "imp_uid": "imp_1234567890", "merchant_uid": "order_id_8237352", "status": "paid" }' { NotificationURL }
- imp_uid : ๊ฒฐ์ ๋ฒํธ
- merchant_uid : ์ฃผ๋ฌธ ๋ฒํธ
- status : ๊ฒฐ์ ์ํ
์นํ ์ ๋์ ํ๋ ์ด์
- ๋ณดํต ์นํ ์ ๊ฐ์๊ณ์ข์ ๋์ด ์ ๊ธ๋์๋์ง ์๋์๋์ง ํ์ธํ๋ ์ฉ๋๋ก ๋ง์ด์ฌ์ฉํ๋ค๊ณ ํ๋ค. ๊ฐ์๊ณ์ข๋ ์ฆ์ ๋์ด ์ ๊ธ๋์ง ์๊ธฐ๋๋ฌธ์ ํฌํธ์์ชฝ์์ ๋๊ธฐ๋ฅผ ํ๊ณ ์๋ค๊ฐ ๋ง์ฝ ์ฌ์ฉ์๊ฐ ๋์ ์ ๊ธํ๋ค! ๋ผ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ๊ทธ ๋ ๋ฐฑ์๋๋จ์์ ์ฒ๋ฆฌ๋ฅผ ํด์ค ์ ์๋ค.
- ์ฐ๋ฆฌ๋ ๊ฐ์๊ณ์ข์ ๋์ ์ ๊ธํ๋ ๊ฒฝ์ฐ๋ ์ผ๋จ ๊ณ ๋ คํ์ง ์๊ณ ์์ผ๋ ๋ฐฐ์ ํ๊ณ ์ธํฐ๋ท ์ฐ๊ฒฐ ๋๊น, ๋ธ๋ผ์ฐ์ ์๋ ์๋ก๊ณ ์นจ ๋ฑ์ ์ด์ ๋ก ํด๋ผ์ด์ธํธ์์ ๊ฒฐ์ ์๋ฃ์ ๋ํ ์๋ต์ ๋ฐ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ๊ฐํ์ ์ผ๋ก ๋ฐ์ํ๋ ๊ฒฝ์ฐ์ ๋๋นํด ์นํ ์ ์ฌ์ฉํ๋๋ก ํ๋ค.