Project/중고 서적 직거래 플랫폼

국립중앙도서관 Open API 활용 중 시행착오

kkumta 2022. 4. 18. 02:11

내가 개발하고 있는 중고 서적 직거래 플랫폼은 사용자가 중고 서적을 판매하거나 구매할 수 있어야 한다. 사용자가 중고 서적을 판매할 때에는, 책에 관한 정보를 필수적으로 입력해야 하는데, 이 정보를 국립중앙도서관 Open API를 통해 찾아서 자동으로 등록되게끔 한다. 즉, 사용자가 대략적인 책의 제목이나 지은이 정보로 도서 검색을 하면, 우리 플랫폼에서 확실한 책의 정보들을 보여주어 그 중 하나를 선택할 수 있게끔 하는 것이다.

 

이를 위해 국립중앙도서관에서 Open API를 발급받아 사용하였다.

https://www.nl.go.kr/NL/contents/N31101030500.do

 

국립중앙도서관

국립중앙도서관에 오신 것을 환영합니다

www.nl.go.kr

 

국립중앙도서관에서 제시한 요청 URL의 예시는 https://www.nl.go.kr/NL/search/openApi/search.do?key=인증키 와 같았다. 때문에 내 URL은 다음과 같은 코드로 만들어졌다. 이 코드는 책 제목으로 검색할 때 사용되는 코드이다.

        StringBuilder sbURL = new StringBuilder(
            "https://seoji.nl.go.kr/landingPage/SearchApi.do?");
        sbURL.append("cert_key=" + certKey); // 인증키
        sbURL.append("&result_style=json"); // json 형식으로 결과를 받아온다
        sbURL.append("&page_no=1"); // 페이지 번호 1번
        sbURL.append("&page_size=10"); // 페이지 크기 10
        sbURL.append("&title=" + searchTitle); // 책 제목
        URL url = new URL(sbURL.toString());

 

그런데, 코드를 작동시켜보니 아래의 결과만 출력되었다. 분명 문제가 있는 것 같은데 대체 뭐가 문제인지 몰라서 2~3일간 헤맸다. 왜냐하면, 브라우저에서 직접 https://seoji.nl.go.kr/landingPage/SearchApi.do?cert_key=인증키&result_style=json&page_no=1&page_size=10&title=갈매기의 꿈 형식으로 요청을 보내면 내가 원하던 json 결과가 제대로 출력되었기 때문이다.

parsingData = <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

그리고 해당 부분의 코드를 이리저리 수정하여 실행시켜보다 마침내 그 이유를 알게 되었다. 문제는 String 값으로 들어가는 searchTitle(책 제목) 값이었다. 코드를 보며 가만히 생각해보니 searchTitle에 한글이 들어가면 값이 깨진다는 추측을 할 수 있었고, searchTitle 값에 영어를 넣어보는 시도를 통해 내 추측이 맞다는 것을 확인했다.

 

구글링을 해본 결과, searchTitle이 한글일 경우에는 URLEncoder의 encode 함수를 통해 UTF-8로 인코드해준 뒤에 사용해야 문제가 생기지 않는다고 한다. 아래의 코드는 위의 문제점 해결을 통해 완성된, searchTitle이 한글, 영어일 때를 가리지 않고 정상 작동하는 String형의 parsingData 변수에 파싱할 정보들을 담는 코드이다.

 

            StringBuilder sbURL = new StringBuilder(
                "https://seoji.nl.go.kr/landingPage/SearchApi.do?");
            sbURL.append("cert_key=" + certKey);
            sbURL.append("&result_style=json");
            sbURL.append("&page_no=1");
            sbURL.append("&page_size=10");
            sbURL.append("&title=" + URLEncoder.encode(searchTitle, "UTF-8"));
            URL url = new URL(sbURL.toString());
            System.out.println("url = " + url);
            
            BufferedReader bf = new BufferedReader(
                new InputStreamReader(url.openStream(), "UTF-8"));
            parsingData = bf.readLine();