๋ธ๋ก๊ทธ ์ฎ๊ฒผ์ต๋๋ค! ๐ก integer.blog
XML ๋ฐ์ดํฐ๋ฅผ Java ๊ฐ์ฒด๋ก ๋ณํํ์ฌ ์ฌ์ฉํ ๊ฒฝํ์ ์ ๋ฆฌํด๋ณธ๋ค.
JSON ๋ฐ์ดํฐ๋ง ๋ค๋ฃจ๋ค๊ฐ XML์ ๋ค๋ฃจ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ์กฐ๊ธ ์์ํ๋ค. (์์ฆ ๊ฐ์ ์ธ์์ XML ์ด๋ผ๋!)
๊ทธ๋ฐ๋ฐ ์์ง XML์ ์ฌ์ฉํ๋ API๋ค์ด ๋ง๋ค๋ ์ฌ์ค์ ์๊ฒ ๋์๊ณ , ํญ๊ณต ๋ถ์ผ๋ ๊ฑฐ์ ๋ชจ๋ API๊ฐ XML์ด๋ผ๊ณ ํ๋ค.
์ฒ์์๋ ํ๊ตญ๊ฑฐ๋์์ ์ฃผ๊ฐ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ๋ผ๋ ๋ธ๋ก๊ทธ ๊ธ์ ์ฐธ๊ณ ํ์ฌ
API๊ฐ ์ ๊ณตํด์ฃผ๋ XML ๋ฐ์ดํฐ๋ฅผ JSON Object๋ก ๋ณํํ๊ณ , ์ด๋ฅผ ๋ค์ Map ํํ๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ๋ฐํ๋ค.
๊ทธ๋ฐ๋ฐ ์ด ๊ฒฝ์ฐ ๊ฐ๋ฐ์ ๋น ๋ฅด๊ฒ ์งํํ ์ ์์์ง๋ง, ์์ธ ์ฒ๋ฆฌ์ ๋ฐ์ดํฐ ๊ฐ๊ณต์ ํ๊ณ๊ฐ ์์๋ค.
๋ถํ์ฅ๋์ผ๋ก๋ถํฐ XML ๋ฐ์ดํฐ๋ฅผ Java ๊ฐ์ฒด๋ก ๋ณํํ์ฌ ๋ค๋ฃจ๋ Unmarshalling
์ด๋ผ๋ ๊ฐ๋
์ ๋ฃ๊ฒ ๋์๊ณ ,
์ด๋ฅผ ์ง์ํด์ฃผ๋ Java API์ธ JAXB(Java Architecture for XML Binding)๋ฅผ ์๊ฒ ๋์๋ค.
JAXB ?
JAXB๋ Java ํด๋์ค๋ฅผ XML๋ก ๋ณํํด์ฃผ๋ Marshalling
๊ณผ XML์ Java ๊ฐ์ฒด๋ก ๋ณํํด์ฃผ๋ Unmarshalling
๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
JAXB๋ JDK1.6์ ๋ฒ๋ค๋ง๋์ด์๊ธฐ ๋๋ฌธ์ JDK 1.6 ์ด์์ ๋ฒ์ ์ด๋ฉด ๋ณ๋ค๋ฅธ ์ค์ ์์ด ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค.
(JDK 1.6 ์ดํ์ ๊ฒฝ์ฐ JAXB ๊ณต์ Repo์์ ๋ค์ด๋ฐ์์ ์ฌ์ฉํด์ผ ํ๋ค๋๋ฐ ์ํด๋ด์ ๋ชจ๋ฅด๊ฒ ๋ค.)
์ด๋ฏธ์ง ์ถ์ฒ: IBM Knowledge Center
๊ฐ๋จํ ์ค๋ช
ํ์๋ฉด xjc ์คํค๋ง ์ปดํ์ผ๋ฌ
๋ฅผ ํตํด XML ์คํค๋ง๋ฅผ Java ๊ฐ์ฒด๋ก ๋ณํํ๊ณ ,
schemagen ์คํค๋ง ์์ฑ๊ธฐ
๋ฅผ ํตํด Java ๊ฐ์ฒด๋ฅผ XML ์คํค๋ง๋ก ์์ฑํด์ฃผ๋ ๊ฒ์ด๋ค.
KRX(ํ๊ตญ๊ฑฐ๋์) ์ฃผ๊ฐ์ ๋ณด API
KRX(ํ๊ตญ๊ฑฐ๋์)์ ์ฃผ๊ฐ์ ๋ณด API๊ฐ ์ ๊ณตํด์ฃผ๋ ์ค์๊ฐ ์์ธ ๋ฐ์ดํฐ๋ ์๋์ ๊ฐ๋ค.
(์์๋ก ๋ค์ด๋ฒ์ ์ข ๋ชฉ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ค.)
<?xml version="1.0" encoding="utf-8" ?>
<stockprice querytime="2019-06-03 14:18:12" >
<TBL_DailyStock>
<DailyStock day_Date="19/06/03" day_EndPrice="115,000" day_Dungrak="2" day_getDebi="3,500" day_Start="113,000" day_High="115,000" day_Low="112,000" day_Volume="270,570" day_getAmount="30,831,869,000"/>
<DailyStock day_Date="19/05/31" day_EndPrice="111,500" day_Dungrak="5" day_getDebi="500" day_Start="111,500" day_High="112,500" day_Low="110,000" day_Volume="310,649" day_getAmount="34,620,804,500"/>
<DailyStock day_Date="19/05/30" day_EndPrice="112,000" day_Dungrak="2" day_getDebi="2,500" day_Start="110,000" day_High="114,000" day_Low="109,500" day_Volume="378,379" day_getAmount="42,526,903,757"/>
<DailyStock day_Date="19/05/29" day_EndPrice="109,500" day_Dungrak="2" day_getDebi="1,000" day_Start="109,000" day_High="111,000" day_Low="108,500" day_Volume="515,196" day_getAmount="56,529,874,000"/>
<DailyStock day_Date="19/05/28" day_EndPrice="108,500" day_Dungrak="5" day_getDebi="2,000" day_Start="109,500" day_High="112,500" day_Low="108,500" day_Volume="1,490,526" day_getAmount="162,354,790,344"/>
<DailyStock day_Date="19/05/27" day_EndPrice="110,500" day_Dungrak="5" day_getDebi="3,000" day_Start="112,500" day_High="113,000" day_Low="109,500" day_Volume="369,902" day_getAmount="41,005,007,000"/>
<DailyStock day_Date="19/05/24" day_EndPrice="113,500" day_Dungrak="2" day_getDebi="500" day_Start="113,000" day_High="115,000" day_Low="112,500" day_Volume="408,081" day_getAmount="46,387,229,000"/>
<DailyStock day_Date="19/05/23" day_EndPrice="113,000" day_Dungrak="3" day_getDebi="0" day_Start="112,500" day_High="114,000" day_Low="110,000" day_Volume="545,497" day_getAmount="61,145,647,703"/>
<DailyStock day_Date="19/05/22" day_EndPrice="113,000" day_Dungrak="5" day_getDebi="1,500" day_Start="115,000" day_High="115,000" day_Low="111,000" day_Volume="567,069" day_getAmount="64,006,105,000"/>
<DailyStock day_Date="19/05/21" day_EndPrice="114,500" day_Dungrak="5" day_getDebi="4,000" day_Start="117,500" day_High="119,500" day_Low="113,500" day_Volume="603,105" day_getAmount="70,058,497,000"/>
</TBL_DailyStock>
<TBL_AskPrice>
<AskPrice member_memdoMem="๋ฏธ๋์์
๋์ฐ" member_memdoVol="55,036" member_memsoMem="๋ชจ๊ฐ์์ธ" member_mesuoVol="51,883"/>
<AskPrice member_memdoMem="ํค์์ฆ๊ถ" member_memdoVol="22,730" member_memsoMem="๋ฉ๋ฆด๋ฆฐ์น" member_mesuoVol="26,117"/>
<AskPrice member_memdoMem="NHํฌ์์ฆ๊ถ" member_memdoVol="19,927" member_memsoMem="์์ค์ง" member_mesuoVol="15,435"/>
<AskPrice member_memdoMem="๋ชจ๊ฐ์์ธ" member_memdoVol="16,103" member_memsoMem="์จ์" member_mesuoVol="13,549"/>
<AskPrice member_memdoMem="CS์ฆ๊ถ" member_memdoVol="15,608" member_memsoMem="๋ฏธ๋์์
๋์ฐ" member_mesuoVol="13,470"/>
</TBL_AskPrice>
<TBL_StockInfo JongName="NAVER๋ณดํต์ฃผ" CurJuka="115,000" DungRak="2" Debi="3,500" PrevJuka="111,500" Volume="270,570" Money="30,831,869,000" StartJuka="113,000" HighJuka="115,000" LowJuka="112,000" High52="782,000" Low52="106,500" UpJuka="144,500" DownJuka="78,500" Per="25.92" Amount="164,813,395" FaceJuka="100" />
<TBL_Hoga mesuJan0="3,709" mesuHoka0="113,500" mesuJan1="5,714" mesuHoka1="113,000" mesuJan2="3,504" mesuHoka2="112,500" mesuJan3="4,100" mesuHoka3="112,000" mesuJan4="3,813" mesuHoka4="111,500" medoJan0="4,389" medoHoka0="116,000" medoJan1="5,532" medoHoka1="115,500" medoJan2="14,353" medoHoka2="115,000" medoJan3="6,572" medoHoka3="114,500" medoJan4="734" medoHoka4="114,000"/>
<TBL_TimeConclude>
<TBL_TimeConclude time="14:18:20" negoprice="115,000" Dungrak="2" Debi="3,500" sellprice="115,000" buyprice="114,500" amount="4"/>
<TBL_TimeConclude time="14:18:10" negoprice="114,500" Dungrak="2" Debi="3,000" sellprice="115,000" buyprice="114,500" amount="80"/>
<TBL_TimeConclude time="14:18:00" negoprice="115,000" Dungrak="2" Debi="3,500" sellprice="115,000" buyprice="114,500" amount="108"/>
<TBL_TimeConclude time="14:17:50" negoprice="115,000" Dungrak="2" Debi="3,500" sellprice="115,000" buyprice="114,500" amount="95"/>
<TBL_TimeConclude time="14:17:40" negoprice="115,000" Dungrak="2" Debi="3,500" sellprice="115,000" buyprice="114,500" amount="216"/>
<TBL_TimeConclude time="14:17:30" negoprice="114,500" Dungrak="2" Debi="3,000" sellprice="115,000" buyprice="114,500" amount="17"/>
<TBL_TimeConclude time="14:17:20" negoprice="114,500" Dungrak="2" Debi="3,000" sellprice="115,000" buyprice="114,500" amount="15"/>
<TBL_TimeConclude time="14:17:10" negoprice="114,500" Dungrak="2" Debi="3,000" sellprice="115,000" buyprice="114,500" amount="39"/>
<TBL_TimeConclude time="14:17:00" negoprice="114,500" Dungrak="2" Debi="3,000" sellprice="115,000" buyprice="114,500" amount="451"/>
<TBL_TimeConclude time="14:16:50" negoprice="115,000" Dungrak="2" Debi="3,500" sellprice="115,000" buyprice="114,500" amount="503"/>
</TBL_TimeConclude>
<stockInfo kosdaqJisu="697.33" kosdaqJisuBuho="2" kosdaqJisuDebi="0.86" starJisu="1328.27" starJisuBuho="2" starJisuDebi="10.63" jisu50="" jisu50Buho="" jisu50Debi="" myNowTime="2019/06/03 14:18:15" myJangGubun="์ฅ์ค" myPublicPrice="" krx100Jisu="4319.08" krx100buho="2" krx100Debi="60.71" kospiJisu="2063.14" kospiBuho="2" kospiDebi="21.40" kospi200Jisu="267.55" kospi200Buho="2" kospi200Debi="3.66"/>
</stockprice>
์ด ์ค ํ์ํ ๋ฐ์ดํฐ๋ ์๋์ ๊ฐ์๋ค.
<stockprice querytime="2019-05-22 15:19:56">
<TBL_DailyStock>
<DailyStock day_Date="19/05/22" day_EndPrice="113,000" day_Dungrak="5" day_getDebi="1,500" day_Start="115,000" day_High="115,000" day_Low="111,000" day_Volume="521,770" day_getAmount="58,887,446,500"/>
<DailyStock day_Date="19/05/21" day_EndPrice="114,500" day_Dungrak="5" day_getDebi="4,000" day_Start="117,500" day_High="119,500" day_Low="113,500" day_Volume="603,105" day_getAmount="70,058,497,000"/>
<DailyStock day_Date="19/05/20" day_EndPrice="118,500" day_Dungrak="5" day_getDebi="2,500" day_Start="121,500" day_High="121,500" day_Low="118,000" day_Volume="449,916" day_getAmount="53,573,016,000"/>
<DailyStock day_Date="19/05/17" day_EndPrice="121,000" day_Dungrak="2" day_getDebi="2,000" day_Start="120,000" day_High="123,500" day_Low="118,500" day_Volume="439,545" day_getAmount="53,184,383,000"/>
<DailyStock day_Date="19/05/16" day_EndPrice="119,000" day_Dungrak="5" day_getDebi="1,000" day_Start="120,500" day_High="121,000" day_Low="118,000" day_Volume="484,468" day_getAmount="57,871,810,000"/>
<DailyStock day_Date="19/05/15" day_EndPrice="120,000" day_Dungrak="5" day_getDebi="2,000" day_Start="121,500" day_High="123,000" day_Low="120,000" day_Volume="460,936" day_getAmount="55,811,604,000"/>
<DailyStock day_Date="19/05/14" day_EndPrice="122,000" day_Dungrak="5" day_getDebi="500" day_Start="121,000" day_High="123,500" day_Low="119,500" day_Volume="532,037" day_getAmount="64,845,489,250"/>
<DailyStock day_Date="19/05/13" day_EndPrice="122,500" day_Dungrak="3" day_getDebi="0" day_Start="121,500" day_High="124,000" day_Low="121,500" day_Volume="343,827" day_getAmount="42,101,773,000"/>
<DailyStock day_Date="19/05/10" day_EndPrice="122,500" day_Dungrak="2" day_getDebi="3,500" day_Start="120,500" day_High="123,000" day_Low="120,000" day_Volume="474,352" day_getAmount="57,723,276,000"/>
<DailyStock day_Date="19/05/09" day_EndPrice="119,000" day_Dungrak="5" day_getDebi="4,500" day_Start="122,500" day_High="124,000" day_Low="119,000" day_Volume="799,208" day_getAmount="95,972,050,550"/>
</TBL_DailyStock>
<TBL_StockInfo
JongName="NAVER๋ณดํต์ฃผ"
CurJuka="113,000"
StockDungRak="5"
Debi="1,500"
PrevJuka="114,500"
Volume="521,770"
Money="58,887,446,500"
StartJuka="115,000"
HighJuka="115,000"
LowJuka="111,000"
High52="782,000"
Low52="106,500"
UpJuka="148,500"
DownJuka="80,500"
Per="25.47"
Amount="164,813,395"
FaceJuka="100" />
</stockprice>
์ฆ, ํ์ํ ๋ฐ์ดํฐ๋ <TBL_DailyStock>
๊ณผ <TBL_StockInfo>
๋จ 2๊ฐ์ ํ
์ด๋ธ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๋จํ๋ค๊ณ ์๊ฐํ๋ค.
๊ทธ๋ฐ๋ฐ ์ด ๋ ํ
์ด๋ธ์ ๋ชจ์์๊ฐ ์กฐ๊ธ ๋ฌ๋๋ค.
<TBL_DailyStock>
๋ ์ต๊ทผ 10์ผ์ DailyStock ์ ๊ฐ์ง๊ณ ์๊ณ , ๊ฐ DailyStock ์ 9๊ฐ์ Attribute๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋ฐ๋ฉด,
<TBL_StockInfo>
๋ 17๊ฐ์ Attribute๋ง ๊ฐ์ง๊ณ ์์๋ค.
JAXB Unmarshalling์ ํต์ฌ์ ์ด XML์คํค๋ง ๋ชจ์๋๋ก Java ํด๋์ค๋ฅผ ์์ฑํ๋ฉด,
ํด๋์ค์ ๊ฐ ํ๋์ ํด๋นํ๋ XML์ ๋ฐ์ดํฐ๊ฐ ๋ฐ์ธ๋ฉ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฏ๋ก XML ์คํค๋ง์ ๋ชจ์์๋ฅผ ์ ํํ๊ฒ ํ์ ํ ํ์ Java Class๋ฅผ ์์ฑํด์ผ ํ๋ค.
Java Class ์์ฑ
์ฐ์ , ์ต์์ ํ๊ทธ๋ <stockprice>
์ด๋ฏ๋ก ์๋์ ๊ฐ์ด StockPrice
ํด๋์ค๋ฅผ ์์ฑํ๊ณ ,
JAXB ๋ฐ์ธ๋ฉ ๋ฐํ์ API๊ฐ ์ ์ ์๋๋ก @XmlRootElement(name = "stockprice")
์ด๋
ธํ
์ด์
์ ๋ถ์ฌ ๋งคํ ์ ๋ณด๋ฅผ ์์ฑํ๋ค.
๊ทธ๋ฐ๋ฐ <stockprice>
์ ๊ฒฝ์ฐ Attribute๋ก querytime
์ ๊ฐ์ง๊ณ ์๊ณ ,
2๊ฐ์ ํ
์ด๋ธ(<TBL_DailyStock>
, <TBL_StockInfo>
)์ ๋ดํฌํ๊ณ ์๋ค.
๊ทธ๋ฌ๋ฏ๋ก querytime, TBL_DailyStock, TBL_StockInfo ๋ฅผ ํ๋๋ก ๋ง๋ค๊ณ ๊ฐ๊ฐ
@XmlAttribute
์ @XmlElement
์ด๋
ธํ
์ด์
์ผ๋ก XML ์คํค๋ง์ ๋ชจ์์๋ฅผ ๋ง์ถ์๋ค.
๊ทธ๋ฆฌ๊ณ TBL_DailyStock
๊ณผ TBL_StockInfo
๋ ๋ด๋ถ์ ๋ฐ์ดํฐ ์
์ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก Inner Class๋ก ๋ง๋ค๊ณ ,
@XmlRootElement
์ด๋
ธํ
์ด์
์ ์ถ๊ฐํ๋ค.
/**
* <stockprice querytime="...">
* <TBL_DailyStock></TBL_DailyStock>
* <TBL_StockInfo></TBL_StockInfo>
* </stockprice>
*/
@Getter
@ToString
@XmlRootElement(name = "stockprice")
public class StockPrice {
@XmlAttribute(name = "querytime")
private String querytime;
@XmlElement(name = "TBL_DailyStock")
private TBL_DailyStock tbl_dailyStock;
@XmlElement(name = "TBL_StockInfo")
private TBL_StockInfo tbl_stockInfo;
// ์์ธ์ฒ๋ฆฌ, ์ ํจ์ฑ๊ฒ์ฆ ๊ด๋ จ ์ฝ๋ ์๋ต
@Getter
@ToString
@XmlRootElement(name = "TBL_DailyStock")
public static class TBL_DailyStock {
@XmlElement(name = "DailyStock")
private List<DailyStock> dailyStocks;
// ์์ธ์ฒ๋ฆฌ, ์ ํจ์ฑ๊ฒ์ฆ ๊ด๋ จ ์ฝ๋ ์๋ต
}
@Getter
@ToString
@XmlRootElement(name = "TBL_StockInfo")
public static class TBL_StockInfo {
@XmlAttribute(name = "JongName")
private String jongName;
@XmlAttribute(name = "CurJuka")
private String curJuka;
private String dungRak;
@XmlAttribute(name = "DungRak")
public void setDungRak(String dungRak) {
if("2".equals(dungRak)) {
this.dungRak = StockDungRak.UP.getName();
} else if("3".equals(dungRak)) {
this.dungRak = StockDungRak.FLAT.getName();
} else if("5".equals(dungRak)) {
this.dungRak = StockDungRak.DOWN.getName();
}
}
// ์ดํ ํ๋ ์๋ต
// ์์ธ์ฒ๋ฆฌ, ์ ํจ์ฑ๊ฒ์ฆ ๊ด๋ จ ์ฝ๋ ์๋ต
}
}
์ด ๋, ์์ ์ฝ๋์ dungRak ์ฒ๋ผ Setter๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฌ๊ฐ๊ณตํด์ผ ํ๋ ๊ฒฝ์ฐ,
ํ๋ ๋์ Setter์ @XmlAttribute ์ด๋
ธํ
์ด์
์ ๋ถ์ฌ์ผ ๋ฐ์ดํฐ๊ฐ ์ ๋๋ก ๋ฐ์ธ๋ฉ๋๋ค.
...
@XmlRootElement(name = "TBL_DailyStock")
public static class TBL_DailyStock {
@XmlElement(name = "DailyStock")
private List<DailyStock> dailyStocks;
}
...
๊ทธ๋ฐ๋ฐ ์์ ์ฝ๋์์ ์ฒ๋ผ DailyStock๋ฅผ ๋ฆฌ์คํธ๋ก ๊ฐ์ง๊ณ ์๋ TBL_DailyStock ํด๋์ค๋ฅผ ์ด๋ป๊ฒ ์์ฑํด์ผ ํ๋์ง ์กฐ๊ธ ํท๊ฐ๋ ธ์๋๋ฐ,
DailyStock์ ๊ทธ ์์ฒด๋ก 9๊ฐ์ Attribute๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก, ์๋์ ๊ฐ์ด ๋ฐ๋ก ํด๋์ค๋ฅผ ์์ฑํด์ผ ํ๋ค.
/**
* <stockprice>
* <TBL_DailyStock>
* <DailyStock></DailyStock>
* <DailyStock></DailyStock>
* ...
* </TBL_DailyStock>
* </stockprice>
*/
@Getter
@ToString
@XmlRootElement(name = "DailyStock")
public class DailyStock {
@XmlAttribute(name = "day_Date")
private String day_Date;
@XmlAttribute(name = "day_EndPrice")
private String day_EndPrice;
private String day_getAmount;
@XmlAttribute(name = "day_getAmount")
public void setDay_getAmount(String day_getAmount) {
// ๊ฑฐ๋๋๊ธ(๋ฐฑ๋ง) ๋จ์ ์ ์ญ
Long digit = Long.parseLong(day_getAmount.replaceAll(",", "")) / 1000000;
this.day_getAmount = String.format("%,d", digit); // "%,d", it tells the method to put comma separator for each 3 digits
}
// ... ์ดํ ํ๋ ์๋ต
}
DailyStock์ 17๊ฐ์ Attribute๋ง ๋ดํฌํ๊ณ ์์ผ๋ฏ๋ก, ๋ชจ๋ ํ๋์ @XmlAttribute๋ฅผ ๋ถ์ธ ๊ฒ์ ํ์ธํ ์ ์๋ค.
Unmarshalling ์คํ
์ด ์์ ์ ๊ฒฝ์ฐ ํ๋ก์ ํธ ๋ด์์ Map์ผ๋ก๋ง ๋ฐํํด์ผ ํ๋ ์ํฉ์ด์๊ธฐ ๋๋ฌธ์ Map์ ์ฌ์ฉํ์ง๋ง
Unmarshalling์ ์ํด ๋ฐ๋์ Map์ ์ฌ์ฉํด์ผํ๋ ๊ฒ์ ์๋๋ค.
XML์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ธ๋ฉํ Java ํด๋์ค๋ฅผ ์์ฑํ์ผ๋ Unmarshalling์ ์คํํ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.(์์๋ ์๊ด์๋ค.)
Unmarshalling ๊ณผ์
- ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ Map ์์ฑ
- ์ค์๊ฐ ์์ธ XML ๋ฐ์ดํฐ๋ฅผ ๋ฐํํ๋ URL์ ์ ๋ ฅํ๊ณ , XML ๋ฐ์ดํฐ๋ฅผ String์ผ๋ก ์ ์ฅํ๋ค.
JAXB.newInstance(StockPrice.class)
๋ฅผ ํตํด JAXB Context๋ฅผ ์์ฑํ๋ค.- ์์ฑ๋ JAXB Context๋ก Unmarshaller๋ฅผ ์์ฑํ๋ค.
- ์์ฑ๋ Unmarshaller๋ก unmarshall ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ String์ ์ ์ฅํ XML ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ Java ๊ฐ์ฒด(StockPrice)์ ๋ฐ์ธ๋ฉํ๋ค.
- Java ๊ฐ์ฒด๋ฅผ Map์ ๋ด์ ํ๋ฉด๋จ์ ์ก์ถํ๋ค.
@Controller("/ir_stock")
public Map<String, StockPrice> krxParser(HttpServletRequest request) {
Map<String, StockPrice> map = new HashMap<>();
try {
String html = StockUtil.getHtml("http://asp1.krx.co.kr/servlet/krx.asp.XMLSise?code=035420"); // 035420 = ๋ค์ด๋ฒ์ ์ข
๋ชฉ์ฝ๋
JAXBContext jaxbContext = JAXBContext.newInstance(StockPrice.class); // JAXB Context ์์ฑ
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); // Unmarshaller Object ์์ฑ
StockPrice stockPrice = (StockPrice) unmarshaller.unmarshal(new StringReader(html)); // unmarshall ๋ฉ์๋ ํธ์ถ
stockPrice.validation();
map.put("stockprice", stockPrice);
return map;
} catch (JAXBException | IOException e) {
logger.error("KRX API ์์ธ ๋ฐ์", e);
map.put("stockprice", StockPrice.emptyStockPrice()); // ์์ธ ๋ฐ์ ์, ๋น ๊ฐ์ฒด ๋ฐํ
return map;
}
}
์์ ์ฝ๋์์ XML ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ String์ผ๋ก ๋ฐํํด์ฃผ๋ getHtml()
๋ฉ์๋๋ ์ ํธ๋ฆฌํฐ ํด๋์ค์ ์๋์ ๊ฐ์ด ๊ตฌํํ๋ค.
public static String getHtml(String url) throws IOException {
URL targetUrl = new URL(url);
try (BufferedReader reader = new BufferedReader(new InputStreamReader(targetUrl.openStream()))){
StringBuffer html = new StringBuffer();
String tmp;
while ((tmp = reader.readLine()) != null) {
html.append(tmp);
}
return html.toString();
}
}
๋ง์ง๋ง์ผ๋ก, KRX API์์ ์ ๊ณตํ๋ ๋ฐ์ดํฐ ์ค DungRak(๋ฑ๋ฝ)์ ๊ฒฝ์ฐ ์์น, ๋์ผ, ํ๋ฝ์ โ2โ, โ3โ, โ5โ๋ก ๋ฐํํ๋ค.
๋๋ฌธ์ ์ซ์๋ง ๋ณด๊ณ ๋ ์์น์ธ์ง ํ๋ฝ์ธ์ง ํ๋จํ ์ ์์ผ๋ฏ๋ก
์๋์ ๊ฐ์ด Enum ํด๋์ค๋ฅผ ์์ฑํด์ ์ฌ์ฉํ์ฌ ์๋ฏธ๋ฅผ ๋ช
์ํ๋ค.
/**
*
* API์์๋
* ์์น = "2"
* ๋ณํ์์ = "3"
* ํ๋ฝ = "5"
*/
public enum StockDungRak {
FLAT("flat"),
UP("up"),
DOWN("down");
private String name;
StockDungRak(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
๊ฒฐ๊ณผ
ํด๋น ํ์ด์ง์ ์ ์ํ๋ฉด ์๋์ ๊ฐ์ ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ ์๊ฒ ๋์๋ค.
XML ๋ฐ์ดํฐ๋ฅผ Java ๊ฐ์ฒด๋ก ๋ณํํ์ฌ ์ฌ์ฉํด๋ณด๋, (๋น์ฆ๋์ค ๋ก์ง์ด ์์ฌ์์ด ์ด ๊ธ์๋ ๋ด์ง ๋ชปํ์ง๋ง)
ํ์คํ ์์ธ ์ฒ๋ฆฌ์ ๋ฐ์ดํฐ ๊ฐ๊ณต์ ๋ฅ๋์ ์ผ๋ก ํ ์ ์์ด์ ์ข์๋ค.