SprintBoot로 URL Shortener 구현
optional
단축된 URL에 대한 요청 수 정보 저장optional
Shortening Key를 생성하는 알고리즘 2개 이상 제공하며 애플리케이션 실행중 동적으로 변경 가능https://github.com/SY97P/springboot-url-shortener.git
Method | URI |
---|---|
GET | / |
Method | URI |
---|---|
POST | /shortener |
Request Parameter | Type | Description |
---|---|---|
originUrl | String | 원본 URL |
Response Parameter | Type | Description |
---|---|---|
mapping | UrlMappingResponse | 매핑 결과 |
Method | URI |
---|---|
GET | /{shortUrl} |
Path Variable | Type | Description |
---|---|---|
shortUrl | String | 단축 URL |
Method | URI |
---|---|
GET | /mappings |
Response Parameter | Type | Description |
---|---|---|
mappings | UrlMappingResponses | 모든 매핑 정보 |
pageInfo | PageInfo | 페이징 정보 |
단축 = 압축
옛날 학부 때 압축 알고리즘 배우면서 Base64 알게 됐다.
핵심은 임의의 값을 적은 바이트의 데이터로 치환하는 것.
다만 Base64보다 Base62가 URL 단축에 유리한 이유는 쿼리 파라미터가 위험해질 수 있기 때문이다.
Base64에 들어가는 문자 +
, /
때문에 쿼리 파라미터에 영향을 줄 수 있다는 것.
때문에 이 두 문자를 제거한 Base62를 쓴다고 한다.
다른 압축 알고리즘도 많이 있으니 쓰면 된다. 다만, 가성비 있는 건 Base62 인 것 같다.
Base64를 쓰는 방법도 있다.
다만, 라이브러리를 사용하는 것이 아니라, 직접 문제가 되는 두 문자를 -
, _
로 바꿔서 사용하는 방식이다.
나는 이렇게 두 가지 알고리즘으로 단축 URL을 구현했다.
이유는 간단하다.
원본 URL, 단축 URI 가 매핑된 row 에 식별자 (가능하면 숫자)에 Base62를 적용하기 때문.
식별자값이 Long 타입 이내라면 그리 길지 않은 문자열로 치환이 가능해진다.
원본 URL에 직접 알고리즘을 적용하는 것이 아니란 것이 결론.
리액트로 대부분의 프론트 작업을 한다.
이번엔 리액트가 좀 과한 것 같고, IDE 두 개 띄우기 싫어서 그냥 서버 사이드 렌더링으로 해결해보고 싶었다.
타임리프가 제격이었고, 문법은 아는데 예쁘게 만들기가 어려워서 시간을 좀 잡아먹었다.
자꾸 예쁜 프론트에 욕심이 난다.
서버 사이드 렌더링 채택과 마찬가지로 작은 규모의 플젝이라, 메모리 기반 H2 데이터베이스를 사용했다.
이참에 H2 DB 파일도 뜯어보고 재밌었다.
다음에는 TCP 방식 H2 도 써봐야겠다.