2019. 8. 22. 19:55ㆍIT/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를 사용
성능개선 노트
본 포스팅을 작성하면서 '단축 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 |