๋ฌธ์ ์ดํด ๋ฐ ์ค๊ณ ๋ฒ์ ํ์
์ด ์์คํ ์ ๊ธฐ๋ณธ์ ๊ธฐ๋ฅ์ ์๋์ ๊ฐ๋ค.
- URL ๋จ์ถ: ์ฃผ์ด์ง ๊ธด URL์ ํจ์ฌ ์งง๊ฒ ์ค์ธ๋ค.
- URL ๋ฆฌ๋๋ ์ (redirection): ์ถ์ฝ๋ URL๋ก HTTP ์์ฒญ์ด ์ค๋ฉด ์๋ URL๋ก ์๋ด
- ๋์ ๊ฐ์ฉ์ฑ๊ณผ ๊ท๋ชจ ํ์ฅ์ฑ, ๊ทธ๋ฆฌ๊ณ ์ฅ์ ๊ฐ๋ด๊ฐ ์๊ตฌ๋จ
๊ฐ๋ต์ ์ถ์
- ์ฐ๊ธฐ ์ฐ์ฐ: ๋งค์ผ 1์ต ๊ฐ์ ๋จ์ถ URL ์์ฑ
- ์ด๋น ์ฐ๊ธฐ ์ฐ์ฐ: 1์ต(100million) / 24 / 3600 = 1160
- ์ฝ๊ธฐ ์ฐ์ฐ: ์ฝ๊ธฐ ์ฐ์ฐ๊ณผ ์ฐ๊ธฐ ์ฐ์ฐ ๋น์จ์ 10:1์ด๋ผ๊ณ ํ์. ๊ทธ ๊ฒฝ์ฐ ์ฝ๊ธฐ ์ฐ์ฐ์ ์ด๋น 11,600ํ ๋ฐ์ํ๋ค(1160 × 10 = 11,600).
- URL ๋จ์ถ ์๋น์ค๋ฅผ 10๋ ๊ฐ ์ด์ํ๋ค๊ณ ๊ฐ์ ํ๋ฉด 1์ต(100million) × 365 × 10 = 3650์ต(365billion) ๊ฐ์ ๋ ์ฝ๋๋ฅผ ๋ณด๊ดํด์ผ ํ๋ค.
- ์ถ์ฝ ์ URL์ ํ๊ท ๊ธธ์ด๋ 100์ด๋ผ๊ณ ํ์.
- ๋ฐ๋ผ์ 10๋ ๋์ ํ์ํ ์ ์ฅ ์ฉ๋์ 3650์ต(365billion) × 100๋ฐ์ดํธ = 36.5TB์ด๋ค.
๊ฐ๋ต์ ์ค๊ณ์ ์ ์ ๋ฐ ๋์ ๊ตฌํ๊ธฐ
1. API endpoint
ํด๋ผ์ด์ธํธ๋ ์๋ฒ๊ฐ ์ ๊ณตํ๋ API ์๋ํฌ์ธํธ๋ฅผ ํตํด ์๋ฒ์ ํต์ ํ๋ค.
์ฐ๋ฆฌ๋ ์๋ํฌ์ธํธ๋ฅผ REST ์คํ์ผ๋ก ์ค๊ณํด๋ณด์. RESTful API [1]
URL ๋จ์ถ๊ธฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋๊ฐ์ ์๋ํฌ์ธํธ๋ฅผ ํ์๋ก ํ๋ค.
1) URL ๋จ์ถ์ฉ ์๋ํฌ์ธํธ : ์ ๋จ์ถ URL ์ ์์ฑํ๊ณ ์ ํ๋ ํด๋ผ์ด์ธํธ๋ ์ด ์๋ํฌ์ธํธ์ ๋จ์ถํ URL์ ์ธ์๋ก ์ค์ด์ POST์์ฒญ์ ๋ณด๋ด์ผํ๋ค. ์ด ์๋ํฌ์ธํธ๋ ๋ค์๊ณผ ๊ฐ์ ํํ๋ฅผ ๋๋ค.

2) URL ๋๋ฆฌ๋ ์ ์ฉ ์๋ํฌ์ธํธ : ๋จ์ถ URL์ ๋ํด์ HTTP์์ฒญ์ด ์ค๋ฉด ์๋ URL๋ก ๋ณด๋ด์ฃผ๊ธฐ ์ํ ์ฉ๋์ ์๋ํฌ์ธํธ

