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๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. URL ๋‹จ์ถ• ์ƒ์„ฑ: ์ƒˆ ๋‹จ์ถ• URL ์ƒ์„ฑ์„ ์œ„ํ•ด ์›๋ž˜ URL์„ ์ž…๋ ฅ๋ฐ›์•„ ๋‹จ์ถ• URL์„ ๋ฐ˜ํ™˜

    • POST /api/v1/data/shorten

    • ์ธ์ž: {longUrl: longURLstring}

    • ๋ฐ˜ํ™˜: ๋‹จ์ถ• URL

  2. ๋‹จ์ถ• 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์„ ์กฐ์ ˆ) ํ•ด์‹œ ํ•จ์ˆ˜ ๊ตฌํ˜„์— ์“ฐ์ด๋Š” ๊ธฐ์ˆ ๋กœ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, ์š”์•ฝํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

ํ•ด์‹œ ํ›„ ์ถฉ๋Œ ํ•ด์†Œ ์ „๋žตBase62 ๋ณ€ํ™˜

๋‹จ์ถ• URL ๊ธธ์ด๊ฐ€ ๊ณ ์ •๋จ

๋‹จ์ถ• URL ๊ธธ์ด๊ฐ€ ๊ฐ€๋ณ€์ (ID ๊ฐ’ ์˜์กด)

์œ ์ผ์„ฑ ๋ณด์žฅ ID ์ƒ์„ฑ๊ธฐ ๋ถˆํ•„์š”

์œ ์ผ์„ฑ ๋ณด์žฅ ID ์ƒ์„ฑ๊ธฐ ํ•„์š”

์ถฉ๋Œ์ด ๊ฐ€๋Šฅํ•˜์—ฌ ํ•ด์†Œ ์ „๋žต์ด ํ•„์š”

ID ์œ ์ผ์„ฑ์ด ๋ณด์žฅ๋œ ํ›„ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ์ „๋žต์ด๊ธฐ ๋•Œ๋ฌธ์— ์ถฉ๋Œ ๋ถˆ๊ฐ€๋Šฅ

๋‹ค์Œ URL ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅ

ID ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ ๋‹จ์ถ• URL ์˜ˆ์ธก ๊ฐ€๋Šฅ

ํ•ด์‹œ ํ•จ์ˆ˜ ๊ตฌํ˜„ ๊ธฐ์ˆ  1 - ํ•ด์‹œ ํ›„ ์ถฉ๋Œ ํ•ด์†Œ

๊ธด URl์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ํ•ด์‹œ ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•œ๋ฐ, CRC32, MD5, SHA-1๊ฐ™์ด ์ž˜ ์•Œ๋ ค์ง„ ํ•ด์‹œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•ด์‹œ ํ•จ์ˆ˜ํ•ด์‹œ ๊ฒฐ๊ณผ(16์ง„์ˆ˜)

CRC32

5cb54054

MD5

5a62509a84dfee03fe1230b9df8b84e

SHA-1

0eeae7916c06853901d9ccbefbfcaf4de57ed85b

ํ•˜์ง€๋งŒ ๊ฐ€์žฅ ์งง์€ ํ•ด์‹œ๊ฐ’๋„ 8๊ธ€์ž๋กœ, ๊ทธ ์ดํ•˜์˜ ๋‹จ์ถ• URL์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ ์•„๋ž˜์˜ ์ ˆ์ฐจ๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ๊ฑฐ์ณ์•ผํ•œ๋‹ค.

  1. ์ฒ˜์Œ n๊ฐœ ๊ธ€์ž๋งŒ ์ด์šฉ

  2. ํ•ด์‹œ ๊ฒฐ๊ณผ๊ฐ€ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ DB์— ์กฐํšŒ

  3. ์ถฉ๋Œํ•˜๋Š” ๊ฒฝ์šฐ longURL ๋’ค์— ์‚ฌ์ „์— ์ •ํ•œ ๋ฌธ์ž์—ด ์ถ”๊ฐ€

  4. ๋‹ค์‹œ 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 ๋‹จ์ถ•๊ธฐ๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด, ์•„๋ž˜์˜ ์ฒ˜๋ฆฌ ํ๋ฆ„์„ ๋”ฐ๋ฅด๊ฒŒ ๋œ๋‹ค.

  1. ์ž…๋ ฅ์œผ๋กœ ๊ธด URL์„ ๋ฐ›์Œ

  2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ํ•ด๋‹น URL ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ

  3. ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น URL์— ๋Œ€ํ•œ ๋‹จ์ถ• URL ๋ฐ˜ํ™˜

  4. ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ์œ ์ผ ID ์ƒ์„ฑ

  5. ํ•ด๋‹น ID๋ฅผ Base62 ๋ณ€ํ™˜ํ•˜์—ฌ ๋‹จ์ถ• URL ์ƒ์„ฑ

  6. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ƒˆ๋กœ์šด ๋‹จ์ถ• URL ์ €์žฅ ํ›„ ๋ฐ˜ํ™˜

์ถ”๊ฐ€ ๊ณ ๋ ค ์‚ฌํ•ญ

  • ์บ์‹ฑ: ์“ฐ๊ธฐ๋ณด๋‹ค ์ฝ๊ธฐ๋ฅผ ๋” ๋งŽ์€ ์‹œ์Šคํ…œ์ด๋ฏ€๋กœ, <Short URL, Long URL> ์Œ์„ ์บ์‹œ์— ์ €์žฅํ•˜์—ฌ ์ฝ๊ธฐ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ

  • ์ฒ˜๋ฆฌ์œจ ์ œํ•œ ์žฅ์น˜: IP ์ฃผ์†Œ๋ฅผ ๋น„๋กฏํ•œ ํ•„ํ„ฐ๋ง ๊ทœ์น™์„ ํ†ตํ•ด ์š”์ฒญ ์ˆ˜๋ฅผ ์ œํ•œํ•˜์—ฌ ํ•œ ๋ฒˆ์— ๋งŽ์€ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€

  • ์›น ์„œ๋ฒ„ ๊ทœ๋ชจ ํ™•์žฅ: ๋ฌด์ƒํƒœ ๊ณ„์ธต์ด๋ฏ€๋กœ, ์›น ์„œ๋ฒ„๋ฅผ ์—ฌ๋Ÿฌ ๋Œ€ ๋‘์–ด ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ์„ ํ†ตํ•ด ๊ทœ๋ชจ ํ™•์žฅ ๊ฐ€๋Šฅ

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ทœ๋ชจ ํ™•์žฅ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‹ค์ค‘ํ™”๋‚˜ ์ƒค๋”ฉ์„ ํ†ตํ•ด ๊ทœ๋ชจ ํ™•์žฅ ๊ฐ€๋Šฅ

  • ๋ฐ์ดํ„ฐ ๋ถ„์„ ์†”๋ฃจ์…˜: ํด๋ฆญ ์ˆ˜๋‚˜ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ๋ถ„์„ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

์ฐธ๊ณ ์ž๋ฃŒ

Last updated