본문 바로가기
개발일기

네이버 검색 API와 도로명주소 API를 이용한 검색 서비스 구축

by 두두리안 2024. 10. 17.
728x90

최근 많은 서비스들이 위치 기반 검색 기능을 필요로 합니다. 도로명주소나 네이버 검색 API 같은 공공 데이터와 결합하면 더 유용한 정보를 제공할 수 있는데요, 이번 포스트에서는 네이버 검색 API와 도로명주소 API를 활용하여 키워드를 통해 도로명 주소를 검색하고, 이를 좌표로 변환하는 과정을 Java로 구현한 예제를 소개해드리겠습니다.

1. 네이버 및 도로명주소 API 키 발급

먼저 네이버 개발자 센터와 도로명주소 API에서 각각 API 키를 발급받아야 합니다. 네이버 검색 API는 ClientId와 ClientSecret을, 도로명주소 API는 ROAD-CONFMKEY와 COORD-CONFMKEY 키를 발급받아야 합니다. 이 키들은 API 요청을 인증하는 데 필수입니다.

String clientId = "your-naver-client-id";
String clientSecret = "your-naver-client-secret";
String roadConfmKey = "your-road-api-key";
String coordConfmKey = "your-coord-api-key";

2. 네이버 검색 API 도우미 클래스 구현

네이버 검색 API를 통해 특정 키워드를 검색하는 NaverSearchApiHelper 클래스를 작성했습니다. 이 클래스는 사용자가 입력한 키워드를 기반으로 네이버 검색 결과를 반환합니다.

public class NaverSearchApiHelper {
    public String getSearch(String keyword) {
        try {
            String encodedKeyword = URLEncoder.encode(keyword, "UTF-8");
            String apiUrl = "https://openapi.naver.com/v1/search/local.json?query=" + encodedKeyword;
            HttpURLConnection conn = createConnection(apiUrl);

            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String inputLine;
            StringBuffer response = new StringBuffer();
            while ((inputLine = br.readLine()) != null) {
                response.append(inputLine);
            }
            br.close();
            return response.toString();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    private HttpURLConnection createConnection(String apiUrl) throws IOException {
        URL url = new URL(apiUrl);
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        conn.setRequestProperty("X-Naver-Client-Id", clientId);
        conn.setRequestProperty("X-Naver-Client-Secret", clientSecret);
        return conn;
    }
}

3. 도로명주소 API 도우미 클래스 구현

RoadSearchApiHelper는 도로명주소 API를 통해 입력된 키워드를 검색하여 도로명 주소 정보를 가져오는 역할을 합니다. 여기서는 특정 키워드를 입력하면 해당 키워드에 맞는 도로명 주소 데이터를 가져오는 방식으로 구현했습니다.

public class RoadSearchApiHelper {
    public String getSearch(String keyword, Integer currentPage) {
        try {
            String encodedKeyword = URLEncoder.encode(keyword, "UTF-8");
            String apiUrl = "https://www.juso.go.kr/addrlink/addrLinkApiJsonp.do?keyword=" 
                            + encodedKeyword + "&currentPage=" + currentPage + "&confmKey=" + roadConfmKey;
            URL url = new URL(apiUrl);
            BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));
            StringBuffer buffer = new StringBuffer();
            String inputLine;
            while ((inputLine = reader.readLine()) != null) {
                buffer.append(inputLine);
            }
            reader.close();
            return buffer.toString();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

4. 좌표 변환 API 도우미 클래스 구현

도로명 주소 검색 결과에서 좌표로 변환하려면 CoordSearchApiHelper 클래스가 필요합니다. 이 클래스는 도로명주소 API에서 받아온 데이터를 이용해 좌표를 변환합니다.

public class CoordSearchApiHelper {
    public String getSearch(RoadSearchJusoVo roadSearchJusoVo) {
        try {
            String apiUrl = "https://www.juso.go.kr/addrlink/addrCoordApi.do?admCd=" + roadSearchJusoVo.getAdmCd()
                            + "&rnMgtSn=" + roadSearchJusoVo.getRnMgtSn() 
                            + "&udrtYn=" + roadSearchJusoVo.getUdrtYn() 
                            + "&buldMnnm=" + roadSearchJusoVo.getBuldMnnm() 
                            + "&buldSlno=" + roadSearchJusoVo.getBuldSlno()
                            + "&confmKey=" + coordConfmKey;
            URL url = new URL(apiUrl);
            BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"));
            StringBuffer buffer = new StringBuffer();
            String inputLine;
            while ((inputLine = reader.readLine()) != null) {
                buffer.append(inputLine);
            }
            reader.close();
            return buffer.toString();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

5. 서비스 클래스 작성

이제 모든 API 도우미 클래스를 통합한 SearchService 클래스를 작성하여, 검색 요청을 받아 도로명 주소와 네이버 검색 결과를 동시에 처리할 수 있습니다.

public class SearchService {
    private final NaverSearchApiHelper naverSearchApiHelper = new NaverSearchApiHelper();
    private final RoadSearchApiHelper roadSearchApiHelper = new RoadSearchApiHelper();
    private final CoordSearchApiHelper coordSearchApiHelper = new CoordSearchApiHelper();

    public List<String> getKeywordResultList(String query, Integer pageNumber) {
        List<String> resultList = new ArrayList<>();

        // 네이버 검색 결과 추가
        String naverResult = naverSearchApiHelper.getSearch(query);
        resultList.add("네이버 검색 결과: " + naverResult);

        // 도로명 주소 검색 결과 추가
        String roadResult = roadSearchApiHelper.getSearch(query, pageNumber);
        resultList.add("도로명 주소 검색 결과: " + roadResult);

        return resultList;
    }
}

6. 결론

이 코드를 통해 사용자는 네이버 검색 API와 도로명주소 API를 동시에 활용하여 키워드 기반 검색 결과를 얻을 수 있습니다. 도로명 주소는 좌표로 변환되어 위치 정보를 시각화하거나 추가적인 분석을 진행할 수 있습니다. 이 기능을 통해 다양한 위치 기반 서비스의 토대를 마련할 수 있으며, 필요에 따라 기능을 확장할 수 있습니다.

728x90