2. URL ๋ฆฌ๋๋ ์

๋ธ๋ผ์ฐ์ ์ ๋จ์ถ URL์ ์ ๋ ฅํ๋ฉด ์์ ๊ฐ์ ์ผ์ด ์๊ธด๋ค.
๋จ์ถ URL์ ๋ฐ์ ์๋ฒ๋ ๊ทธ URL์ ์๋ URL๋ก ๋ฐ๊ฟ์ 301์๋ต์ Location์ ํค๋์ ๋ฃ์ด์ ๋ฐํํ๋ค.

- 301 Permanently Moved : ์ด ์๋ต์ ํด๋น URL์ ๋ํ HTTP ์์ฒญ์ ์ฒ๋ฆฌ ์ฑ ์์ด ์๊ตฌ์ ์ผ๋ก Location ํค๋์ ๋ฐํ๋ URL๋ก ์ด์ ๋์๋ค๋ ์๋ต์ด๋ค. ์๊ตฌ์ ์ด์ ๋์์ผ๋ฏ๋ก, ๋ธ๋ผ์ฐ์ ๋ ์ด ์๋ต์ ์บ์ํ๋ค. ์ถํ ๊ฐ์ URL์ ์์ฒญ์ ๋ณด๋ผ ํ์๊ฐ ์์๋ ๋ธ๋ผ์ฐ์ ๋ ์บ์๋ ์๋ URL๋ก ์์ฒญ์ ๋ณด๋ด๊ฒ ๋๋ค.
-- ์๋ฒ ๋ถํ๋ฅผ ์ค์ฌ์ค๋ค. ์ฒซ๋ฒ์งธ ์์ฒญ๋ง ๋จ์ถ URL๋ก ์ ์ก๋๊ธฐ ๋๋ฌธ์ด๋ค.
- 302 Found : ์ด ์๋ต์ ์ฃผ์ด์ง URL๋ก์ ์์ฒญ์ด '์ผ์์ '์ผ๋ก Location ํค๋๊ฐ ์ง์ ํ๋ URL์ ์ํด์ ์ฒ๋ฆฌ๋์ด์ผ ํ๋ค๋ ์๋ต.
ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ธ์ ๋ ๋จ์ถ URL์๋ฒ์ ๋จผ์ ๋ณด๋ด์งํ์ ์๋ URL๋ก ๋ฆฌ๋๋ ์ ๋์ด์ผ ํ๋ค
-- ํธ๋ํฝ ๋ถ์์ ์ฉ์ดํ๋ค.
ํด์ ํ ์ด๋ธ์ <๋จ์ถ URL, ์๋URL> ์ ์์ ์ ์ฅํ๋ค๊ณ ๊ฐ์ ํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ด URL ๋ฆฌ๋๋ ์ ์ด ๊ตฌํ๋ ์ ์๋ค.
- ์๋ URL = hastTable.get(๋จ์ถ URL)
- 301 ๋๋ 302 ์๋ต Location ํค๋์ ์๋ URL์ ๋ฃ์ ํ์ ์ก
3. URL ๋จ์ถ ํ๋ก
๋จ์ถ URl์ด www.tinyurl.com/{hashValue} ๊ฐ์ ํํ๋ก๋ณด๋ฉด, ๊ฒฐ๊ตญ ๊ธด URl์ ์ด ํด์ ๊ฐ์ผ๋ก ๋์ํ๋ ํด์ ํจ์f ๋ฅผ ์ฐพ๋ ์ผ์ด๋ค.


- ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ๊ธด URL ์ด ๋ค๋ฅธ ๊ฐ์ด๋ฉด ํด์ ๊ฐ๋ ๋ฌ๋ผ์ผ ํ๋ค.
- ๊ณ์ฐ๋ ํด์ ๊ฐ์ ์๋ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ก๋ ๊ธด URL๋ก ๋ณต์๋ ์ ์์ด์ผ ํ๋ค.
์์ธ ์ค๊ณ
๋ฐ์ดํฐ ๋ชจ๋ธ
ํด์ ํ ์ด๋ธ์ ๋ชจ๋ ๊ฐ๋ต์ ์ค๊ณ๋ฅผ ๋๋๊ฑด์ค์ ์์คํ ์ ์ฐ๊ธด ๊ณค๋ํ๋ค. ๋๋ฌด ๋น์ธ๊ธฐ ๋๋ฌธ์ด๋ค.
<๋จ์ถ URL, ์๋URL>์ ์์์์ ๊ด๊ณํ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์ ์ฅํ๋๊ฒ์ด๋ค.
ํด์ ํจ์
ํด์ ํจ์(hash function)๋ ์๋ URL์ ๋จ์ถ URL๋ก ๋ณํํ ๋ ์ด๋ค. ํด์ ํจ์๊ฐ ๊ณ์ฐํ๋ ๋จ์ถ URL ๊ฐ์ hashValue๋ผ๊ณ ํ๋ค.
ํด์ ๊ฐ ๊ธธ์ด
hashValue [0-9, a-z, A-Z] ๋ก ๊ตฌ์ฑ๋๋ค. 10+26+26=62๊ฐ ๋ฌธ์ ๊ฐ์๋ค. ๊ธธ์ด๋ 62^n >= 3650์ต(365 billion)์ธ n์ ์ต์๊ฐ์ ์ฐพ๋๋ค. ์ด ์์คํ ์ 3650๊ฐ์ url์ ๋ง๋ค์ด ๋ผ ์ ์์ด์ผ ํ๋ค.
-hashValue์ ๊ธธ์ด์, ํด์ ํจ์๊ฐ ๋ง๋ค์ด ๋ผ ์ ์๋ URL๊ฐ์ ์ฌ์ด์ ๊ด๊ณ ์์๋ก, n=7์ 3.5์กฐ๊ฐ URL์ ๋ง๋ค ์ ์๋ค.

ํด์ ํจ์ ๊ตฌํ์ ์ฐ์ด๋ ๊ธฐ์ 2๊ฐ์ง, ํด์ ํ ์ถฉ๋ ํด์ ๋ฐฉ๋ฒ. ๋ค๋ฅธ ํ๋๋ base-62 ๋ณํ ๋ฐฉ๋ฒ
1. ํด์ ํ ์ถฉ๋ ํด์
๊ธด URl์ ์ค์ด๋ ค๋ฉด, ์๋ URL์ 7๊ธ์ ๋ฌธ์์ด๋ก ์ค์ด๋ ํด์ ํจ์๊ฐ ํ์ํ๋ค. ์๋๋ https://en.wikipedia.org/wiki/Systems_design์์ ์ถ์ฝํ ๊ฒฐ๊ณผ์ด๋ค.

์ถฉ๋ํ๋ฉด, ํด์ ๊ฒฐ๊ณผ๊ฐ ์ถฉ๋์ด ์๋ฐ์ํ ๋๊น์ง, ์ฌ์ ์ ์ ํ ๋ฌธ์์ด์ ํด์์ ๋ง๋ถ์ธ๋ค. ๋ธ๋ฃธ ํํฐ[2] ํ๋ฅ ๋ก ์ ๊ธฐ์ดํ ๊ณต๊ฐ ํจ์จ์ด ์ข์ ๊ธฐ์ ์ด๋ค.

2. base-62 ๋ณํ ๋ฐฉ๋ฒ
์ง๋ฒ ๋ณํ(base conversion) ์ URL ๋จ์ถ๊ธฐ ๊ตฌํ์ ํํ ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ์ด๋ค.


URL ๋จ์ถ๊ธฐ ์์ธ ์ค๊ณ
URL ๋จ์ถ๊ธฐ๋ ์์คํ ์ ํต์ฌ ๊ตฌ์ฑ์์ผ๋ก ์ฒ๋ฆฌ ํ๋ฆ์ด ๋ ผ๋ฆฌ์ ์ผ๋ก ๋จ์ํ๊ณ , ๊ธฐ๋ฅ์ ์ผ๋ก ์ธ์ ๋ ๋์ํด์ผํ๋ค. 62์ง๋ฒ ๋ณํ ๊ธฐ๋ฒ์ ์ฌ์ฉํด ์ค๊ณํ ๊ฒ์ด๋ค.

