Kakao Open API를 활용한 도서 검색 및 CSV 파일 I/O [데이터 분석 with C#]

안녕하세요. 언제나 휴일에 언휴예요.

이번 강의는 Kakao Open API를 활용하여 도서를 검색하는 윈도우 프로그램을 제작하는 실습입니다.

Kakao 도서 검색은 Json 방식으로 제공하고 있어요.

이를 활용하여 데이터를 수집하고 CSV 파일로 기록 및 로딩하는 작업을 진행할 거예요.

실습은 동영상 강의를 참고해 주세요.

컨트롤 배치

[그림] 컨트롤 배치
[그림] 컨트롤 배치

검색 버튼의 Click 이벤트 핸들러와 메인 폼의 Load 이벤트, FormClosed 이벤트 핸들러를 등록합니다.

Form1.cs

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace 카카오_API를_이용한_도서_검색_및_CSV_파일로_저장_로딩
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btn_search_Click(object sender, EventArgs e)
        {
            List<Book> books = BookSearcher.Search(tbox_query.Text);
            SetLVBooks(books);
            tbox_query.Text = "";
        }

        private void SetLVBooks(List<Book> books)
        {
            ListViewItem lvi;
            string[] datas;
            foreach(Book book in books)
            {
                datas = new string[3] { book.ISBN, book.Title, book.Author };
                lvi = new ListViewItem(datas);
                lv_book.Items.Add(lvi);
            }
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            BookSearcher.Save();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            List books = BookSearcher.Load();
            SetLVBooks(books);
        }
    }
}

BookSearcher.cs

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

namespace 카카오_API를_이용한_도서_검색_및_CSV_파일로_저장_로딩
{
    public static class BookSearcher
    {
        static Dictionary<string, Book> book_dic = new Dictionary<string, Book>();
        static string url = "https://dapi.kakao.com/v3/search/book";        

        public static List<Book> Search(string text)
        {
            List<Book> books = new List<Book>();
            string query_str = string.Format("{0}?target=title&amp;query={1}", url,text);
            WebRequest req = WebRequest.Create(query_str);
            req.Headers.Add("Authorization", "KakaoAK " + rkey);
            WebResponse res = req.GetResponse();
            Stream stream = res.GetResponseStream();
            StreamReader sr = new StreamReader(stream);
            string result = sr.ReadToEnd();

            JavaScriptSerializer jss = new JavaScriptSerializer();
            dynamic dres = jss.Deserialize<dynamic>(result);
            dynamic ddoc = dres["documents"];
            object[] dbooks = ddoc;

            Book book;
            for(int i = 0; i&lt;dbooks.Length;i++)
            {
                book = MakeBook(dbooks[i]);
                if (book_dic.ContainsKey(book.ISBN) == false)
                {
                    book_dic[book.ISBN] = book;
                    books.Add(book);
                }
            }
            return books;
        }
        static Book MakeBook(dynamic dbook)
        {
            string isbn = dbook["isbn"];            
            string title = dbook["title"];
            title = title.Replace(",", " ");
            string author = dbook["authors"][0];
            author = author.Replace(",", " ");
            return new Book(title, isbn, author);
        }

        public static void Save()
        {
            FileStream fs = File.Create("book.csv");
            StreamWriter sw = new StreamWriter(fs);
            foreach(Book book in book_dic.Values)
            {
                sw.WriteLine("{0},{1},{2}", book.Title, book.ISBN,book.Author);
            }
            sw.Close();
            fs.Close();
        }

        public static List<Book> Load()
        {
            List<Book> books = new List<Book>();
            if (File.Exists("book.csv"))
            {
                FileStream fs = File.OpenRead("book.csv");
                StreamReader sr = new StreamReader(fs);
                while (sr.EndOfStream == false)
                {
                    string s = sr.ReadLine();
                    string[] sdatas = s.Split(',');
                    Book book = new Book(sdatas[0], sdatas[1], sdatas[2]);
                    books.Add(book);
                    book_dic[book.ISBN] = book;
                }
                sr.Close();
                fs.Close();
            }
            return books;
        }

        static string rkey = 카카오 개발자 센터에서 발급받은 REST API 키;
    }
}

Book.cs

namespace 카카오_API를_이용한_도서_검색_및_CSV_파일로_저장_로딩
{
    public class Book
    {
        public string Title
        {
            get;
            private set;
        }
        public string ISBN
        {
            get;
            private set;
        }
        public string Author
        {
            get;
            private set;
        }
        public Book(string title,string isbn,string author)
        {
            Title = title;
            ISBN = isbn;
            Author = author;
        }
    }
}