SideProject

단축URL 구현하기 (네이버 me2.do 서비스 종료)

싹다배워 2025. 1. 20. 21:53
반응형

서론

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

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

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


반응형