[WPF] 공공데이터 포털 API 이용 클라이언트 구현 Part 3

이미지
그룹핑 ListViewItem 그룹핑 할 수 있습니다. 먼저 CheckBox에 Checked 이벤트를 통해 그룹핑을 추가하고 RemoveChecked 이벤트를 통해 그룹핑을 제거 할 수 있도록 CheckBox를 선언 합니다. 1: <!-- Group CheckBox --> 2: <CheckBox Grid.Column="0" 3: Grid.Row="0" 4: Checked="AddGrouping" 5: Unchecked="RemoveGrouping">Group by Name</CheckBox> 그룹 스타일 선언 GroupStyle 속성에 ContainerStyle 속성을 이용해 Style을 지정 합니다. Expander 컨트롤을 이용해 아파트명과 그룹 아이템의 개수를 Expander Header에 표시 하도록 ControlTemlate를 선언 합니다. 1: <!-- Group Style --> 2: <ListView.GroupStyle> 3: <GroupStyle> 4: <GroupStyle.ContainerStyle> 5: <Style TargetType="{x:Type GroupItem}"> 6: <Setter Property="Margin" Value="0,0,0,5" /> 7: <Setter Property="Te...

[WPF] 공공데이터 포털 API 이용 클라이언트 구현 Part 1

공공데이터 포털 API 이용 클라이언트 구현 Part 1

공공데이터 포탈 회원 가입 및 요청

https://www.data.go.kr 회원 가입 후 사용하고자 하는 API 승인 요청을 합니다. 저는 아파트 실거래 API를 이용하기로 합니다. 

아파트 실거래 API 승인이 완료되면 서비스 정보를 제공해주며 해당 정보를 이용해 API를 호출하여 이용할 수 있습니다.

API 서비스 정보

API 응답 결과

응답 데이터

아파트 실거래 API는 응답 결과를 XML 형식으로 전달 합니다. ListView 컨트롤에 바인딩하기 위해 응답 결과 XML 데이터를 사용자 정의 객체 컬렉션으로 변환하는 작업이 필요합니다.

TradeApt 객체

1:    public class TradeApt  
2:    {  
3:      // 거래금액  
4:      public string TradeMoney { get; set; }  
5:      // 건축년도  
6:      public string YearOfConstruction { get; set; }  
7:      // 년  
8:      public string Year { get; set; }  
9:      // 도로명  
10:      public string RoadName { get; set; }  
11:      // 도로명건물본번호코드  
12:      public string RoadBuildingBonBun { get; set; }  
13:      // 도로명건물부번호코드  
14:      public string RoadBuildingBuBun { get; set; }  
15:      // 도로명시군구코드  
16:      public string RoadSiGunGuCode { get; set; }  
17:      // 도로명일련번호코드  
18:      public string RoadSerialNumber { get; set; }  
19:      // 도로명지상지하코드  
20:      public string RoadGroundCode { get; set; }  
21:      // 도로명코드  
22:      public string RoadCode { get; set; }  
23:      // 법정동  
24:      public string DongName { get; set; }  
25:      // 법정동본번코드  
26:      public string DongBonBun { get; set; }  
27:      // 법정동부번코드  
28:      public string DongBuBun { get; set; }  
29:      // 법정동시군구코드  
30:      public string DongSiGunGuCode { get; set; }  
31:      // 법정동읍면동코드  
32:      public string DongCode { get; set; }  
33:      // 법정동지번코드  
34:      public string DongJiBunCode { get; set; }  
35:      // 아파트  
36:      public string ApartName { get; set; }  
37:      // 월  
38:      public string TradeMonth { get; set; }  
39:      // 일  
40:      public string TradeDay { get; set; }  
41:      // 일련번호  
42:      public string SerialNumber { get; set; }  
43:      // 전용면적  
44:      public string ExclusiveArea { get; set; }  
45:      // 지번  
46:      public string JiBun { get; set; }  
47:      // 지역코드  
48:      public string RegionCode { get; set; }  
49:      // 층  
50:      public string Floor { get; set; }  
51:    }  

