[개발] 단축 URL 원리 및 개발

2019. 8. 22. 19:55IT/Develop

평소 관심이 많았던 단축 URL의 원리에 대해서 간단하게 정리하고 핵심 기능인 Base62 인코딩 기능을 Python으로 작성해 보았습니다.(인코딩 이외에 나머지 부분은 모두 추상적인 코드입니다.)

HTTP와 Database에 대해 지식이 부족하신 분들은 해당 부분에 대해 선행 학습을 진행하시면 더욱 수월하게 이해하실 수 있습니다.

Short URL 생성 원리

Short URL은 해당 URL을 직접적으로 인코딩하는 방식이 아닌 URL을 DB에 삽입하고 해당 Index를 인코딩하는 방식이다.

인코딩에는 [0-9], [A-Z], [a-z]의 총 62개의 문자로 인코딩이 되어 Base62 인코딩이라 부릅니다.

무조건 제가 사용한 문자들을 사용해야 하는 것은 아니지만, 인코딩에 사용되는 문자의 갯수가 줄어들수록 인코딩의 결과가 길어지니 참고하시면 좋을 것 같습니다.

# DB에서 반환한 index를 Base62로 인코딩 하는 함수
def base62(index):
	result = ""
	# Base62 인코딩의 기본이 되는 문자들(배열은 상관없이 중복이 없으면 됩니다.)
	words = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

	while index % 62 > 0 or result == "": # index가 62인 경우에도 적용되기 위해 do-while 형식이 되도록 구현했다.
		result = result + words[index % 62]
		index = int(index / 62)

	return result

# URL을 단축 URL로 만드는 함수
def Generate(URL):
	# DB에 URL Insert
	index = DB.insert(URL)
	# URL이 등록 된 Index를 Base62로 인코딩
	shortURL = base62(index)
	# 인코딩 된 정보 DB에 갱신
	DB.update(index, shortURL)

	return shortURL

DB 테이블 구성

이름 (속성) 내용
index (Auto Increment) 인덱스
url 접속하고자 하는 URL 주소
encoded (NULL) index를 Base62로 인코딩 한 결과

서버에서 Short URL 처리하는 방식

# 서버에 요청을 받았을 때 실행되는 함수
def getRequest(res):
	# DB에서 URL 조회, res.data는 Base62로 인코딩 된 값
	data = DB.select('encoded', res.data) # 테이블의 encoded 컬럼의 res.data인 행을 찾는다.

	if data.error:
		# 해당 결과가 없으면 오류 페이지 리다이렉트
		return response('404')
	else:
		# 결과가 있으면 해당 페이지로 리다이렉트
		return response('302', data.url)

HTTP Response code

  • 오류 시 404 응답을 통해 해당 페이지가 존재하지 않음을 나타낸다.
  • 정상의 경우 302 응답을 통해 해당 페이지로 이동한다. 임시 링크가 변경 혹은 만료될 경우를 대비하여 임시 이동을 의미하는 302를 사용
 

HTTP 상태 코드 - 위키백과, 우리 모두의 백과사전

HTTP 상태 코드 위키미디어 목록 항목

ko.m.wikipedia.org

성능개선 노트

본 포스팅을 작성하면서 '단축 URL 기능의 성능 개선을 위해서는 어떤 작업이 필요할까?' 를 생각하며 작성한 노트입니다.

...더보기

Base62 인코딩을 효율적으로 해보자

  • 불필요한 연산 과정은 무조건 없애기
  • 알고리즘의 효율성 따져보기

DB를 좀 더 빠르게 사용하려면?

  • 메모리 기반 DB를 써볼까?
  • Hit가 많은 URL이 더 빨리 검색되는 방법은?

서버에서 해당 요청을 효율적으로 처리하는 방법이 있을까?

  • 인코딩 된 코드를 DB에 저장해두면 굳이 디코딩 과정 없이 DB 질의 한 번으로 결과를 얻는다.
  • Response에 바로 Redirect 정보를 담아서 보내기
  • 페이지에서 Redirect 코드를 실행하기

끝으로

본문에는 Python을 이용하여 로직을 작성하였는데 다른 언어나 환경에서도 동일한 로직으로 단축 URL을 구현할 수 있습니다. 조금 더 심화 단계로 들어가서 DB와 서버 요청 처리 등에서 시간을 단축하는 방법을 공부해보면 좋을 것 같습니다. 그리고 제가 제시한 로직이 무조건 옳은 방법은 아니니 여러분의 다양한 방법을 생각해보는 것도 도움이 될 것 같습니다.

'IT > Develop' 카테고리의 다른 글

[React] 프론트엔드 대세 경험기  (0) 2020.09.03
[개발] 아이패드로 코딩하기  (0) 2019.08.04