Design URL Shortening Service
์๊ตฌ์ฌํญ ๋ฐ ๊ฐ๋ต์ ์ถ์
URL ์ ๋ ฅ ๋ฐ์ ๋จ์ถ URL ์์ฑ ๋ฐ ์ ์ ์ ์๋ URL๋ก ๋ฆฌ๋ค์ด๋ ํธ
๋งค์ผ 1์ต ๊ฐ ์ด์ ์์ฑ ๊ฐ๋ฅ
์ซ์ ๋ฐ ์๋ฌธ์(0-9, a-z, A-Z) 62๊ฐ๋ก ๊ตฌ์ฑ๋ ๋จ์ถ URL ์์ฑ
URL ๋จ์ถ ์๋น์ค๋ ์์ ๊ฐ์ ์๊ตฌ์ฌํญ์ ๋ง์กฑํด์ผํ ๋, ์๋์ ๊ฐ์ด ์ถ์ ํด๋ณผ ์ ์๋ค.
์ด๋น ์ฐ๊ธฐ ์ฐ์ฐ: 1์ต / 24 / 60 / 60 = 1157
์ด๋น ์ฝ๊ธฐ ์ฐ์ฐ: (์ฝ๊ธฐ/์ฐ๊ธฐ ๋น์จ 10:1์ด๋ผ ๊ฐ์ )11570
๋ ์ฝ๋ ์: (10๋ ์ด์ ๊ธฐ์ค) 1์ต * 365 * 10 = 3650์ต
์ ์ฅ ์ฉ๋: (URL ํ๊ท ๊ธธ์ด 100 ๊ฐ์ ) 3650์ต * 100 = 3650์ต * 100B = 36.5TB
๊ธฐ๋ฅ ์ ์
ํด๋ผ์ด์ธํธ์๊ฒ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ์ํด RESTful API๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
URL ๋จ์ถ ์์ฑ: ์ ๋จ์ถ URL ์์ฑ์ ์ํด ์๋ URL์ ์ ๋ ฅ๋ฐ์ ๋จ์ถ URL์ ๋ฐํ
POST /api/v1/data/shorten
์ธ์:
{longUrl: longURLstring}
๋ฐํ: ๋จ์ถ URL
๋จ์ถ URL ๋ฆฌ๋ค์ด๋ ํธ: ๋จ์ถ URL์ ์ ๋ ฅ๋ฐ์ ์๋ URL๋ก ๋ฆฌ๋ค์ด๋ ํธ
GET /api/v1/{shortUrl}
๋ฐํ: ์๋ URL 301 ์๋ต์ Location ํค๋ ๋ฃ์ด ๋ฐํ
301 vs 302 ๋ฆฌ๋ค์ด๋ ํธ
301๊ณผ 302 ์๋ต ์ฝ๋ ๋ชจ๋ ๋ฆฌ๋๋ ์ ์๋ต์ด์ง๋ง, ์๋์ ์ฐจ์ด๊ฐ ์๋ค.
301 Permanently Moved
ํด๋น URL์ ๋ํ HTTP ์์ฒญ์ ์ฒ๋ฆฌ ์ฑ ์์ด ์๊ตฌ์ ์ผ๋ก Location ํค๋์ ๋ฐํ๋ URL๋ก ์ด์ ๋จ์ ์๋ฏธ
์๊ตฌ์ ์ผ๋ก ์ด์ ๋์์ผ๋ฏ๋ก, ๋ธ๋ผ์ฐ์ ๋ ํด๋น ์๋ต์ ์บ์ํ๊ณ , ์ดํ์ ๊ฐ์ ์์ฒญ์ด ๋ฐ์ํ๋ฉด ์บ์๋ ์๋ต์ ์ฌ์ฉ
์บ์ฑ์ผ๋ก ์ธํด ์๋ฒ ๋ถํ๋ฅผ ์ค์ผ ์ ์์
302 Found
ํด๋น URL์ ๋ํ HTTP ์์ฒญ์ ์ฒ๋ฆฌ ์ฑ ์์ด ์ผ์์ ์ผ๋ก Location ํค๋๊ฐ ์ง์ ํ๋ URL์ ์ํด ์ฒ๋ฆฌ๋์ด์ผ ํจ์ ์๋ฏธ
๋ธ๋ผ์ฐ์ ๋ ์บ์ํ์ง ์๊ณ , ํญ์ ๋จ์ถ URL ์๋ฒ์ ๋จผ์ ๋ณด๋ด์ง ํ ๋ฆฌ๋ค์ด๋ ํธ๋ URL๋ก ์ด๋
ํญ์ ์์ฒญ์ด ์ค๊ธฐ ๋๋ฌธ์, ํธ๋ํฝ ๋ถ์์ด๋ ๋ก๊น ์ ์ ์ฉ
๋ฐ์ดํฐ ๋ชจ๋ธ
URL ๋จ์ถ์ ๊ตฌํํ๋ ๊ฐ์ฅ ์ง๊ด์ ์ธ ๋ฐฉ๋ฒ์ ํด์ ํ ์ด๋ธ์ ์ฌ์ฉํ๋ ๊ฒ์ด์ง๋ง, ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ํํ๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ์ ์ฉํ๊ธฐ์ ํ๊ณ๊ฐ ์๋ค. ๋๋ฌธ์ <๋จ์ถ URL, ์๋ URL> ์์์์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์๋ค.
id: PK
shortUrl: ๋จ์ถ URL
longUrl: ์๋ URL
etc: ์์ฑ ๋ ์ง, ๋ง๋ฃ ๋ ์ง, ํด๋ฆญ ์ ๋ฑ
ํด์ ํจ์
URL ๋จ์ถ์ ํ๊ธฐ ์ํด ๊ฐ์ฅ ์ค์ํ ๊ฒ์ URL์ ํน์ ํด์ ๊ฐ์ผ๋ก ๋์์ํฌ ํด์ ํจ์๋ฅผ ์ ํํ๋ ๊ฒ์ด๋ค. ํด๋น ํด์ ํจ์๋ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ ๊ฐ์ ธ์ผ ํ๋ค.
์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ URL์ด ๋ค๋ฅด๋ฉด ํด์ ๊ฐ๋ ๋ค๋ฅด๊ฒ ์์ฑ
๊ณ์ฐ๋ ํด์ ๊ฐ์ ์๋ ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง URL๋ก ๋ณต์ ๊ฐ๋ฅ
ํด์ ๊ฐ ๊ธธ์ด
๋จ์ถ URL์ ์ฌ์ฉํ ํด์ ๊ฐ์ ๊ธธ์ด๋ ์ผ๋ง๋ ๋ง์ URL์ ๋จ์ถํ ์ ์๋์ง์ ์ํฅ์ ์ค๋ค. ์ฌ์ฉํ ์ ์๋ ๋ฌธ์๋ฅผ 62๊ฐ(0-9, a-z, A-Z)๋ก ๊ฐ์ ํ๋ฉด, n์๋ฆฌ ํด์ ๊ฐ์ 62^n ๊ฐ์ URL์ ๋จ์ถํ ์ ์๋ค.(์๊ตฌ์ฌํญ์ ๋ง๊ฒ n์ ์กฐ์ ) ํด์ ํจ์ ๊ตฌํ์ ์ฐ์ด๋ ๊ธฐ์ ๋ก ๋ ๊ฐ์ง๊ฐ ์๋๋ฐ, ์์ฝํ๋ฉด ์๋์ ๊ฐ๋ค.
๋จ์ถ URL ๊ธธ์ด๊ฐ ๊ณ ์ ๋จ
๋จ์ถ URL ๊ธธ์ด๊ฐ ๊ฐ๋ณ์ (ID ๊ฐ ์์กด)
์ ์ผ์ฑ ๋ณด์ฅ ID ์์ฑ๊ธฐ ๋ถํ์
์ ์ผ์ฑ ๋ณด์ฅ ID ์์ฑ๊ธฐ ํ์
์ถฉ๋์ด ๊ฐ๋ฅํ์ฌ ํด์ ์ ๋ต์ด ํ์
ID ์ ์ผ์ฑ์ด ๋ณด์ฅ๋ ํ ์ ์ฉ ๊ฐ๋ฅํ ์ ๋ต์ด๊ธฐ ๋๋ฌธ์ ์ถฉ๋ ๋ถ๊ฐ๋ฅ
๋ค์ URL ์์ธก ๋ถ๊ฐ๋ฅ
ID ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋๊ธฐ ๋๋ฌธ์ ๋ค์ ๋จ์ถ URL ์์ธก ๊ฐ๋ฅ
ํด์ ํจ์ ๊ตฌํ ๊ธฐ์ 1 - ํด์ ํ ์ถฉ๋ ํด์
๊ธด URl์ ์ค์ด๊ธฐ ์ํด ํด์ ํจ์๊ฐ ํ์ํ๋ฐ, CRC32, MD5, SHA-1๊ฐ์ด ์ ์๋ ค์ง ํด์ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
CRC32
5cb54054
MD5
5a62509a84dfee03fe1230b9df8b84e
SHA-1
0eeae7916c06853901d9ccbefbfcaf4de57ed85b
ํ์ง๋ง ๊ฐ์ฅ ์งง์ ํด์๊ฐ๋ 8๊ธ์๋ก, ๊ทธ ์ดํ์ ๋จ์ถ URL์ ์์ฑํ๊ธฐ ์ํด์ ์๋์ ์ ์ฐจ๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ๊ฑฐ์ณ์ผํ๋ค.
์ฒ์ n๊ฐ ๊ธ์๋ง ์ด์ฉ
ํด์ ๊ฒฐ๊ณผ๊ฐ ์ถฉ๋ํ ์ ์์ผ๋ฏ๋ก DB์ ์กฐํ
์ถฉ๋ํ๋ ๊ฒฝ์ฐ longURL ๋ค์ ์ฌ์ ์ ์ ํ ๋ฌธ์์ด ์ถ๊ฐ
๋ค์ shortURL ์์ฑ
์ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐ์ ํ ์ ์์ง๋ง, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ง์๋ฅผ ํด์ผํ๋ฏ๋ก ์ค๋ฒํค๋๊ฐ ์ปค์ง๊ธฐ ๋๋ฌธ์ ๋ธ๋ฃธ ํํฐ๋ฅผ ์ฌ์ฉํด ํด๊ฒฐํ ์ ์๋ค. (๋ธ๋ฃธ ํํฐ ์ฐธ๊ณ )
ํด์ ํจ์ ๊ตฌํ ๊ธฐ์ 2 - Base62 ๋ณํ
์ง๋ฒ ๋ณํ ๋ฐฉ์์ URL ๋จ์ถ๊ธฐ๋ฅผ ๊ตฌํํ ๋ ํํ ์ฌ์ฉ๋๋ ๋ฐฉ๋ฒ์ผ๋ก, 62์ง๋ฒ์ ์ฐ๋ ์ด์ ๋ ์ด๋ฒ ์๊ตฌ์ฌํญ์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฌธ์๊ฐ 62๊ฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค. Base62 ๋ณํ์ ์๋์ ๊ฐ์ด ์งํ๋๋ค.
0-9: 0-9, 10-35: a-z, 36-61: A-Z๋ก ๋์์์ผ ํํ
11157 = 2 * 62^2 + 55 * 62^1 + 59 * 62^0 = 2, 55, 59 = 2TX
์ด ๋ฐฉ๋ฒ์ ID๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ๊ธฐ ๋๋ฌธ์, ์ ์ผ์ฑ ๋ณด์ฅ ID ์์ฑ๊ธฐ๊ฐ ํ์ํ๋ค๋ ์ ๊ณผ, ID๊ฐ 1์ฉ ์ฆ๊ฐํ๋ ๊ฐ์ด๋ผ๋ฉด ๋ค์ ๋จ์ถ URL์ ์์ธกํ ์ ์์ด ๋ณด์์ ์ทจ์ฝํ๋ค๋ ๋จ์ ์ด ์๋ค.
ํด๋น ๋ฐฉ์์ ํตํด URL ๋จ์ถ๊ธฐ๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด, ์๋์ ์ฒ๋ฆฌ ํ๋ฆ์ ๋ฐ๋ฅด๊ฒ ๋๋ค.
์ ๋ ฅ์ผ๋ก ๊ธด URL์ ๋ฐ์
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํด๋น URL ์กด์ฌ ์ฌ๋ถ ํ์ธ
์กด์ฌํ๋ ๊ฒฝ์ฐ, ํด๋น URL์ ๋ํ ๋จ์ถ URL ๋ฐํ
์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ, ์ ์ผ ID ์์ฑ
ํด๋น ID๋ฅผ Base62 ๋ณํํ์ฌ ๋จ์ถ URL ์์ฑ
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ก์ด ๋จ์ถ URL ์ ์ฅ ํ ๋ฐํ
์ถ๊ฐ ๊ณ ๋ ค ์ฌํญ
์บ์ฑ: ์ฐ๊ธฐ๋ณด๋ค ์ฝ๊ธฐ๋ฅผ ๋ ๋ง์ ์์คํ ์ด๋ฏ๋ก, <Short URL, Long URL> ์์ ์บ์์ ์ ์ฅํ์ฌ ์ฝ๊ธฐ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์
์ฒ๋ฆฌ์จ ์ ํ ์ฅ์น: IP ์ฃผ์๋ฅผ ๋น๋กฏํ ํํฐ๋ง ๊ท์น์ ํตํด ์์ฒญ ์๋ฅผ ์ ํํ์ฌ ํ ๋ฒ์ ๋ง์ ์์ฒญ์ด ๋ค์ด์ค๋ ๊ฒ์ ๋ฐฉ์ง
์น ์๋ฒ ๊ท๋ชจ ํ์ฅ: ๋ฌด์ํ ๊ณ์ธต์ด๋ฏ๋ก, ์น ์๋ฒ๋ฅผ ์ฌ๋ฌ ๋ ๋์ด ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ํตํด ๊ท๋ชจ ํ์ฅ ๊ฐ๋ฅ
๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ท๋ชจ ํ์ฅ: ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ค์คํ๋ ์ค๋ฉ์ ํตํด ๊ท๋ชจ ํ์ฅ ๊ฐ๋ฅ
๋ฐ์ดํฐ ๋ถ์ ์๋ฃจ์ : ํด๋ฆญ ์๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ถ์ํ๊ธฐ ์ํด ๋ฐ์ดํฐ ๋ถ์ ์๋ฃจ์ ์ ์ฌ์ฉํ ์ ์์
์ฐธ๊ณ ์๋ฃ
Last updated
Was this helpful?