개요
트위터의 제한된 글자수로 인해 짧은 URL 사용이 대중화 되었다. 단축 URL 사용은 해당 URL이 어떤 곳을 가리키는 지는 확인하기 어렵지만, 바이트 수를 줄여준다. 계속해서 단축 URL을 알아가보자.
단축 URL이 실제 URL을 어떻게 확인할까?
단축 URL을 클릭했을 때 발생하는 GET 요청의 응답으로 'HTTP 3XX'가 리턴되고 Location 헤더에 실제 URL 정보가 표시된다. 즉 Body 전체를 응답할 필요없이 'HTTP Header Request'을 지원하는 curl 등을 이용해 반환된 헤더의 Location 정보만 파싱하여 표시해주면 불필요한 리소스를 줄일 수 있게 되는 것이다.
단축 URL 알고리즘
필자의 블로그 주소(hongdosan.tistory.com)를 goo.by에서 단축하면 goo.by/SotiPu와 같고 bit.ly에서 단축하니 bit.ly/3LOqnqy가 나왔다. 공통적으로 숫자, 알파벳 소/대문자로 이뤄지고 길이가 7이하인 문자 조합이다. 어떤 알고리즘인지 알아가기 위해 기존 URL을 여러 인코딩 방법으로 결과값을 확인해보자.
URL 인코딩 해보기
[ Hash Functions ]
FileFormat.info 사이트에서 얻어낸 인코딩 값은 다음과 같이 문자 길이 자체가 조건을 만족하지 못한다.
[ Base64 Standard ]
일반적인 Base64 Encoding 방법도 만족하지 못한다.
[ Base64 for URL ]
URL Applicaiton을 위해 수정된 Base64도 길이가 문제다.
[ Base62 ]
기존 URL 자체를 인코딩해서는 조건에 맞도록 길이를 줄일 수 없었다. 그렇다면 0~9, a~z, A~Z 총 62개의 문자를 사용해 데이터를 표현하는 방식인 Base62 인코딩은 어떨까? 직접 코드로 작성해 구현하면 다음처럼 값이 잘 나오는 것을 볼 수 있다.
public class Base62Converter {
private static final String ALPHABET = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static final int BASE = ALPHABET.length();
public static String encode(long value) {
StringBuilder sb = new StringBuilder();
while (value != 0) {
int index = (int) (value % BASE);
sb.append(ALPHABET.charAt(index));
value /= BASE;
}
return sb.reverse().toString();
}
public static void main(String[] args) {
String shortURL = encode(12000);
System.out.println(shortURL); // 37y
}
}
실습 영상
Reference
- KDT 프로그래머스 - 벡엔드 데브코스
- 네이버 단축 URL API
- https://bitly.com/
- https://goo.by/
'Activity > 데브코스 - 백엔드 엔지니어링' 카테고리의 다른 글
벡엔드 데브코스 TIL - 동시성 이슈 해결하기 (4) | 2023.10.11 |
---|---|
벡엔드 데브코스 TIL - 프록시 패턴 발표 (1) | 2023.07.12 |
백엔드 데브코스 TIL - 동행 스크럼을 하다가 공부하게 된 Process와 Thread (0) | 2023.06.12 |
벡엔드 데브코스 TIL - 싱글톤 패턴 발표 (4) | 2023.06.08 |
백엔드 데브코스 TIL - 놓치기 쉬운 JAVA 이야기 (2) | 2023.06.02 |