[.Net] C#์์ ๋ค์ด๋ฒ ๋ด์ค REST API๋ก ์ํ๋ ๋ด์ค๋ง ์์งํ๊ธฐ (์์ ํฌํจ)
๋ค์ด๋ฒ ๋ด์ค REST API / ์คํ API
์ง๋ ํฌ์คํ ์์ Open API๋ฅผ ์ฌ์ฉํ์ฌ C#์์ ๊ณ ์๋๋ก ๊ตํต๋ ์ ๋ณด๋ฅผ ์ป๋ ๋ฐฉ๋ฒ์ ์๊ฐํ์์ต๋๋ค.
[C#] Open API ๊ณ ์๋๋ก ๊ตํต๋ ์ ๋ณด ์ป๊ธฐ (์์ ํฌํจ)
๋ค์ด๋ฒ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๋ฌํ Open API๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ ์ฒญ ํ๊ฐ๋ง ๋๋ค๋ฉด ๋๊ตฌ๋ ๋ค์ด๋ฒ Open API๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์ด๋ฒ ๋ด์ค Open API๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ ํค์๋๊ฐ ํฌํจ๋ ๋ด์ค๋ง ์์งํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ฌ์ค ๋ค์ด๋ฒ Open API๋ ๋ด์ค๋ฟ๋ง ์๋๋ผ ๋ธ๋ก๊ทธ, ๋ฐฑ๊ณผ์ฌ์ , ์ง์iN, ์คํ ๋ณํ ๋ฑ์ ์๋น์ค API๋ ์ ๊ณตํฉ๋๋ค. ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ง ์๋ค๋ฉด ์ํ๋ ๊ฒ์ ๋ค ๋ง๋ค ์ ์์ต๋๋ค.
๋ณธ๋ฌธ์์๋ ๋ค์ด๋ฒ Open API ์ด์ฉ ์ ์ฒญ ๋ฐฉ๋ฒ๊ณผ C#์์ ํน์ ํค์๋๊ฐ ํฌํจ๋ ๋ด์ค๋ง ์์งํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํ๊ฒ ์ต๋๋ค.
๋ค์ด๋ฒ ์คํ API ์ด์ฉ ์ ์ฒญํ๊ธฐ
์๋ ๋งํฌ์ ์ ์ํ์ฌ ์คํ API ์ด์ฉ ์ ์ฒญ ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
developers.naver.com/products/service-api/datalab/datalab.md
์๋์ ๊ฐ์ด ํ์ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค. ํ์ธ ๋ฒํผ ํด๋ฆญ ํ ์ฝ๊ด์ ๋์ํฉ๋๋ค.
ํด๋ํฐ ๋ฐ ์ด๋ฉ์ผ ์ ๋ณด ์ ๋ ฅ ํ๋ฉด์ ๋๋ค. ํ์ฌ ์ด๋ฆ์ ์ ํ์ด๋ฉฐ, ๊ฐ์ธ์ด ๊ฐ๋ฐํ๋ ๊ฒ์ด๋ผ๋ฉด ์ ๋ ฅํ์ง ์์๋ ๋ฉ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ๋ฑ๋ก(API ์ด์ฉ์ ์ฒญ) ํ๋ฉด์ ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฆ๊ณผ ์ฌ์ฉํ๊ณ ์ถ์ API์ ์๋น์ค ํ๊ฒฝ(Web, iOS, Android)์ ์ ํํฉ๋๋ค.
๋ฌธ์ ์์ด ๋ฑ๋ก๋๋ค๋ฉด, ์๋์ ๊ฐ์ด ๋ด ์ ํ๋ฆฌ์ผ์ด์ ์ Client ID์ Secret ์ ๋ณด๊ฐ ํ์๋ฉ๋๋ค.
๋ค์ด๋ฒ API ๋ด์ค ๊ฒ์ ์์ฒญ๊ณผ ๊ฒฐ๊ณผ ๋ถ์ ๋ฐฉ๋ฒ
1. ์์ฒญ ๋ฐฉ๋ฒ
๋ค์ด๋ฒ API ๋ด์ค ๊ฒ์ ๊ฐ๋ฐ ๊ฐ์ด๋์ ์๋์ ๊ฐ์ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ณ ์์ต๋๋ค.
API ๊ธฐ๋ณธ ์ ๋ณด๋ ์๋์ ๊ฐ์ต๋๋ค.
๋ฉ์๋ | ์ธ์ฆ | ์์ฒญ URL | ์ถ๋ ฅ ํฌ๋งท |
GET | - | https://openapi.naver.com/v1/search/news.xml | XML |
GET | - | https://openapi.naver.com/v1/search/news.json | JSON |
์ฆ, XML
ํฌ๋งท์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ณ ์ถ๋ค๋ฉด https://openapi.naver.com/v1/search/news.xml
URL์ GET ๋ฉ์๋
๋ก ํธ์ถํ๊ณ , JSON
ํฌ๋งท์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ณ ์ถ๋ค๋ฉด https://openapi.naver.com/v1/search/news.json
URL์ GET ๋ฉ์๋
๋ก ํธ์ถํ๋ผ๋ ์๋ฏธ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ธ์ฆ์ด ํ์ ์์ต๋๋ค.
์์ฒญ ๋ณ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์์ฒญ ๋ณ์ | ํ์ | ํ์ ์ฌ๋ถ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
query | string | Y | - | ๊ฒ์์ ์ํ๋ ๋ฌธ์์ด๋ก์ UTF-8๋ก ์ธ์ฝ๋ฉํ๋ค. |
display | integer | N | 10(๊ธฐ๋ณธ๊ฐ), 100(์ต๋) | ๊ฒ์ ๊ฒฐ๊ณผ ์ถ๋ ฅ ๊ฑด์ ์ง์ . |
start | integer | N | 1(๊ธฐ๋ณธ๊ฐ), 1000(์ต๋) | ๊ฒ์ ์์ ์์น๋ก ์ต๋ 1000๊น์ง ๊ฐ๋ฅ. |
sort | string | N | sim, date(๊ธฐ๋ณธ๊ฐ) | ์ ๋ ฌ ์ต์ : sim (์ ์ฌ๋์), date (๋ ์ง์). |
๊ฒ์์ด(query)
๋ ๋ฐ๋์ ์ฌ์ฉํด์ผ ํ๊ณ ๋๋จธ์ง display
, start
, sort
๋ ํ์๊ฐ ์๋๋ฏ๋ก ์ ํ์ ์ผ๋ก ์ต์
์ ์ถ๊ฐํ ์ ์๋ค๋ ์๋ฏธ์
๋๋ค.
์ API ๊ธฐ๋ณธ ์ ๋ณด์ ์์ฒญ ๋ณ์๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํด์ผ ํ๋์ง ์์๋ฅผ ๋ค๊ฒ ์ต๋๋ค.
- JSON ํฌ๋งท ์์ฒญ
- ํค์๋: ๊ฒฝ์
- ๊ฒ์ ๊ฒฐ๊ณผ ์ถ๋ ฅ ์: 40๊ฑด
- ๊ฒ์ ์์ ์์น: 1
- ์ ๋ ฌ ์ต์ : ์ ์ฌ๋์
์์ฒญ URL: https://openapi.naver.com/v1/search/news.json?query=๊ฒฝ์ &display=40&start=1&sort=sim
2. ๊ฒฐ๊ณผ ๋ถ์ ๋ฐฉ๋ฒ
์ถ๋ ฅ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ๋ | ํ์ | ์ค๋ช |
rss | - | ๋๋ฒ๊ทธ๋ฅผ ์ฝ๊ฒ ํ๊ณ RSS ๋ฆฌ๋๊ธฐ๋ง์ผ๋ก ์ด์ฉํ ์ ์๊ฒ ํ๊ธฐ ์ํด ๋ง๋ RSS ํฌ๋งท์ ์ปจํ ์ด๋์ด๋ฉฐ ๊ทธ ์ธ์ ํน๋ณํ ์๋ฏธ๋ ์๋ค. |
channel | - | ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ํฌํจํ๋ ์ปจํ ์ด๋์ด๋ค. ์ด ์์ ์๋ title, link, description ๋ฑ์ ํญ๋ชฉ์ ์ฐธ๊ณ ์ฉ์ผ๋ก ๋ฌด์ํด๋ ๋ฌด๋ฐฉํ๋ค. |
lastBuildDate | datetime | ๊ฒ์ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ ์๊ฐ์ด๋ค. |
total | integer | ๊ฒ์ ๊ฒฐ๊ณผ ๋ฌธ์์ ์ด ๊ฐ์๋ฅผ ์๋ฏธํ๋ค. |
start | integer | ๊ฒ์ ๊ฒฐ๊ณผ ๋ฌธ์ ์ค, ๋ฌธ์์ ์์์ ์ ์๋ฏธํ๋ค. |
display | integer | ๊ฒ์๋ ๊ฒ์ ๊ฒฐ๊ณผ์ ๊ฐ์์ด๋ค. |
item/items | - | XML ํฌ๋ฉง์์๋ item ํ๊ทธ๋ก, JSON ํฌ๋ฉง์์๋ items ์์ฑ์ผ๋ก ํํ๋๋ค. ๊ฐ๋ณ ๊ฒ์ ๊ฒฐ๊ณผ์ด๋ฉฐ title, originallink, link, description, pubDate๋ฅผ ํฌํจํ๋ค. |
title | string | ๊ฐ๋ณ ๊ฒ์ ๊ฒฐ๊ณผ์ด๋ฉฐ, title, originallink, link, description, pubDate ๋ฅผ ํฌํจํ๋ค. |
originallink | string | ๊ฒ์ ๊ฒฐ๊ณผ ๋ฌธ์์ ์ ๊ณต ์ธ๋ก ์ฌ ํ์ดํผํ ์คํธ link๋ฅผ ๋ํ๋ธ๋ค. |
link | string | ๊ฒ์ ๊ฒฐ๊ณผ ๋ฌธ์์ ์ ๊ณต ๋ค์ด๋ฒ ํ์ดํผํ ์คํธ link๋ฅผ ๋ํ๋ธ๋ค. |
description | string | ๊ฒ์ ๊ฒฐ๊ณผ ๋ฌธ์์ ๋ด์ฉ์ ์์ฝํ ํจ์์ง ์ ๋ณด์ด๋ค. ๋ฌธ์ ์ ์ฒด์ ๋ด์ฉ์ link๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉด ์ฝ์ ์ ์๋ค. ํจ์์ง์์ ๊ฒ์์ด์ ์ผ์นํ๋ ๋ถ๋ถ์ ํ๊ทธ๋ก ๊ฐ์ธ์ ธ ์๋ค. |
pubData | datetime | ๊ฒ์ ๊ฒฐ๊ณผ ๋ฌธ์๊ฐ ๋ค์ด๋ฒ์ ์ ๊ณต๋ ์๊ฐ์ด๋ค. |
JSON ํฌ๋งท์ผ๋ก ์์ฒญํ ๊ฒฐ๊ณผ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
{
"lastBuildDate": "Wed, 17 Mar 2021 19:11:36 +0900",
"total": 219158,
"start": 1,
"display": 10,
"items": [
{
"title": "๋์ ์์น๊ตฌ ์ถ์ ๊ฐ์ต '์กฐ์ฌ์ค๋ฌ์ด ํ์ง'",
"originallink": "http://www.ggilbo.com/news/articleView.html?idxno=834720",
"link": "http://www.ggilbo.com/news/articleView.html?idxno=834720",
"description": "<<b>์๋ณด</b>>=์ง๋ํด ์ฝ๋ก๋19๋ก ์ฌ์คํฑ๋ ๋์ ์ง์ญ ์ถ์ ๋ค์ด ์ฌํด๋ ์กฐ๊ธ์ฉ ๊ฐ์ต๋ ๊ธฐ๋ฏธ๋ฅผ ๋ณด์ด๊ณ ์๋ค. ๋์ ์์ ์ฝ๋ก๋19 ๊ฐ์ผ์ด ์๊ฐ ๊ตญ๋ฉด์ ๋ง์ดํ๊ธฐ๋ ํ์ผ๋ฉฐ ๋ฐฑ์ ์ ์ข
์ผ๋ก ์ง๋จ๋ฉด์ญ์ด ํ์ฑ๋ ๊ฒ์ผ๋ก ๊ธฐ๋๋์ ์ง์ญ <b>๊ฒฝ์ </b>... ",
"pubDate": "Wed, 17 Mar 2021 19:02:00 +0900"
},
{
"title": "[<b>์๋ณด</b>] ๋๋ฆผ์ด์
์ธ๋ ๊ฐ๊ตฌ๋น 100๋ง ์ ์ฌ๋์ง์๊ธ...์ถ๊ฒฝ 1.6์กฐ ์ฆ์ก",
"originallink": "https://hankookilbo.com/News/Read/A2021031717550004609?did=NA",
"link": "https://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=100&oid=469&aid=0000589056",
"description": "์ถ๊ฒฝ ์ฆ์ก ๊ฒฐ์ ์ ์ ์ข
์ฝ๋ก๋๋ฐ์ด๋ฌ์ค ๊ฐ์ผ์ฆ(์ฝ๋ก๋19)์ผ๋ก ์ธํ ๊ฒฝ๊ธฐ ์นจ์ฒด์ ๊ฝ ๋๊ฐ ํ๊ฒฉ ๋ฑ <b>๊ฒฝ์ </b>์ ... ์ด๋ค์ “์ฝ๋ก๋19๋ก <b>๊ฒฝ์ </b>์ ์ด์ค๊ณ ๋ฅผ ๊ฒฝํํ๊ณ ์๋ ๋๋ฆผ์ด์
์ธ์ ๋ํ ์ฌ๋์ง์๊ธ ์ง์ ๋ฐฉ์์ด ๋น ์ง ๋ฐ... ",
"pubDate": "Wed, 17 Mar 2021 18:27:00 +0900"
},
//...
]
}
C#์ผ๋ก ๋ค์ด๋ฒ ๋ด์ค ๊ฒ์ ํ๋ก๊ทธ๋จ ๋ง๋ค๊ธฐ
์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก C#์ผ๋ก ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ExamNaverOpenAPI
์ด๋ฆ์ Windows Forms์ฑ ํ๋ก์ ํธ
๋ฅผ ์์ฑํฉ๋๋ค.
UI๋ ์๋์ ๊ฐ์ด ๋ฐฐ์นํฉ๋๋ค. ํค์๋, ์ถ๋ ฅ ์, ์ ๋ ฌ ๋ฐฉ๋ฒ์ ๊ธฐ๋ณธ ๊ฐ์ ์ ๋ ฅํ๋๋ก ํ์ต๋๋ค. ๋ด์ค ์กฐํ ๊ฒฐ๊ณผ๋ ๋ฆฌ์คํธ ๋ทฐ์ ํ์๋๋๋ก ํ ์์ ์ ๋๋ค.
์ด์ ๋ค์ด๋ฒ ์คํ API์ ์ด๋ป๊ฒ ์์ฒญํ๋์ง ์ฝ๋๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
private string getResults()
{
string keyword = textBoxKeyword.Text; //๊ฒ์์ด
string display = trackBarDisplayCounts.Value.ToString(); //์ถ๋ ฅ ํ์ ์
string sort = "sim"; //์ ๋ ฌ ๋ฐฉ๋ฒ(์ ์ฌ๋)
if (radioButtonDate.Checked == true)
sort = "date"; //์ ๋ ฌ ๋ฐฉ๋ฒ(๋ ์ง)
string query = string.Format("?query={0}&display={1}sort={2}", keyword, display, sort); //์ฟผ๋ฆฌ ๋ง๋ค๊ธฐ
WebRequest request = WebRequest.Create(_apiUrl + query); //์์ฒญ URL์ ์ฟผ๋ฆฌ ๋ถ์ฌ ๋ณด๋ด๊ธฐ
request.Headers.Add("X-Naver-Client-Id", _clientId); //์์ ์ Application ID ์
๋ ฅ
request.Headers.Add("X-Naver-Client-Secret", _clientSecret); //์์ ์ Application Secret ์
๋ ฅ
string requestResult = "";
using (var response = request.GetResponse())
{
using (Stream dataStream = response.GetResponseStream())
{
using (var reader = new StreamReader(dataStream))
{
requestResult = reader.ReadToEnd(); //๊ฒฐ๊ณผ ์ฝ์ด๋ด๊ธฐ
}
}
}
return requestResult; //๊ฒฐ๊ณผ ๋ฐํ
}
์์ ์ค๋ช
ํ ๋๋ก, ์ต์
์ ํ์ ๋ฐ๋ผ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๊ณ ํด๋น URL์ ์์ฒญํ๋ฉด ํน์ ํฌ๋งท์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ฒ ๋ฉ๋๋ค. JSON์ผ๋ก ์์ฒญํ ๊ฒฐ๊ณผ๋ ์๋ ์ฝ๋์ ๊ฐ์ด ํ์ฑ(Parsing)
์ด ๊ฐ๋ฅํฉ๋๋ค. ์ฐธ๊ณ ๋ก JSON ํ์ฑ
์ ๋๊ฒ(Nuget)์์ Newtonsoft.Json
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
private void buttonUpdate_Click(object sender, EventArgs e)
{
try
{
string results = getResults(); //์์ฒญํ ๊ฒฐ๊ณผ ๋ฐํ
//HTML ํ๊ทธ ์ ๊ฑฐ ๋ฐ ๋ณ๊ฒฝ
results = results.Replace("<b>", "");
results = results.Replace("</b>", "");
results = results.Replace("<", "<");
results = results.Replace(">", ">");
var parseJson = JObject.Parse(results);
var countsOfDisplay = Convert.ToInt32(parseJson["display"]);
var countsOfResults = Convert.ToInt32(parseJson["total"]);
listViewResults.Items.Clear();
for (int i=0; i< countsOfDisplay; i++)
{
ListViewItem item = new ListViewItem((i+1).ToString());
var title = parseJson["items"][i]["title"].ToString();
title = title.Replace(""", "\""); //HTML ํ๊ทธ ๋ณ๊ฒฝ
var description = parseJson["items"][i]["description"].ToString();
description = description.Replace(""", "\""); //HTML ํ๊ทธ ๋ณ๊ฒฝ
var link = parseJson["items"][i]["link"].ToString();
//๋ด์ค ์ ๋ชฉ, ๋ณธ๋ฌธ, ๋งํฌ๋ฅผ ๋ฆฌ์คํธ ๋ทฐ์ ์ถ๊ฐ
item.SubItems.Add(title);
item.SubItems.Add(description);
item.SubItems.Add(link);
listViewResults.Items.Add(item);
}
}
catch (Exception exc)
{
Debug.WriteLine(exc.Message);
}
}
์์ฒญํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์๋ณด๋ฉด, ๋ด์ค ์ ๋ชฉ, ๋ณธ๋ฌธ์ ๋ถํ์ํ HTML ํ๊ทธ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. <b>
๋ผ๋ ๊ฐ "
๊ฐ์ ๊ฒ๋ค์ธ๋ฐ์. ๊ฐ์กฐ ํ์์ธ <b>
</b>
ํ๊ทธ๋ ํ์ ์์ผ๋ ์ ๊ฑฐํ๊ณ , "
์ <
, >
๋ ํน์๋ฌธ์๋ก ์นํ๋๋๋ก ํ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ ๋ด์ค์ ์ ๋ชฉ(title)๊ณผ ๋ณธ๋ฌธ(description), ๋งํฌ(link)๋ฅผ ํ์ฑํ์ฌ ๋ฆฌ์คํธ ๋ทฐ์ ๋ณด์ด๋๋ก ์ถ๊ฐํ๋ ๊ฒ์ด ์ ๋ถ์ ๋๋ค. ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.
์์ธํ ์ฝ๋ ์ฌ์ฉ์ ์๋์ ์ํ ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ธ์.
'Programming > .Net' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[.Net] C#์์ ์นด์นด์คํก ์คํAPI/REST API๋ก ๋์๊ฒ ๋ฉ์์ง ๋ณด๋ด๊ธฐ (์์ ํฌํจ)
[.Net] C#์์ ์นด์นด์คํก ์คํAPI/REST API๋ก ๋์๊ฒ ๋ฉ์์ง ๋ณด๋ด๊ธฐ (์์ ํฌํจ)
2021.03.23 -
[.Net] ๊ณต๊ณต๋ฐ์ดํฐํฌํธ API ์ฌ์ฉํ์ฌ C#์์ ์ค์๊ฐ ๋ฒ์ค ์์น ์กฐํํ๊ธฐ(์์ ํฌํจ)
[.Net] ๊ณต๊ณต๋ฐ์ดํฐํฌํธ API ์ฌ์ฉํ์ฌ C#์์ ์ค์๊ฐ ๋ฒ์ค ์์น ์กฐํํ๊ธฐ(์์ ํฌํจ)
2021.03.20 -
[.Net] C# ํ๊ธ๊ณผ ์ปดํจํฐ HwpCtrl ์ ๊ทผ ํ์ฉ ์ค๋ฅ ํด๊ฒฐํ๊ธฐ
[.Net] C# ํ๊ธ๊ณผ ์ปดํจํฐ HwpCtrl ์ ๊ทผ ํ์ฉ ์ค๋ฅ ํด๊ฒฐํ๊ธฐ
2021.03.16 -
[.Net] C# ํ๋ก๊ทธ๋จ ๋ฐฐํฌ ์ ์์ค ์ฝ๋ ๋ณดํธ๋ฅผ ์ํ ๋๋ ํ, ConfuserEx ์ฌ์ฉ๋ฐฉ๋ฒ
[.Net] C# ํ๋ก๊ทธ๋จ ๋ฐฐํฌ ์ ์์ค ์ฝ๋ ๋ณดํธ๋ฅผ ์ํ ๋๋ ํ, ConfuserEx ์ฌ์ฉ๋ฐฉ๋ฒ
2021.03.14