본문 바로가기
Development/Toy Projects

[프로젝트] WebClient와 WebRequest로 NEIS 급식정보 얻어오기🔥 #1

by Kyunghoon Kim 2020. 5. 11.

안녕하세요 이번 포스트는 C# & WPF를 이용하여 데이터를 파싱 하고 객체화(역직렬화) 해서 얻은 Neis 급식 정보를 통한 간단한 급식 정보 프로그램을 만들어 보려고 합니다. 현재 이 포스트는 1편으로써 Web Client와 Web Request를 이용해서 NEIS의 급식정보를 파싱 해 오려고 합니다. 2편에서는 파싱 한 json 데이터들을 역직렬화(DeserializeObject)해서 객체화하려고 합니다. 마지막 3편에서는 이 데이터를 이용한 간단한 급식 UI를 만들어 보려고 합니다.

 


포스트 🔑 포인트

🎉1. Web Client & Web Request를 이용해서 NEIS 급식 정보 파싱 해오기

🎉2. 급식 데이터를 받을 모델을 만들고 JsonConvert.DeserializeObject(역직렬화)해서 객체화해보기

🎉3. 정리된 데이터를 이용한 간단한 급식 프로그램 만들어보기

 


우선 Visual Studio를 실행하고 WPF App(. NET framework)를 프로젝트를 생성해주세요. 저는 Meal_Parsing으로 이름을 짓고 프로젝트를 생성하였습니다.

 

WPF.App 프로젝트 생성

Web Client와 Web Request를 사용하기 전 이게 무엇을 하는지에 대해서 먼저 알아보도록 하겠습니다. 아래 문서의 내용에 따르면 데이터를 전송 및 수신 데이터로 URL로 식별되는 리소스에 대한 일반적인 메서드를 제공하는 클래스입니다.

 

https://docs.microsoft.com/ko-kr/dotnet/api/system.net.webclient?view=netcore-3.1

 

WebClient 클래스 (System.Net)

데이터를 전송 및 수신 데이터로 URI로 식별 되는 리소스에 대 한 일반적인 메서드를 제공 합니다.Provides common methods for sending data to and receiving data from a resource identified by a URI.

docs.microsoft.com

 

저는 여러 메서드들 중에서도 WebClient.OpenRead() 메서드를 이용해서 데이터를 읽어오도록 하겠습니다. Web Request도 Web Client와 마찬가지로 데이터를 읽어올 수 있는 방법이지만 Web Client에 대해서 먼저 사용해본 후 Web Request를 사용해보도록 하겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
namespace Meal_Parsing
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Loaded += MainWindow_Loaded;
        }
 
        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            string webClientData = mealWebClient();
        }
 
        public string mealWebClient()
        {
            string mealData = string.Empty;
 
            return mealData;
        }
    }
}
cs

 

