안녕하세요. 언제나 휴일에 언휴예요.
이번 강의는 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&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<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; } } }