서론

기존 홈페이지에서 무료로 사용하던 네이버 단축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에 대해서는 자동 정리 기능도 필요한 것 같다.

현재는 데이터가 소량이라서 고려하지 못했지만 다수 원본 데이터를 조회할 경우 분명 리소스를 차지하게될 것으로 예상된다.

더 견고하고 효율적인 코드를 만들자 :)


반응형