서론
기존 홈페이지에서 무료로 사용하던 네이버 단축URL API가 피싱 사례의 급증, 도메인 시행사의 엄격한 피싱 대응 가이드로 인해, 2024년 12월 02일부로 me2.do 단축URL서비스를 종료했다.
(공지 내용은 아래 링크 참조)
https://developers.naver.com/notice/article/17062
기존 생성된 단축URL의 연결은 2026년 2월 말까지 유지될 예정으로 자체적인 단축URL 서비스 개발이 필요했다.
본론
1. 주요 기능
1-1. 긴 URL을 단축된 형태로 변환
1-2. 단축 URL이 원래 URL로 리다이렉트
1-3. 단축 URL 저장 및 조회 (DB연동)
2. 구체적인 설계
2-1. URL 단축 로직
- 서칭해보니 단축 URL은 보통 Base62 인코딩이나 Hashing 알고리즘을 사용해 생성한다.
- 필자는 Oracle DB AUTO_INCREMENT를 활용해 고유 키를 생성하고, 이를 Base62로 변환하여 단축된 키를 생성했다.
2-2. DB 테이블 설계
- 테이블명과 테이블 구조까지 공개할 수는 없지만, 핵심이 되는 부분은 아래와 같다.
ID | PK |
SHORT_KEY | Base62 인코딩을 이용하여 key값을 관리할 컬럼 |
ORIGINAL_URL | 원본 URL |
CREATED_AT | 통계 관리를 위한 생성일자 |
COUNT | 통계 관리를 위한 사용자 조회수 Count |
2-3. 서비스 흐름
2-3-1. 사용자가 URL 복사하기 버튼 클릭 시 [원본 URL]을 조회
2-3-2. DB에서 동일한 URL이 이미 저장되어 있는지 확인
- 저장 되어 있을 경우 기존 단축키를 이용하여 단축된 URL 반환
- 없다면 새 단축키 생성 후 저장 및 반환 (여기서 생성일자 Insert)
2-3-3. 단축 URL 접속 시, 해당 키를 DB에서 조회하여 원본 URL 리다이렉트
- 원본 URL 리다이렉트 시 사용자 조회 Count ++
2-4. 핵심 코드 영역
URL 처리 메서드
public boolean handleUrl(String inputUrl) {
try {
// 기존 URL 확인을 위한 Select 쿼리 실행
if (rs.next()) {
this.short_key = rs.getString("short_key");
return true;
} else {
//생성한 단축URL이 없는 경우 신규 6자리 key값 생성
do {
short_key = generateShortKey(6);
} while (isKeyExists(short_key)); //isKeyExists = 키 중복 확인 메서드
//원본, 신규 단축URL KEY, 생성일자 등 Insert 쿼리 실행
}
} catch (Exception e) {
e.printStackTrace();
Rollback();
return false;
} finally {
try {
//Connection Close
} catch (Exception e) {
e.printStackTrace();
}
}
}
랜덤 키 생성 메서드(기존 KEY값이 없는 것을 확인한 뒤에 처리)
public static String generateShortKey(int length) {
String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
Random random = new Random();
StringBuilder shortKey = new StringBuilder();
for (int i = 0; i < length; i++) {
int index = random.nextInt(characters.length());
shortKey.append(characters.charAt(index));
}
System.out.println("**************************************************");
System.out.println("* ShortKey Create : " + shortKey.toString() );
System.out.println("**************************************************");
return shortKey.toString();
}
결론
추가적으로 고려할 사항들이 남아있다.
글을 다시 작성하며 생각해보니, 개선해야할 부분들이 많이 남아있는 것 같다.
발견하지 못한 예외 처리, 로그 관리, 만료 기능, 오래된 URL에 대해서는 자동 정리 기능도 필요한 것 같다.
현재는 데이터가 소량이라서 고려하지 못했지만 다수 원본 데이터를 조회할 경우 분명 리소스를 차지하게될 것으로 예상된다.
더 견고하고 효율적인 코드를 만들자 :)
![](https://t1.daumcdn.net/keditor/emoticon/challenge/large/005.png)
'Dev > Spring&Java' 카테고리의 다른 글
[Java] Base64 인코딩/디코딩: JDK 1.7과 JDK 1.8에서의 차이점 (0) | 2024.10.04 |
---|---|
[Java] JSON 데이터 전송 및 응답 처리 (0) | 2024.10.03 |
[Java] 지역 변수와 스코프(Scope) (0) | 2024.08.14 |
The type className is already defined 에러 해결 방법 (0) | 2024.06.25 |
The selected JRE does not support the current compiler compliance level of 1.8 (0) | 2024.04.09 |