๊ธด๊ฑธ ๋ฐ๋๋ค.
db์ ํด๋น url์๋์ง ์ฒดํฌ
db์ ์์ผ๋ฉด ํด๋น url์ ๋ํ ๋จ์ถ url์ ๋ง๋ ์ ์ด ์๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ db์์ ๋จ์ถurl์ ๊ฐ์ ธ์์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํํ๋ค.
db์ ์์ผ๋ฉด, ํด๋น url์ ์๋ก ์ ์ํ๊ฒ์ผ๋ก ์ ์ผํ ID๋ฅผ ์์ฑํ๋ค. ID๋ db์ ๊ธฐ๋ณธํค๋ก ์ฌ์ฉ๋๋ค.
62์ง๋ฒ ๋ณํ์์ ์ฉ, ID๋ ๋จ์ถ URL๋ก ๋ง๋ ๋ค.
ID, ๋จ์ถ URL, ์๋ URL๋ก ์ DB๋ ์ฝ๋๋ฅผ ๋ง๋ ํ ๋จ์ถ URL์ ํด๋ผ์ด์ธํธ ํํ ์ ๋ฌํ๋ค.

์ด ID๋ ๋จ์ถ URL์ ๋ง๋ค๋ ์ฌ์ฉํ ID๋ฅผ ๋ง๋ค๊ณ , ์ ์ญ์ ์ ์ผ์ฑ์ด ๋ณด์ฅ๋์ด์ผ ํ๋ค.
๊ณ ๋ ๋ถ์ฐ๋ ํ๊ฒฝ์์ ์ด๋ฐ ์์ฑ๊ธฐ๋ ์ด๋ ต์ง๋ง, 7์ฅ์ ๋ค์ ํ์ธํด๋ณด๋ฉด๋๋ค.
URL ๋ฆฌ๋๋ ์ ์์ธ ์ค๊ณ
์ฐ๊ธฐ๋ณด๋ค ์ฝ๊ธฐ๋ฅผ ๋ ์์ฃผ ํ๋ ์์คํ ์ด๋ผ <๋จ์ถURL, ์๋URL>์ ์์์บ์์ ์ ์ฅํ์ฌ ์ฑ๋ฅ์ ๋์๋ค.

