URL Shortener란?
URL Shortener는 긴 URL을 짧은 URL로 변환해주는 서비스다.
이 글에서는 URL Shortener에 대해 정리해보고, 구현 시 고민했던 문제들을 살펴본다.
기능 정의
URL Shortener는 다음의 두 가지 기능을 갖는다.
1. Short URL 생성
입력받은 URL로 Short URL을 생성한다.
2. Short URL 접속 시 원본 URL 리다이렉트
Short URL로 접속하면 원본 URL로 리다이렉트한다.
Data Modeling
기능 요구사항을 충족하려면 어떤 데이터를 저장해야 할까?
먼저 원본 URL, 이와 매핑되는 Short URL을 저장하는 테이블이 하나 필요하다.
URL Shortener는 하나의 원본 URL로 여러 개의 Short URL을 생성할 수 있는데, 이를 통해 각 유입 경로별 클릭 수와 같은 마케팅 지표도 수집 가능하다.
반영하면 URL 매핑과 통계 지표 수집 이라는 관심사를 분리하여 테이블을 분리할 수 있다.
Short URL 생성 방식
Short URL은 고유성을 보장해야 한다. 기본 구조는 다음과 같다.
Short URL에는 Base62 인코딩을 적용하는데, 다음의 문자들로 구성된다.
만약 해시 값을 통해 생성하면 해시 충돌에 의해 중복이 발생할 수 있으므로 별도 처리가 필요하다.
또 다른 방법으로는, ID (Auto Increment) 값을 기반으로 인코딩하는 방식이 있다. 이 방식을 적용하여 URL을 생성하는 기본 아이디어는 다음과 같다.
시퀀스 번호에 따라 문자열의 길이는 늘어난다. 최대 7자리까지의 고유한 URL을 발행한다고 가정하고 계산해보자.
Base62 인코딩으로 7자리 문자열을 생성하면 대략 3.5조 개를 표현할 수 있다.
다만 이 방법을 채택할 경우, Sequence Number를 어떤 방식으로 생성하고 관리할지를 결정해야 한다.
다음의 3가지 방법을 살펴보자.
1. Redis (INCR)
모든 서버가 Redis를 통해 Sequence를 생성하는 방식이다. 레디스의 연산은 원자적이므로 간단하게 구현할 수 있는 것이 장점이다. 다만 중앙 집중 방식이기 때문에 단일 장애점 (SPOF)이 될 수 있다.
2. Snowflake ID
64비트를 timestamp / datacenter / machine ID / sequence로 나눠서 생성하는 방식이다. 분산 환경에서 각 서버가 독립적인 ID 생성을 할 수 있다는 장점이 있다. 또한 timestamp가 반영되므로 시간순 정렬이 가능하다.
3. Machine ID + Sequence Number
Snowflake ID는 64비트를 사용하므로 약 11자리의 URL이 생성된다.
Snowflake ID 방식을 간소화하여 Machine ID + Sequence Number 조합으로 생성하면,
구조를 단순화하면서도 더 짧은 길이(약 7자리)의 ID를 생성할 수 있다.
조회 성능 최적화
URL Shortener의 주요 컴포넌트는 다음과 같이 구성된다.
URL Shortener는 생성보다 조회 연산이 훨씬 많다.
URL은 불변 값이기 때문에, 캐시를 사용하기에 적합하다. Cache-Aside 패턴을 적용하면 DB 부하를 줄이고 조회 성능을 크게 높일 수 있다.