Loaded 이벤트를 만들고 mealWebClient()라는 메서드를 만들어주었습니다. 이 메서드에서 데이터를 읽어올 것입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public string mealWebClient()
{
    string mealData = string.Empty;    
            
    try
    {
        WebClient webClient = new WebClient();
        webClient.Headers["Content-Type"= "application/json";
        webClient.Encoding = Encoding.UTF8;
 
        using (Stream data = webClient.OpenRead(API_URL))
        {
            using (StreamReader reader = new StreamReader(data))
            {
                string json = reader.ReadToEnd();
               mealData = json;
            }
        }
    }
    catch (Exception e)
    {
        Console.WriteLine(e.ToString());
    }
    
        return mealData;
 
}
cs

 

본격적으로 데이터를 파싱 해오기 위한 부분의 내용입니다. 먼저 WebClient 객체를 하나 생성해 줍니다. 그러고 나서 받아올 데이터의 형을 json 형식으로 받아오기 위해 Headers에 application/json을 넣어줍니다. 그리고 Encoding은 UTF8로 설정해 줍니다. 그리고 나서 Stream 클래스와 StreamReader 클래스를 이용하여 데이터를 읽어 오도록 하겠습니다.

 

 

https://docs.microsoft.com/ko-kr/dotnet/api/system.io.stream?view=netcore-3.1

 

Stream 클래스 (System.IO)

바이트 시퀀스에 대한 일반 뷰를 제공합니다.Provides a generic view of a sequence of bytes. 이 클래스는 추상 클래스입니다.This is an abstract class.

docs.microsoft.com

 

 

Stream을 사용하는 부분에서 webClient.OpenRead() 메서드는 지정된 URI를 사용하여 리소스에서 다운로드한 데이터를 읽을 수 있는 스트림을 엽니다. 따라서 인자로 급식 데이터를 파싱 해올 주소를 넣어줍니다. 저는 NEIS API를 이용하였습니다.

 

https://open.neis.go.kr/portal/data/service/selectServicePage.do?page=1&rows=10&sortColumn=&sortDirection=&infId=OPEN17320190722180924242823&infSeq=2

 

급식식단정보 | 데이터셋 상세 Open API | 나이스 교육정보 개방 포털

메타 정보 메타 정보 상세 분류명 교육여건 > 급식식단 DATA 개방일 2019-04-01 태그 급식식단정보, 학교급식, 급식정보, 요리명 제공 기관 교육부, 17개 시도교육청 적재 주기 매일 이용 허락 조건  �

open.neis.go.kr

 

이 곳에서 키 값을 받은 후 제한 횟수 없이 자유롭게 사용할 수 있습니다. 그러고 나서 Streamreader 클래스를 이용하여 데이터를 읽어옵니다. StreamReader의 객체를 생성하고 인자로는 Stream 클래스에서 다운로드한 데이터를 넣어줍니다.

 

 

https://docs.microsoft.com/ko-kr/dotnet/api/system.io.streamreader?view=netcore-3.

 

StreamReader 클래스 (System.IO)

특정 인코딩의 바이트 스트림에서 문자를 읽는 를 구현합니다.Implements a that reads characters from a byte stream in a particular encoding.

docs.microsoft.com

데이터를 StreamReader의 readToEnd() 메서드를 이용하여 끝까지 읽어와서 데이터가 어떻게 나오는지 한번 보도록 하겠습니다.

 

JSON Visualizer를 통해 본 데이터

 

데이터를 읽어온 후 디버깅을 통해 result에 마우스를 가져다 대어 데이터를 확인해 보았습니다. 위와 같이 성공적으로 JSON 데이터가 들어오고 그 아래에는 head와 row에 해당하는 값들이 성공적으로 들어가 있는 것을 볼 수 있습니다.

 

Debugging - Output

Debug.WriteLine()을 이용해서 Debugging-Output 창에서도 데이터가 어떻게 나오는지 확인하실 수 있습니다. Web Client로 데이터를 읽어와 봤으니 이제는 Web Reqeust로는 어떻게 데이터를 읽어오는지 해보도록 하겠습니다. 우선 Web Request에 대해서 간단하게 살펴보겠습니다.

 

 

아래 문서의 내용에 따르면 WebRequest 클래스는 URL에 대한 요청을 만드는 역할을 합니다.

 

https://docs.microsoft.com/ko-kr/dotnet/api/system.net.webrequest?view=netcore-3.1

 

WebRequest 클래스 (System.Net)

URI(Uniform Resource Identifier)에 대한 요청을 만듭니다.Makes a request to a Uniform Resource Identifier (URI). 이 클래스는 abstract 클래스입니다.This is an abstract class.

docs.microsoft.com

 

위의 Loaded 이벤트에서 string webClientData = mealWebClient(); 로 작성하였는데  Web Request는 크게 변함없이 string webReqeustData = mealWebRequest(); 로 변경해 주시면 됩니다. Web Client와 마찬가지로 Web Request도 객체를 생성하고 인자로 데이터를 받아올 URL 주소를 넣어줍니다. 

 

Web Client에서는 Headers를 통해 json 형식으로 설정했다면 Web Request에서는 ContentType으로 json 형식으로 바꿀 수 있습니다. 그리고 Request 요청이므로 Method를 어떻게 쓸 것인지 나타내 주어야 합니다. 데이터를 가져오기 때문에 "GET"을 넣어줍니다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public static string mealWebRequest()
{
   string result = string.Empty;
 
   try
   {
 
       WebRequest request = WebRequest.Create(API_URL);
       request.Method = "GET";
       request.ContentType = "application/json";
 
       using (WebResponse response = request.GetResponse())
       using (Stream dataStream = response.GetResponseStream())
       using (StreamReader reader = new StreamReader(dataStream))
       {
           string json = reader.ReadToEnd();
           result = json;
       }
   }
   catch (Exception e)
   {
       Console.WriteLine(e.ToString());
   }
 
   return result;
}
cs

adf

Stream과 StreamReader 클래스에 대해서는 위에서도 언급을 했으므로 따로 설명하지 않겠습니다. WebResponse 클래스는 요청한 URL에 대한 응답을 받습니다. GetResponse() 메서드를 통해 응답을 받고 응답에 대한 데이터를 얻어서 읽어옵니다.

 

https://docs.microsoft.com/ko-kr/dotnet/api/system.net.webresponse?view=netcore-3.1

 

WebResponse 클래스 (System.Net)

URI(Uniform Resource Identifier)에서 응답을 제공합니다.Provides a response from a Uniform Resource Identifier (URI). 이 클래스는 abstract 클래스입니다.This is an abstract class.

docs.microsoft.com

 

마찬가지로 Web Request도 데이터가 어떻게 나오는지 확인해 보도록 하겠습니다. Web Reqeust 또한 Web Client와 디버깅했을 때 나오는 값이 동일하므로 사진 자료는 생략하도록 하겠습니다. 

 

이번 포스트에서는 Web Client & Web Request를 이용하여 NEIS 급식 정보를 파싱 해 봤습니다. 오늘은 NEIS 급식 정보만 파싱 했지만 이를 활용하여 다른 오픈 API의 정보도 손쉽게 얻어올 수 있으니 활용해 보시길 바랍니다. 다음 포스트에서는 2편 급식 데이터 모델을 만들고 JsonConvert.DeserializeObject(역직렬화)를 해보도록 하겠습니다. 감사합니다.🙌

 

 

 

댓글