์ฌ์ฉ์๊ฐ ๋จ์ถ URL์ ํด๋ฆญํ๋ค.
๋ก๋ ๋ฐธ๋ฐ์๊ฐ ํด๋น ํด๋ฆญ์ผ๋ก ๋ฐ์ํ ์์ฒญ์ ์น์๋ฒ์ ์ ๋ฌํ๋ค.
๋จ์ถ URL์ด ์ด๋ฏธ ์บ์์ ์์ผ๋ฉด ์๋ URL์ ๋ฐ๋ก ๊บผ๋ด์ ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌํ๋ค.
์บ์์ ํด๋น URL๋จ์ถ์ด ์์ผ๋ฉด DB์์ ๊บผ๋ธ๋ค. DB์ ์๋ค๋ฉด ์๋ชป๋ ๋จ์ถ URL์ ์ ๋ ฅํ ๊ฒฝ์ฐ์ผ ๊ฒ์ด๋ค.
DB์์ ๊บผ๋ธ URL์ ์บ์์ ๋ฃ์ ํ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํํ๋ค.
๋ง๋ฌด๋ฆฌ
- ์ฒ๋ฆฌ์จ ์ ํ ์ฅ์น(rate limiter): ์ง๊ธ๊น์ง ์ดํด๋ณธ ์์คํ ์ ์์ฒญ๋ ์์ URL ๋จ์ถ ์์ฒญ์ด ๋ฐ๋ ค๋ค ๊ฒฝ์ฐ ๋ฌด๋ ฅํ๋ ์ ์๋ค๋ ์ ์ฌ์ ๋ณด์ ๊ฒฐํจ์ ๊ฐ๊ณ ์๋ค. ์ฒ๋ฆฌ์จ ์ ํ ์ฅ์น๋ฅผ ๋๋ฉด, IP ์ฃผ์๋ฅผ ๋น๋กฏํ ํํฐ๋ง ๊ท์น(filtering rule)๋ค์ ์ด์ฉํด ์์ฒญ์ ๊ฑธ๋ฌ๋ผ ์ ์์ ๊ฒ์ด๋ค. ์ฒ๋ฆฌ์จ ์ ํ ์ฅ์น์ ๋ํด์๋ 4์ฅ์์ ๋ค๋ฃฌ ๋ฐ ์๋ค. ๊ธฐ์ต์ด ๊ฐ๋ฌผ๊ฐ๋ฌผํ๋ค๋ฉด ๋ค์ ํ๋ฒ ์ดํด๋ณด๋๋ก ํ์.
- ์น ์๋ฒ์ ๊ท๋ชจ ํ์ฅ: ๋ณธ ์ค๊ณ์ ํฌํจ๋ ์น ๊ณ์ธต์ ๋ฌด์ํ(stateless) ๊ณ์ธต์ด๋ฏ๋ก, ์น ์๋ฒ๋ฅผ ์์ ๋ก์ด ์ฆ์คํ๊ฑฐ๋ ์ญ์ ํ ์ ์๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ท๋ชจ ํ์ฅ: ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค์คํํ๊ฑฐ๋ ์ค๋ฉ(sharding)ํ์ฌ ๊ท๋ชจ ํ์ฅ์ฑ์ ๋ฌ์ฑํ ์ ์๋ค.
- ๋ฐ์ดํฐ ๋ถ์ ์๋ฃจ์ (analytics): ์ฑ๊ณต์ ์ธ ๋น์ฆ๋์ค๋ฅผ ์ํด์๋ ๋ฐ์ดํฐ๊ฐ ์ค์ํ๋ค. URL ๋จ์ถ๊ธฐ์ ๋ฐ์ดํฐ ๋ถ์ ์๋ฃจ์ ์ ํตํฉํด ๋๋ฉด ์ด๋ค ๋งํฌ๋ฅผ ์ผ๋ง๋ ๋ง์ ์ฌ์ฉ์๊ฐ ํด๋ฆญํ๋์ง, ์ธ์ ์ฃผ๋ก ํด๋ฆญํ๋์ง ๋ฑ ์ค์ํ ์ ๋ณด๋ฅผ ์์๋ผ ์ ์์ ๊ฒ์ด๋ค.
- ๊ฐ์ฉ์ฑ, ๋ฐ์ดํฐ ์ผ๊ด์ฑ, ์์ ์ฑ: ๋๊ท๋ชจ ์์คํ ์ด ์ฑ๊ณต์ ์ผ๋ก ์ด์๋๊ธฐ ์ํด์๋ ๋ฐ๋์ ๊ฐ์ถ์ด์ผ ํ ์์ฑ๋ค์ด๋ค. ์ด์ ๋ํด์๋ 1์ฅ์์ ์์ธํ ๋ค๋ฃจ์๋ค. ๊ธฐ์ต์ ๋์ด๋ฆฌ๊ณ ์ถ๋ค๋ฉด ๋ค์ ํ๋ฒ ์ฝ์ด๋ณด๋๋ก ํ์.
์ด๋ฒ ์ฅ๋ ์ฑ๊ณต์ ์ผ๋ก ๋ง์น ์ฌ๋ฌ๋ถ, ์ถํํ๋ค. ๋ฉ์ง๊ฒ ๋ง๋ฌด๋ฆฌํ ์ค์ค๋ก๋ฅผ ๋ง์๊ป ๊ฒฉ๋ คํ๋๋ก ํ์!
์ฐธ๊ณ ๋ฌธํ
[1] A RESTful Tutorial: https://www.restapitutorial.com/index.html
[2] Bloom filter: https://en.wikipedia.org/wiki/Bloom_filter
'๐ฉโ๐ปDeveloper ๐ก > ๐พBack-end๐๏ธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ๋ฉ์ธ์ง ํ (0) | 2026.06.21 |
|---|---|
| ๋ด์ค ํผ๋ ์์คํ ์ค๊ณ (0) | 2026.06.20 |
| ๋ถ์ฐ ์์คํ ์ ์ํ ์ ์ผ ID ์์ฑ๊ธฐ ์ค๊ณ (0) | 2026.06.20 |
| ์ฒ๋ฆฌ์จ ์ ํ ์ฅ์น์ ์ค๊ณ (0) | 2026.06.20 |
| ๐ ์์คํ ๋์์ธ & AI ํ์ดํ๋ผ์ธ ํ์ต ์ง๋ํ (0) | 2026.06.20 |