์ปค๋ฎค๋ํฐ์ ์ฐ๊ฒฐ๊ณ ๋ฆฌ, 1:1 '์ค์๊ฐ ์ชฝ์ง(DM)' ๊ธฐ๋ฅ ์์ฒด ๊ฐ๋ฐ ๋ฐ ์ํคํ ์ฒ ์ค๊ณ ์ฌ์
๊ทผ ์ปค๋ฎค๋ํฐ์ ๋ค์ํ ์ฃผ์ ์ ๊ฒ์ํ์ด ํ์ฑํ๋๊ณ ๋ฐฉ๋ฌธ์๋ถ๋ค์ ํ๋์ด ๋์ด๋๋ฉด์, ๋๊ธ ์ฐฝ์ ๋์ด ์ ์ ๋ค๋ผ๋ฆฌ ์กฐ๊ธ ๋ ์ฌ์ ์ธ ๋ํ๋ฅผ ๋๋ ์ ์๋ ๊ณต๊ฐ์ด ํ์ํ๋ค๋ ํผ๋๋ฐฑ์ ๊พธ์คํ ๋ฐ์์์ต๋๋ค. ๊ฒ์ ์์ด๋๋ฅผ ๊ตํํ๊ฑฐ๋, ๊ฐ๋ฐ ๊ด๋ จ ๊ธฐ์ ์คํ์ ๋ํด ๊น์ด ์๋ ์ง๋ฌธ์ ์ฃผ๊ณ ๋ฐ์ ๋ ๊ณต๊ฐ๋ ํํฌ(๊ฒ์ํ)๋ณด๋ค๋ ์กฐ์ฉํ 1:1 ์ฑ๋์ด ํ์์ ์ด๋๊น์.
์ธ๋ถ ๋ฉ์ ์ (๋์ค์ฝ๋, ์คํ์นดํก ๋ฑ)๋ก ์ ์ ๋ค์ ๋ด๋ณด๋ด๋ ๋์ , ์ฐ๋ฆฌ ์ฌ์ดํธ ์ํ๊ณ ์์์ ์์ ํ๊ฒ ์ํตํ ์ ์๋๋ก ์ด๋ฒ ์ฃผ๋ง์ ๋ฐ๋ฉํ๊ณ 'ํ์ ๊ฐ ์ค์๊ฐ ์ชฝ์ง ๊ธฐ๋ฅ'์ ๋ฐฑ์๋๋ถํฐ ํ๋ก ํธ์๋๊น์ง ์ง์ ๊ฐ๋ฐํ์ฌ ๋์ ํ์ต๋๋ค. ์ค๋์ ์ด ์ชฝ์ง ๊ธฐ๋ฅ์ ํ์ด์ฌ(Python)๊ณผ FastAPI ํ๊ฒฝ์์ ์ด๋ป๊ฒ ์ค๊ณํ๊ณ ๊ตฌํํ๋์ง, ๊ทธ ๊ฐ๋ฐ ๋นํ์ธ๋ ์คํ ๋ฆฌ๋ฅผ IT ์นผ๋ผ ํ์์ผ๋ก ๊น์ด ์๊ฒ ๊ณต์ ํด ๋ณด๊ณ ์ ํฉ๋๋ค.
1. ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค(RDBMS) ์ค๊ณ: "๋๊ฐ ์ง์ ๋๊ฐ?"์ ๋๋ ๋ง
์ชฝ์ง ๊ธฐ๋ฅ ๊ฐ๋ฐ์ ์ฐฉ์ํ์ ๋ ๊ฐ์ฅ ๋จผ์ ๋ถ๋ชํ ๋๊ด์ ๋ฐ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค(DB) ํ ์ด๋ธ ์ค๊ณ์์ต๋๋ค. ๋จ์ํ '๋ณด๋ธ ์ฌ๋', '๋ฐ๋ ์ฌ๋', '๋ด์ฉ'๋ง ์ ์ฅํ๋ฉด ๋๋ ์ค ์์์ง๋ง, ์ชฝ์ง๋ผ๋ ์์คํ ํน์ฑ์ '์ญ์ '์ ์ฃผ์ฒด๊ฐ ๋ ๋ช ์ด๋ผ๋ ์น๋ช ์ ์ธ ๋ณ์๊ฐ ์กด์ฌํ์ต๋๋ค.
์๋ฅผ ๋ค์ด, A๊ฐ B์๊ฒ ์ชฝ์ง๋ฅผ ๋ณด๋์ ๋ A๊ฐ ๋ณด๋ธ ์ชฝ์งํจ์์ ํด๋น ์ชฝ์ง๋ฅผ ์ญ์ ํ๋๋ผ๋, B์ ๋ฐ์ ์ชฝ์งํจ์์๋ ๊ทธ ๋ด์ฉ์ด ๊ทธ๋๋ก ๋ณด์ฌ์ผ ํฉ๋๋ค. ๋ฐ๋๋ก B๊ฐ ์ฝ๊ณ ๋์ ์ญ์ ํ๋๋ผ๋ A์ ๋ณด๋ธ ๋ด์ญ์๋ ๋จ์์์ด์ผ ํ์ฃ .
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฐ์ดํฐ์ ๋ฌผ๋ฆฌ์ ์ญ์ (DELETE ์ฟผ๋ฆฌ)๋ฅผ ์ฆ์ ์ํํ์ง ์๊ณ , ๋
ผ๋ฆฌ์ ์ญ์ (Soft Delete) ๋ฐฉ์์ ๋์
ํ์ต๋๋ค.
์ชฝ์ง ํ
์ด๋ธ ์คํค๋ง์ ๋ ๊ฐ์ Boolean(์ฐธ/๊ฑฐ์ง) ์ปฌ๋ผ์ ์ถ๊ฐํ์ต๋๋ค.
deleted_by_sender(๋ณด๋ธ ์ฌ๋์ด ์ญ์ ํ๋๊ฐ? / ๊ธฐ๋ณธ๊ฐ: False)deleted_by_receiver(๋ฐ์ ์ฌ๋์ด ์ญ์ ํ๋๊ฐ? / ๊ธฐ๋ณธ๊ฐ: False)
์ ์ ๊ฐ ์ญ์ ๋ฒํผ์ ๋๋ฅด๋ฉด ํด๋น ์ํ๊ฐ๋ง True๋ก ์
๋ฐ์ดํธ(Update)๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ์ ์ ๋ชจ๋๊ฐ ์ญ์ ๋ฒํผ์ ๋๋ฌ ๋ ์ปฌ๋ผ์ด ๋ชจ๋ True๊ฐ ๋๋ ์๊ฐ, ๋ฐฑ๊ทธ๋ผ์ด๋ ํ์คํฌ๊ฐ ์ด๋ฅผ ๊ฐ์งํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์๊ตฌ์ ์ผ๋ก ๋ฌผ๋ฆฌ์ ์ญ์ ๋ฅผ ์งํํ๋๋ก ๋ก์ง์ ๊ตฌํํ์ต๋๋ค. ์ด ์ค๊ณ๋ฅผ ํตํด ์๋ฒ ์ฉ๋ ๋ญ๋น๋ฅผ ๋ง์ผ๋ฉด์๋ ์๋ฒฝํ 1:1 ๋ฉ์์ง ๊ฒฝํ์ ์ ๊ณตํ ์ ์๊ฒ ๋์์ต๋๋ค.
2. N+1 ์ฟผ๋ฆฌ ๋ฌธ์ ๊ทน๋ณต๊ณผ ์ฑ๋ฅ ์ต์ ํ
์ชฝ์ง ๋ชฉ๋ก์ ๋ถ๋ฌ์ฌ ๋ ๊ฐ์ฅ ํํ๊ฒ ๋ฐ์ํ๋ ๋ฐฑ์๋ ์ฑ๋ฅ ์ ํ ์์ธ์ ๋ฐ๋ก 'N+1 ์ฟผ๋ฆฌ ๋ฌธ์ '์ ๋๋ค. ๋ฐ์ ์ชฝ์ง๊ฐ 20๊ฐ์ผ ๋, ์ชฝ์ง ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ฟผ๋ฆฌ 1๋ฒ๊ณผ, ๊ฐ ์ชฝ์ง๋ฅผ ๋ณด๋ธ ์ฌ๋์ ๋๋ค์๊ณผ ํ๋กํ ์ฌ์ง์ ๊ฐ์ ธ์ค๊ธฐ ์ํด ์ ์ ํ ์ด๋ธ์ ์กฐํํ๋ ์ฟผ๋ฆฌ 20๋ฒ์ด ์ถ๊ฐ๋ก ๋ฐ์ํ์ฌ ์ด 21๋ฒ์ DB ํต์ ์ด ์ผ์ด๋๋ ๋์ฐํ ํ์์ ๋๋ค. ํธ๋ํฝ์ด ๋ชฐ๋ฆฌ๋ฉด ์๋ฒ๊ฐ ๋ป์ด๋ฒ๋ฆฌ๋ ์ฃผ๋ฒ์ด์ฃ .
์ ๋ FastAPI์ ๋น๋๊ธฐ SQLAlchemy์ ๊ฐ์ ์ ์ด๋ ค selectinload์ joinedload ๊ฐ์ Eager Loading(์ฆ์ ๋ก๋ฉ) ๊ธฐ๋ฒ์ ํ์ฉํ์ต๋๋ค. ์ชฝ์ง ๋ฆฌ์คํธ๋ฅผ DB์์ ๋์ด์ฌ ๋, JOIN ์ฐ์ฐ์ ํตํด ์๋๋ฐฉ์ ์ ์ ์ ๋ณด๊น์ง ๋จ ํ ๋ฒ์ ๋น๋๊ธฐ ์ฟผ๋ฆฌ๋ก ๋ชจ๋ ๋ฌถ์ด์ ๊ฐ์ ธ์ค๋๋ก ์ต์ ํํ์ต๋๋ค. ๋๋ถ์ ํ์ด์ง ๋ก๋ฉ ์๋๋ฅผ ๊ธฐ์กด ๋๋น 70% ์ด์ ๋จ์ถ์ํค๋ ์พ๊ฑฐ๋ฅผ ์ด๋ฃจ์์ต๋๋ค.
3. ์ค์๊ฐ ์๋ฆผ์ ๋ง๋ฒ: Server-Sent Events (SSE)์ ๋์
์ชฝ์ง๋ฅผ ๋ฐ์์ ๋, ์ ์ ๊ฐ ์๋ก๊ณ ์นจ(F5)์ ๋๋ฅด๊ธฐ ์ ๊น์ง ์ชฝ์ง๊ฐ ์จ ์ฌ์ค์ ๋ชจ๋ฅธ๋ค๋ฉด ๊ทธ๊ฒ์ '์ฃฝ์ ๊ธฐ๋ฅ'์ด๋ ๋ค๋ฆ์์ต๋๋ค. ์ค์๊ฐ ์๋ฆผ์ ๊ตฌํํ๊ธฐ ์ํด ์น์์ผ(WebSockets)๊ณผ SSE(Server-Sent Events)๋ฅผ ๋๊ณ ๊น์ ๊ณ ๋ฏผ์ ํ์ต๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก ์ ๋ SSE(Server-Sent Events) ๊ตฌ์กฐ๋ฅผ ์ฑํํ์ต๋๋ค. ์๋ฐฉํฅ ํต์ ์ด ๊ณ์ ์ ์ง๋์ด์ผ ํ๋ ์ฑํ ๋ฐฉ์ด๋ผ๋ฉด ์น์์ผ์ด ๋ง๊ฒ ์ง๋ง, ์ชฝ์ง ์์คํ ์ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์๊ฒ "๋์๊ฒ ์๋ก์ด ์ชฝ์ง๊ฐ ๋์ฐฉํ์ด!"๋ผ๊ณ ๋จ๋ฐฉํฅ์ผ๋ก ํธ์(Push)๋ง ํด์ฃผ๋ฉด ์ถฉ๋ถํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ์ฌ ๊ตฌ์ถ๋ Redis Pub/Sub ํ๊ฒฝ์ SSE ํ์ดํ๋ผ์ธ์ ์ฐ๊ฒฐํ์ฌ, ๋๊ตฐ๊ฐ ์ชฝ์ง๋ฅผ ์ ์กํ๋ฉด ์์ ์์ ๋ธ๋ผ์ฐ์ ์ฐ์ธก ํ๋จ์ ์ฆ๊ฐ์ ์ผ๋ก ํ ์คํธ(Toast) ํ์ ์ด ๋จ๋๋ก ๊ตฌํํ์ต๋๋ค. ์๋ฒ ์์์ ํจ์ฌ ์ ๊ฒ ๋จน์ผ๋ฉด์๋ ์ ์ ์๊ฒ๋ ์ค์๊ฐ ์ฑํ ๊ณผ ๊ฐ์ ์พ์ ํ UX๋ฅผ ์ ๊ณตํฉ๋๋ค.
4. ๋ณด์ ์ฒ ์น: XSS ๊ณต๊ฒฉ ์์ฒ ์ฐจ๋จ
์ปค๋ฎค๋ํฐ์์ ์ ์ ๊ฐ ํ
์คํธ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ธฐ๋ฅ์ ๋ง๋ค ๋ ๊ฐ๋ฐ์๊ฐ ๊ฐ์ฅ ๋๋ ค์ํ๋ ๊ฒ์ ํฌ๋ก์ค ์ฌ์ดํธ ์คํฌ๋ฆฝํ
(XSS) ๊ณต๊ฒฉ์
๋๋ค. ์
์์ ์ธ ์ ์ ๊ฐ ์ชฝ์ง ๋ด์ฉ์ <script> ํ๊ทธ๋ฅผ ๋ชฐ๋ ์ฌ์ด์ ์๋๋ฐฉ์๊ฒ ๋ณด๋ด๊ณ , ์๋๋ฐฉ์ด ์ชฝ์ง๋ฅผ ์ฌ๋ ์๊ฐ ์ธ์
์ฟ ํค๊ฐ ํ์ทจ๋นํ ์ ์๋ ์์ฃผ ์ํํ ์ทจ์ฝ์ ์
๋๋ค.
์ด๋ฅผ ๋ฐฉ์ดํ๊ธฐ ์ํด ์ชฝ์ง๊ฐ ์๋ฒ๋ก ๋ค์ด์ค๋ ์ฆ์, ๋ฐฑ์๋์์ nh3 ๊ฐ์ HTML ์ด๊ท (Sanitization) ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ํ์ฉ๋ ์์ ํ ํ
์คํธ๋ง ๋จ๊ธฐ๊ณ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ๊ทธ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ(onclick ๋ฑ)๋ฅผ ๊ฐ์ ๋ก ๋ฏ์ด๋ด๋ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค. ์๋ฌด๋ฆฌ ์ ๊ตํ๊ฒ ์ฝ๋๋ฅผ ๊ผฌ์์ ์ชฝ์ง๋ฅผ ๋ณด๋ด๋๋ผ๋ ์๋ฒ๋จ์์ ์๋ฒฝํ๊ฒ ์ธํ๋์ด ์์ํ ๋ฌธ์์ด๋ก๋ง ์ ๋ฌ๋๋, ๋ชจ๋ ํ์๋๋ค๊ป์๋ ์์ฌํ๊ณ ์ชฝ์ง ๊ธฐ๋ฅ์ ์ด์ฉํ์
๋ ์ข์ต๋๋ค.
๋งบ์ผ๋ฉฐ: ์ปค๋ฎค๋ํฐ๋ ๊ณ์ ์งํํฉ๋๋ค
์ด๋ฒ ์ค์๊ฐ ์ชฝ์ง ๊ธฐ๋ฅ ์ ๋ฐ์ดํธ๋ ๋จ์ํ ๋ฉ๋ด ํ๋๊ฐ ์ถ๊ฐ๋ ๊ฒ์ ๋์ด, ์ฐ๋ฆฌ ์ปค๋ฎค๋ํฐ๊ฐ ์ ๋ณด๋ฅผ ์๋นํ๋ '๊ฒ์ํ'์์ ์ฌ๋๊ณผ ์ฌ๋์ด ๊ต๋ฅํ๋ '์ง์ ํ ๋คํธ์ํฌ'๋ก ํ ๋จ๊ณ ์งํํ์์ ์๋ฏธํฉ๋๋ค.
์ด์ ์ ์ตํ IT ์นผ๋ผ์ ์ด ์ ์ ์๊ฒ ๊ฐ์ธ์ ์ผ๋ก ๊ฐ์ฌ๋ฅผ ํํ๊ฑฐ๋, ๋ง์์ด ๋ง๋ ํ์๋ค๊ณผ ์์ํ ์ผ์์ ๋ ๊น๊ฒ ๋๋ ๋ณด์ธ์. ์์ผ๋ก๋ ์๋ฒ ๋ฐฑ์๋์ ์ฑ๋ฅ์ ๊ทนํ์ผ๋ก ๊น๊ณ ๋ค๋ฌ์ด, ์ฌ๋ฌ๋ถ์ด ์ฌ์ดํธ์ ๋จธ๋ฌด๋ ๋ชจ๋ ์๊ฐ์ด ๋น ๋ฅด๊ณ ์พ์ ํ ์ ์๋๋ก 1์ธ ๊ฐ๋ฐ์์ ๋ฐค์ ์ฝ๋ฉ์ ๊ณ์๋ฉ๋๋ค.
์๋กญ๊ฒ ์ถ๊ฐ๋ ์ชฝ์ง ๊ธฐ๋ฅ ์ฌ์ฉ ์ค ๋ฒ๊ทธ๋ ๋ถํธํ ์ , ํน์ ์ถ๊ฐ๋์์ผ๋ฉด ํ๋ ๊ธฐ๋ฅ์ด ์๋ค๋ฉด ์ธ์ ๋ ์ง ํผ๋๋ฐฑ ๋จ๊ฒจ์ฃผ์๊ธธ ๋ฐ๋๋๋ค. ๊ฐ์ฌํฉ๋๋ค!
๐ฌ ๋๊ธ 0๊ฐ