2. 지역 검색 예광탄 [경로찾기 프로젝트 – C#, 카카오 지도 API, SK TMAP API 활용 ]

안녕하세요. 언제나휴일입니다.

이전 글에서 경로찾기 프로젝트를 소개하였습니다.

경로찾기 프로젝트를 구현하기 위해서는 여러 개의 요소 기술을 사용할 수 있어야 합니다.

그 중에 카카오 개발자 센터의 지역 API를 사용하여 검색 질의에 해당하는 지역 정보를 조사할 수 있어야 합니다.

이번에는 이를 익히기 위해 지역 검색 예광탄을 만들어 보기로 할게요. (C#, 카카오 개발자센터 – 로컬 API 사용)

동영상 강의는 언제나휴일 유튜브에 있습니다.

1. 개발에 필요한 작업

카카오 개발자 센터에 내 애플리케이션을 추가합니다.

1. 내 애플리케이션 추가
내 애플리케이션 추가

추가할 애플리케이션 정보를 입력합니다.

앱 이름과 사업자명은 원하는 명칭을 입력해도 무관합니다.

2. 내 애플리케이션 추가 - 정보 입력
내 애플리케이션 추가 – 정보 입력

앱 키 중에 REST API키는 지역 검색에서 사용합니다.

그리고 다음에 지도 API를 사용할 때 JavaScript키를 사용합니다.

앱 키
앱 키

(* 화면에 보이는 앱 키는 이미 삭제한 앱의 키이므로 여러분의 키를 사용하세요.)

그리고 Web 플랫폼 등록을 하여 어디에서 사용할 것인지 정해야 합니다.

4. Web 플랫폼 등록
Web 플랫폼 등록

사이트 도메인을 등록합니다. 로컬 컴퓨터에서 사용할 것이면 http://localhost를 입력합니다.

5. Web 플랫폼 등록 - 도메인 주소 등록
Web 플랫폼 등록 – 도메인 주소 등록

문서>> 로컬>>REST API로 이동하면 사용 메뉴얼을 확인할 수 있습니다.

여기에서는 그 중에서도 키워드로 장소 검색하기를 사용할 것입니다.

GET에 url 정보를 기억하세요. 웹 요청에서 사용합니다.

6. 로컬 - 키워드로 장소 검색하기
로컬 – 키워드로 장소 검색하기

웹 요청에는 인증 정보를 헤더에 추가해야 사용할 수 있습니다.

이 정보도 기억하세요.

헤더
헤더

웹 요청에 원하는 질의를 비롯한 정보를 전달할 수 있습니다. 이는 쿼리 파라미터에 나와 있습니다.

여기에서는 필수 항목인 query만 사용할 거예요.

쿼리 파라미터
쿼리 파라미터

사용 예제를 통해 요청 예와 응답 예를 확인할 수 있어요.

요청 예
예제

2. 지역 검색 예광탄 만들기

먼저 새 프로젝트를 만듭니다.

C#, 콘솔 앱(.NET Framework)으로 작성합니다.

여기에서는 솔루션 이름은 경로 탐색, 프로젝트 이름은 지역 검색 예광탄으로 정할게요.

새 프로젝트
새 프로젝트

2.1 소스 편집

먼저 검색 질의를 입력받습니다.

using System;
using System.IO;
using System.Net;
using System.Web.Script.Serialization;

namespace 지역_검색_예광탄
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.Write("검색:");
            string query = Console.ReadLine();

검색 url과 질의를 합성하여 쿼리 문자열을 만듭니다.

            string url = "https://dapi.kakao.com/v2/local/search/keyword.json";
            string query_str = string.Format("{0}?query={1}", url, query);

쿼리 문자열을 입력 인자로 WebRequest 개체를 생성합니다.

그리고 인증 정보를 헤더에 추가합니다. 인증에는 REST API 키를 사용해야 합니다.

(여기에서 사용한 키는 이미 삭제한 키로 사용할 수 없습니다. 여러분이 발급받은 내 애플리케이션에서 REST API 키를 사용하세요.)

            WebRequest request = WebRequest.Create(query_str);
            request.Headers.Add("Authorization", "KakaoAK 920b37b221fe0d161f045b83f71584bb");

웹 서버에 요청하여 응답 결과를 얻어옵니다.

            WebResponse response = request.GetResponse();

응답 결과의 내용을 순차적으로 읽을 수 있는 Stream 개체를 얻어온 후 StreamReader로 끝까지 내용을 읽어옵니다.

그리고 잘 읽어왔는지 확인하는 코드를 입력합니다.

(여기에서 실행하여 한 번 확인하고 출력 구문은 주석처리합니다.)

            Stream stream = response.GetResponseStream();
            StreamReader sr = new StreamReader(stream);
            string content = sr.ReadToEnd();
            //Console.WriteLine(content);

응답 결과는 Json 방식입니다.

이를 프로그램에서 목적에 맞게 사용하기 위해 JavaScriptSerializer 개체를 이용합니다.

            JavaScriptSerializer jss = new JavaScriptSerializer();

역직렬화를 수행한 후 Json 결과의 documents의 항목을 구합니다.

(documents는 Kakao 개발자 센터의 로컬 API 사용할 때 응답에 있는 키 이름입니다.)

            dynamic d = jss.Deserialize<dynamic>(content);
            dynamic[] ddoc = d["documents"];

documents의 각 항목의 place_name, x,y 값을 출력합니다.

            foreach(dynamic elem in ddoc)
            {
                Console.WriteLine(elem["place_name"]);
                Console.WriteLine(elem["x"]);
                Console.WriteLine(elem["y"]);
                Console.WriteLine("===========");
            }

2.2 Program.cs 파일 전체 내용

using System;
using System.IO;
using System.Net;
using System.Web.Script.Serialization;

namespace 지역_검색_예광탄
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.Write("검색:");
            string query = Console.ReadLine();
            string url = "https://dapi.kakao.com/v2/local/search/keyword.json";
            string query_str = string.Format("{0}?query={1}", url, query);
            WebRequest request = WebRequest.Create(query_str);
            request.Headers.Add("Authorization", "KakaoAK 920b37b221fe0d161f045b83f71584bb");
            WebResponse response = request.GetResponse();
            Stream stream = response.GetResponseStream();
            StreamReader sr = new StreamReader(stream);
            string content = sr.ReadToEnd();
            //Console.WriteLine(content);

            JavaScriptSerializer jss = new JavaScriptSerializer();
            dynamic d = jss.Deserialize<dynamic>(content);
            dynamic[] ddoc = d["documents"];
            foreach(dynamic elem in ddoc)
            {
                Console.WriteLine(elem["place_name"]);
                Console.WriteLine(elem["x"]);
                Console.WriteLine(elem["y"]);
                Console.WriteLine("===========");
            }

        }
    }
}

실행시켜 잘 동작하는 지 확인하세요.