응답 결과 객체

1:    public class TradeAptResult  
2:    {  
3:      public string ResultCode { get; set; }  
4:      public string ResultMsg { get; set; }  
5:      public List<TradeApt> Items { get; set; }  
6:      public int NumOfRows { get; set; }  
7:      public int PageNo { get; set; }  
8:      public int TotalCount { get; set; }  
9:      public TradeAptResult()  
10:      {  
11:        Items = new List<TradeApt>();  
12:      }  
13:    }  

응답 데이터 변환

1:    public class AptTradeAPI  
2:    {  
3:      #region Member  
4:      // 결과코드 유무  
5:      private bool _inResultCode;  
6:      // 결과메시지 유무  
7:      private bool _inResultMsg;  
8:      // 페이지 별 개수 유무  
9:      private bool _inNumOfRows;  
10:      // 페이지 번호 유무  
11:      private bool _inPageNo;  
12:      // 전체 개수  
13:      private bool _inTotalCount;  
14:      // 거래금액 유무  
15:      private bool _inTradeMoney;  
16:      // 건축년도 유무  
17:      private bool _inYearOfConstruction;  
18:      // 년 유무  
19:      private bool _inYear;  
20:      // 도로명 유무  
21:      private bool _inRoadName;  
22:      // 도로명건물본번호코드 유무  
23:      private bool _inRoadBuildingBonBun;  
24:      // 도로명건물부번호코드 유무  
25:      private bool _inRoadBuildingBuBun;  
26:      // 도로명시군구코드 유무  
27:      private bool _inRoadSiGunGuCode;  
28:      // 도로명일련번호코드 유무  
29:      private bool _inRoadSerialNumber;  
30:      // 도로명지상지하코드 유무  
31:      private bool _inRoadGroundCode;  
32:      // 도로명코드 유무  
33:      private bool _inRoadCode;  
34:      // 법정동 유무  
35:      private bool _inDongName;  
36:      // 법정동본번코드 유무  
37:      private bool _inDongBonBun;  
38:      // 법정동부번코드 유무  
39:      private bool _inDongBuBun;  
40:      // 법정동시군구코드 유무  
41:      private bool _inDongSiGunGuCode;  
42:      // 법정동읍면동코드 유무  
43:      private bool _inDongCode;  
44:      // 법정동지번코드 유무  
45:      private bool _inDongJiBunCode;  
46:      // 아파트 유무  
47:      private bool _inApartName;  
48:      // 월 유무  
49:      private bool _inTradeMonth;  
50:      // 일 유무  
51:      private bool _inTradeDay;  
52:      // 일련번호 유무  
53:      private bool _inSerialNumber;  
54:      // 전용면적 유무  
55:      private bool _inExclusiveArea;  
56:      // 지번 유무  
57:      private bool _inJiBun;  
58:      // 지역코드 유무  
59:      private bool _inRegionCode;  
60:      // 층 유무  
61:      private bool _inFloor;  
62:      // -----------------------------------  
63:      // 결과코드  
64:      private string _resultCode;  
65:      // 결과메시지  
66:      private string _resultMsg;  
67:      // 페이지 별 개수 유무  
68:      private int _numOfRows;  
69:      // 페이지 번호 유무  
70:      private int _pageNo;  
71:      // 전체 개수  
72:      private int _totalCount;  
73:      // 거래금액  
74:      private string _tradeMoney;  
75:      // 건축년도  
76:      private string _yearOfConstruction;  
77:      // 년  
78:      private string _year;  
79:      // 도로명  
80:      private string _roadName;  
81:      // 도로명건물본번호코드  
82:      private string _roadBuildingBonBun;  
83:      // 도로명건물부번호코드  
84:      private string _roadBuildingBuBun;  
85:      // 도로명시군구코드  
86:      private string _roadSiGunGuCode;  
87:      // 도로명일련번호코드  
88:      private string _roadSerialNumber;  
89:      // 도로명지상지하코드  
90:      private string _roadGroundCode;  
91:      // 도로명코드  
92:      private string _roadCode;  
93:      // 법정동  
94:      private string _dongName;  
95:      // 법정동본번코드  
96:      private string _dongBonBun;  
97:      // 법정동부번코드  
98:      private string _dongBuBun;  
99:      // 법정동시군구코드  
100:      private string _dongSiGunGuCode;  
101:      // 법정동읍면동코드  
102:      private string _dongCode;  
103:      // 법정동지번코드  
104:      private string _dongJiBunCode;  
105:      // 아파트  
106:      private string _apartName;  
107:      // 월  
108:      private string _tradeMonth;  
109:      // 일  
110:      private string _tradeDay;  
111:      // 일련번호  
112:      private string _serialNumber;  
113:      // 전용면적  
114:      private string _exclusiveArea;  
115:      // 지번  
116:      private string _jiBun;  
117:      // 지역코드  
118:      private string _regionCode;  
119:      // 층  
120:      private string _floor;  
121:      #endregion  
122:      public TradeAptResult GetXmlData(string url)  
123:      {  
124:        TradeAptResult result = new TradeAptResult();  
125:        XmlTextReader reader = new XmlTextReader(url);  
126:        #region Read()  
127:        while (reader.Read())  
128:        {  
129:          switch (reader.NodeType)  
130:          {  
131:            case XmlNodeType.Element:  
132:              if (reader.Name.Equals("resultCode")) _inResultCode = true;  
133:              if (reader.Name.Equals("resultMsg")) _inResultMsg = true;  
134:              if (reader.Name.Equals("numOfRows")) _inNumOfRows = true;  
135:              if (reader.Name.Equals("pageNo")) _inPageNo = true;  
136:              if (reader.Name.Equals("totalCount")) _inTotalCount = true;  
137:              if (reader.Name.Equals("거래금액")) _inTradeMoney = true;  
138:              if (reader.Name.Equals("건축년도")) _inYearOfConstruction = true;  
139:              if (reader.Name.Equals("년")) _inYear = true;  
140:              if (reader.Name.Equals("도로명")) _inRoadName = true;  
141:              if (reader.Name.Equals("도로명건물본번호코드")) _inRoadBuildingBonBun = true;  
142:              if (reader.Name.Equals("도로명건물부번호코드")) _inRoadBuildingBuBun = true;  
143:              if (reader.Name.Equals("도로명시군구코드")) _inRoadSiGunGuCode = true;  
144:              if (reader.Name.Equals("도로명일련번호코드")) _inRoadSerialNumber = true;  
145:              if (reader.Name.Equals("도로명지상지하코드")) _inRoadGroundCode = true;  
146:              if (reader.Name.Equals("도로명코드")) _inRoadCode = true;  
147:              if (reader.Name.Equals("법정동")) _inDongName = true;  
148:              if (reader.Name.Equals("법정동본번코드")) _inDongBonBun = true;  
149:              if (reader.Name.Equals("법정동부번코드")) _inDongBuBun = true;  
150:              if (reader.Name.Equals("법정동시군구코드")) _inDongSiGunGuCode = true;  
151:              if (reader.Name.Equals("법정동읍면동코드")) _inDongCode = true;  
152:              if (reader.Name.Equals("법정동지번코드")) _inDongJiBunCode = true;  
153:              if (reader.Name.Equals("아파트")) _inApartName = true;  
154:              if (reader.Name.Equals("월")) _inTradeMonth = true;  
155:              if (reader.Name.Equals("일")) _inTradeDay = true;  
156:              if (reader.Name.Equals("일련번호")) _inSerialNumber = true;  
157:              if (reader.Name.Equals("전용면적")) _inExclusiveArea = true;  
158:              if (reader.Name.Equals("지번")) _inJiBun = true;  
159:              if (reader.Name.Equals("지역코드")) _inRegionCode = true;  
160:              if (reader.Name.Equals("층")) _inFloor = true;  
161:              break;  
162:            case XmlNodeType.Text:  
163:              if (_inResultCode)  
164:              {  
165:                _resultCode = reader.Value;  
166:                _inResultCode = false;  
167:              }  
168:              if (_inResultMsg)  
169:              {  
170:                _resultMsg = reader.Value;  
171:                _inResultMsg = false;  
172:              }  
173:              if (_inNumOfRows)  
174:              {  
175:                _numOfRows = Convert.ToInt32(reader.Value);  
176:                _inNumOfRows = false;  
177:              }  
178:              if (_inPageNo)  
179:              {  
180:                _pageNo = Convert.ToInt32(reader.Value);  
181:                _inPageNo = false;  
182:              }  
183:              if (_inTotalCount)  
184:              {  
185:                _totalCount = Convert.ToInt32(reader.Value);  
186:                _inTotalCount = false;  
187:              }  
188:              if (_inTradeMoney)  
189:              {  
190:                _tradeMoney = reader.Value;  
191:                _inTradeMoney = false;  
192:              }  
193:              if (_inYearOfConstruction)  
194:              {  
195:                _yearOfConstruction = reader.Value;  
196:                _inYearOfConstruction = false;  
197:              }  
198:              if (_inYear)  
199:              {  
200:                _year = reader.Value;  
201:                _inYear = false;  
202:              }  
203:              if (_inRoadName)  
204:              {  
205:                _roadName = reader.Value;  
206:                _inRoadName = false;  
207:              }  
208:              if (_inRoadBuildingBonBun)  
209:              {  
210:                _roadBuildingBonBun = reader.Value;  
211:                _inRoadBuildingBonBun = false;  
212:              }  
213:              if (_inRoadBuildingBuBun)  
214:              {  
215:                _roadBuildingBuBun = reader.Value;  
216:                _inRoadBuildingBuBun = false;  
217:              }  
218:              if (_inRoadSiGunGuCode)  
219:              {  
220:                _roadSiGunGuCode = reader.Value;  
221:                _inRoadSiGunGuCode = false;  
222:              }  
223:              if (_inRoadSerialNumber)  
224:              {  
225:                _roadSerialNumber = reader.Value;  
226:                _inRoadSerialNumber = false;  
227:              }  
228:              if (_inRoadGroundCode)  
229:              {  
230:                _roadGroundCode = reader.Value;  
231:                _inRoadGroundCode = false;  
232:              }  
233:              if (_inRoadCode)  
234:              {  
235:                _roadCode = reader.Value;  
236:                _inRoadCode = false;  
237:              }  
238:              if (_inDongName)  
239:              {  
240:                _dongName = reader.Value;  
241:                _inDongName = false;  
242:              }  
243:              if (_inDongBonBun)  
244:              {  
245:                _dongBonBun = reader.Value;  
246:                _inDongBonBun = false;  
247:              }  
248:              if (_inDongBuBun)  
249:              {  
250:                _dongBuBun = reader.Value;  
251:                _inDongBuBun = false;  
252:              }  
253:              if (_inDongSiGunGuCode)  
254:              {  
255:                _dongSiGunGuCode = reader.Value;  
256:                _inDongSiGunGuCode = false;  
257:              }  
258:              if (_inDongCode)  
259:              {  
260:                _dongCode = reader.Value;  
261:                _inDongCode = false;  
262:              }  
263:              if (_inDongJiBunCode)  
264:              {  
265:                _dongJiBunCode = reader.Value;  
266:                _inDongJiBunCode = false;  
267:              }  
268:              if (_inApartName)  
269:              {  
270:                _apartName = reader.Value;  
271:                _inApartName = false;  
272:              }  
273:              if (_inTradeMonth)  
274:              {  
275:                _tradeMonth = reader.Value;  
276:                _inTradeMonth = false;  
277:              }  
278:              if (_inTradeDay)  
279:              {  
280:                _tradeDay = reader.Value;  
281:                _inTradeDay = false;  
282:              }  
283:              if (_inSerialNumber)  
284:              {  
285:                _serialNumber = reader.Value;  
286:                _inSerialNumber = false;  
287:              }  
288:              if (_inExclusiveArea)  
289:              {  
290:                _exclusiveArea = reader.Value;  
291:                _inExclusiveArea = false;  
292:              }  
293:              if (_inJiBun)  
294:              {  
295:                _jiBun = reader.Value;  
296:                _inJiBun = false;  
297:              }  
298:              if (_inRegionCode)  
299:              {  
300:                _regionCode = reader.Value;  
301:                _inRegionCode = false;  
302:              }  
303:              if (_inFloor)  
304:              {  
305:                _floor = reader.Value;  
306:                _inFloor = false;  
307:              }  
308:              break;  
309:            case XmlNodeType.EndElement:  
310:              if (reader.Name.Equals("resultCode")) result.ResultCode = _resultCode;  
311:              if (reader.Name.Equals("resultMsg")) result.ResultMsg = _resultMsg;  
312:              if (reader.Name.Equals("numOfRows")) result.NumOfRows = _numOfRows;  
313:              if (reader.Name.Equals("pageNo")) result.PageNo = _pageNo;  
314:              if (reader.Name.Equals("totalCount")) result.TotalCount = _totalCount;  
315:              if (reader.Name.Equals("item"))  
316:              {  
317:                result.Items.Add(new TradeApt  
318:                {  
319:                  TradeMoney = _tradeMoney,  
320:                  YearOfConstruction = _yearOfConstruction,  
321:                  Year = _year,  
322:                  RoadName = _roadName,  
323:                  RoadBuildingBonBun = _roadBuildingBonBun,  
324:                  RoadBuildingBuBun = _roadBuildingBuBun,  
325:                  RoadSiGunGuCode = _roadSiGunGuCode,  
326:                  RoadSerialNumber = _roadSerialNumber,  
327:                  RoadGroundCode = _roadGroundCode,  
328:                  RoadCode = _roadCode,  
329:                  DongName = _dongName,  
330:                  DongBonBun = _dongBonBun,  
331:                  DongBuBun = _dongBuBun,  
332:                  DongSiGunGuCode = _dongSiGunGuCode,  
333:                  DongCode = _dongCode,  
334:                  DongJiBunCode = _dongJiBunCode,  
335:                  ApartName = _apartName,  
336:                  TradeMonth = _tradeMonth,  
337:                  TradeDay = _tradeDay,  
338:                  SerialNumber = _serialNumber,  
339:                  ExclusiveArea = _exclusiveArea,  
340:                  JiBun = _jiBun,  
341:                  RegionCode = _regionCode,  
342:                  Floor = _floor  
343:                });  
344:              }  
345:              break;  
346:          }  
347:        }  
348:        #endregion  
349:        return result;  
350:      }  
351:    }  

API 조회 및 출력

AptTradeAPI 클래스를 이용해 API를 호출하여 XML 데이터를 사용자 정의 객체로 변환 합니다. 결과 확인을 위해 간단하게 Console에 출력을 해봅니다.

1:        string requestUri = CreateRequestUrl(serviceKey, pageNo, numOfRows, LAWD_CD, DEAL_YMD);  
2:        AptTradeAPI aptTradeApi = new AptTradeAPI();  
3:        TradeAptResult result = aptTradeApi.GetXmlData(requestUri);  
4:        foreach (var item in result.Items)  
5:        {  
6:          Console.WriteLine($"아파트명: {item.ApartName}, 거래가격: {item.TradeMoney}");  
7:        }  































댓글

이 블로그의 인기 게시물

[C#] Task 완료 시 다른 Task를 자동으로 수행

[C#] 태스크(Task)가 완료될 때 까지 대기하여 결과를 얻는 방법

[C#] 명시적으로 Task 생성 및 실행