OpenAPI/C# OpenAPI

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

언휴 2024. 1. 9. 08:39

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

1. 유튜브 동영상 강의

지역 검색 예광탄

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

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

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

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

2. 개발에 필요한 작업

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

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

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

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

내 애플리케이션 추가 정보 입력
내 애플리케이션 추가 정보 입력

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

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

앱 키
앱 키

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

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

Web 플랫폼 등록
Web 플랫폼 등록

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

Web 플랫폼 등록 도메인 주소 등록
Web 플랫폼 등록 도메인 주소 등록

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

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

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

로컬 키워드로 장소 검색하기
로컬 키워드로 장소 검색하기

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

이 정보도 기억하세요.

헤더
헤더

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

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

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

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

예제
예제

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

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

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

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

새 프로젝트
새 프로젝트

3.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");

응답 결과의 내용을 순차적으로 읽을 수 있는 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("===========");
            }

3.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("===========");
            }

        }
    }
}

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