์๋
ํ์ธ์ ์ฌ๋ฌ๋ถ! ์๋ ์์ ์, ๋จธ๋๋จผ ์ํ๊ณ์์ ๋งค์ฐ ๊ธด JSON์ด ๋ฐ๊ฒฌ๋์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ POJO๋ฅผ ๋ง๋ค๊ธฐ์๋ ๋๋ฌด ๊ฒ์ผ๋ฅด๊ฒ ๋์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ๋ ์ค์ค๋ก์๊ฒ ์ง๋ฌธํ์ต๋๋ค. ์๋ฅผ ๋ค์ด ํ์จ์ด ํฌํจ๋ JSON ํ์์ ์๋ต์ ๋ฐ๋ ์ํฉ์ ์์ํด ๋ณด์ธ์. JSON ์์ฒด์๋ ๋ง์ ํ๋๊ฐ ์์ผ๋ฉฐ ๊ทธ ์ค 2๊ฐ๊ฐ ํ์ํฉ๋๋ค. ์ด์ ์๊ณ ์ถ์ต๋๋ค. ํ์ํ ํ๋๊ฐ ํฌํจ๋ ํด๋์ค๋ฅผ ๋ง๋ค๊ณ ์ด json์ ํด๋์ค ๊ฐ์ฒด๋ก ๊ตฌ๋ฌธ ๋ถ์ํ ์ ์๋์? ์ญ์จ์ ๋ด๊ฐ ๊ทธ์๊ฒ ์ํ๋ ๊ฒ์ ์ดํดํ ๊ฒ์ธ๊ฐ? ๋ฐ๋ผ์ ๊ทธ๊ฐ ์ด๋ฐ ์์ผ๋ก ์ดํดํ๊ณ ์ํํ ์ ์๋ค๋ฉด ์ด๋ป๊ฒ ๋ ์ ํํ๊ฒ ์ํํ ์ ์์ผ๋ฉฐ ๋ฌด์์ด ๋ ๋นจ๋ฆฌ ์๋ํ ๊น์? ๋ฐ๋ผ์ ์ ๊ฐ JSON๊ณผ ๊ทธ์ ๋ํ Jackson์ ์ธ์์ ๊ดํด ๊ฐ์ก๋ ์ง๋ฌธ์ ๊ดํด: Jackson์ ๋ชจ๋ ๊ฒ์ ์ดํดํ ๊ฒ์
๋๋ค. ๊ทธ๋ ๋๋ํด. ๊ทธ๋ ์ด๊ฒ์ ๋ํด ์ฝ๊ฐ์ ๋์์ด ํ์ํฉ๋๋ค. JSON์์ ํ์ํ ๋ณ์๋ฅผ ์ค๋ช
ํ๋ ์ผ๋ฐ Java ํด๋์ค์ธ POJO๋ฅผ ๋ง๋ญ๋๋ค. ์ด๋ฅผ ์ํด ์ฐ๋ฆฌ๊ฐ ํด๋์ค๋ฅผ ์์ฑํ๋ JSON ์์ฒด๋ฅผ ์ฐ๊ตฌํ๋ ๊ฒ์ด ๋งค์ฐ ๋ฐ๋์งํ๋ค๊ณ ์ฆ์ ๋ง์๋๋ฆฌ๊ฒ ์ต๋๋ค(๋๋ถ๋ถ ์์ฑํด์ผ ํ๋ ์ค์ฒฉ ํด๋์ค๊ฐ ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค). ๋ค์์ผ๋ก ์์ฑ์ ์์ @JsonCreator ์ฃผ์์ ์ฌ์ฉํ์ฌ ์ด ํด๋์ค์ ํ๋๋ฅผ JSON์์ ์ฑ์์ผ ํจ์ ๋ณด์ฌ์ค๋๋ค. ์์ฑ์ ๋งค๊ฐ๋ณ์์์ @JsonParam("JsonFieldName") ์ฃผ์์ ์ฌ์ฉํ์ฌ ํด๋์ค ํ๋์ ํ ๋นํ Json ํ๋๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. json์ ํ์ํ ๊ฒ๋ณด๋ค ๋ ๋ง์ ํ๋๊ฐ ์๋ ๊ฒฝ์ฐ(์๋ ์ด๊ฒ์ด ๋ด ์ง๋ฌธ์ด์์ต๋๋ค) ์ด์ ๋ํด ๊ฒฝ๊ณ ํ๊ณ ๋๋จธ์ง ํ๋๋ ํ์ํ์ง ์๋ค๊ณ ์ค๋ช
ํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด @JsonIgnoreProperties(ignoreUnknown=true) ์ฃผ์์ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ ์ ์๋ ํ๋๋ฅผ ๋ง๋๋ ํ๋ก๊ทธ๋จ์ด ์ค๋จ๋์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ผ๋กค...! ํ๋๊ฐ ์ฑ์์ง(์, ์ ํํ ํ์ํ ํ๋) ํด๋์ค ๊ฐ์ฒด๊ฐ ์์ผ๋ฉฐ ์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฒ์์๋ ํ์ํ ๊ฐ์ ๊บผ๋ด๊ณ ํ์ํ ๊ฒฝ์ฐ ์ด๋ฅผ ์ ์ฑํ ํํ๋ก ๊ฐ์ ธ์ค๋ ์ ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ๋์ ํด๋์ค๋ฅผ ์์ฑํ์ต๋๋ค. ๊ทธ๊ฒ์ ์ง์์ผ์ด๋ค. ๊ทธ๊ฒ์ ์ฅ์ธ์
๋๋ค. ์ด๊ฒ๋ค์ ๋ชฉ๋ฐ์
๋๋ค. ๋ฉ์๋๊ฐ ํฌํจ๋ ํด๋์ค ์์ฒด๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
public class Methods {
public static double findRes(String body, String need){
int begin = body.indexOf(need);
int end = body.indexOf(",", begin);
String res = body.substring(begin, end);
String res2 = res.substring(res.indexOf(":")+2);
double finalRes = Double.parseDouble(res2);
return finalRes;
}
public static String findUrl(String body, String need){
int begin = body.indexOf(need) + need.length();
int end = body.indexOf(",", begin);
String res = body.substring(begin, end);
String res2 = res.substring(res.indexOf(":")+1);
return res2;
}
}
Jackson์ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ๋ ํธ๋ฆฌํ๊ณ ์ฝ๊ธฐ ์ฝ์ต๋๋ค(์ ์ด๋ ์ ๋ง ๋ ์๋ฆ๋ต์ต๋๋ค). ์ฐ๋ฆฌ ํ๋ค๊ณผ์ ๋ํ์์ ๊ทธ๋ค์ ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ์๋ Jackson์ด ๋์๊ด์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋ซ๋ค๋ ๊ฒ์ ํ์ธํ์ต๋๋ค.
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.springframework.stereotype.Component;
@Component
@JsonIgnoreProperties(ignoreUnknown = true)
public class CurrencyPojo {
private Rates rates;
public CurrencyPojo() {
}
@JsonCreator
public CurrencyPojo(@JsonProperty("rates") Rates rates) {
this.rates = rates;
}
public Rates getRates() {
return rates;
}
public void setRates(Rates rates) {
this.rates = rates;
}
@Override
public String toString() {
return "CurrencyPojo{" +
"rates=" + rates +
'}';
}
@Component
@JsonIgnoreProperties(ignoreUnknown = true)
public static class Rates {
private double rub;
private double inr;
private double eur;
public Rates() {
}
@JsonCreator
public Rates(@JsonProperty("RUB") double rub,
@JsonProperty("INR") double inr,
@JsonProperty("EUR") double eur) {
this.rub = rub;
this.inr = inr;
this.eur = eur;
}
public double getRub() {
return rub;
}
public void setRub(double rub) {
this.rub = rub;
}
public double getInr() {
return inr;
}
public void setInr(double inr) {
this.inr = inr;
}
public double getEur() {
return eur;
}
public void setEur(double eur) {
this.eur = eur;
}
@Override
public String toString() {
return "Rates{" +
"rub=" + rub +
", inr=" + inr +
", eur=" + eur +
'}';
}
}
}
์ค์ฒฉ ํด๋์ค ์ฌ์ฉ์ ์ฃผ๋ชฉํ๊ณ ์ถ์ต๋๋ค. ์ด ์์
์ ์๋ ๊ทธ ์ฉ๋๋ฅผ ์๊ฐํ ์ ์์์ต๋๋ค =) ๋ค์์ ์์ JSON์ ์์
๋๋ค. "์คํฌ์ผ๋ฌ"๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๋ฏ๋ก ์๊ฐ๋ฝ์ ํ๋ จํฉ์๋ค))
{
"disclaimer": "Usage subject to terms: https://openexchangerates.org/terms",
"license": "https://openexchangerates.org/license",
"timestamp": 1638143999,
"base": "USD",
"rates": {
"AED": 3.672934,
"AFN": 95.889778,
"ALL": 107.277494,
"AMD": 483.27152,
"ANG": 1.802446,
"AOA": 585,
"ARS": 100.99011,
"AUD": 1.400119,
"AWG": 1.80025,
"AZN": 1.700805,
"BAM": 1.734322,
"BBD": 2,
"BDT": 85.804468,
"BGN": 1.727247,
"BHD": 0.377164,
"BIF": 1994.344572,
"BMD": 1,
"BND": 1.370223,
"BOB": 6.905713,
"BRL": 5.593606,
"BSD": 1,
"BTC": 0.000017488138,
"BTN": 74.895631,
"BWP": 11.828585,
"BYN": 2.560653,
"BZD": 2.015918,
"CAD": 1.27258,
"CDF": 2003.492833,
"CHF": 0.92439,
"CLF": 0.030154,
"CLP": 831.315923,
"CNH": 6.395085,
"CNY": 6.393,
"COP": 3975.845415,
"CRC": 639.731775,
"CUC": 1,
"CUP": 25.75,
"CVE": 97.95,
"CZK": 22.7447,
"DJF": 178.031664,
"DKK": 6.585348,
"DOP": 56.599119,
"DZD": 139.135508,
"EGP": 15.756894,
"ERN": 15.000155,
"ETB": 47.819833,
"EUR": 0.885541,
"FJD": 2.12473,
"FKP": 0.749595,
"GBP": 0.749595,
"GEL": 3.095,
"GGP": 0.749595,
"GHS": 6.142755,
"GIP": 0.749595,
"GMD": 52.425,
"GNF": 9472.013443,
"GTQ": 7.738789,
"GYD": 209.235741,
"HKD": 7.7981,
"HNL": 24.17051,
"HRK": 6.661782,
"HTG": 98.81349,
"HUF": 327.09539,
"IDR": 14379.716018,
"ILS": 3.185445,
"IMP": 0.749595,
"INR": 75.050444,
"IQD": 1458.680982,
"IRR": 42275,
"ISK": 130.231848,
"JEP": 0.749595,
"JMD": 155.740793,
"JOD": 0.709,
"JPY": 113.7185,
"KES": 112.535405,
"KGS": 84.774702,
"KHR": 4069.37439,
"KMF": 436.000041,
"KPW": 900,
"KRW": 1195.716418,
"KWD": 0.30268,
"KYD": 0.833396,
"KZT": 436.292325,
"LAK": 10839.499888,
"LBP": 1520.868483,
"LKR": 202.516227,
"LRD": 142.25,
"LSL": 16.236278,
"LYD": 4.615464,
"MAD": 9.244198,
"MDL": 17.763696,
"MGA": 3988.128848,
"MKD": 54.637275,
"MMK": 1790.896161,
"MNT": 2854.559306,
"MOP": 8.033255,
"MRO": 356.999828,
"MRU": 36.094075,
"MUR": 43.067396,
"MVR": 15.45,
"MWK": 816.475065,
"MXN": 21.738389,
"MYR": 4.239,
"MZN": 63.857001,
"NAD": 16.26,
"NGN": 410.875846,
"NIO": 35.230131,
"NOK": 9.0605,
"NPR": 119.833306,
"NZD": 1.465193,
"OMR": 0.385109,
"PAB": 1,
"PEN": 4.033921,
"PGK": 3.51889,
"PHP": 50.480705,
"PKR": 176.598456,
"PLN": 4.168379,
"PYG": 6826.299832,
"QAR": 3.646364,
"RON": 4.37388,
"RSD": 103.877366,
"RUB": 75.58127,
"RWF": 1024.40338,
"SAR": 3.7514,
"SBD": 8.064563,
"SCR": 14.654883,
"SDG": 438,
"SEK": 9.148279,
"SGD": 1.370086,
"SHP": 0.749595,
"SLL": 11119.30017,
"SOS": 580.721202,
"SRD": 21.52,
"SSP": 130.26,
"STD": 21187.940504,
"STN": 22.195,
"SVC": 8.750748,
"SYP": 2512.5,
"SZL": 15.967534,
"THB": 33.757117,
"TJS": 11.286041,
"TMT": 3.51,
"TND": 2.882,
"TOP": 2.277258,
"TRY": 12.378954,
"TTD": 6.78112,
"TWD": 27.866934,
"TZS": 2302.544214,
"UAH": 27.094403,
"UGX": 3563.214629,
"USD": 1,
"UYU": 44.148288,
"UZS": 10783.399861,
"VES": 4.57705,
"VND": 22678.30849,
"VUV": 111.998805,
"WST": 2.563531,
"XAF": 580.876668,
"XAG": 0.04289544,
"XAU": 0.00055691,
"XCD": 2.70255,
"XDR": 0.714635,
"XOF": 580.876668,
"XPD": 0.00055962,
"XPF": 105.673123,
"XPT": 0.00101782,
"YER": 250.249937,
"ZAR": 16.1344,
"ZMW": 17.776133,
"ZWL": 322
}
}
json์ ํด๋์ค ๊ฐ์ฒด๋ก ๋ณํํ๊ธฐ ์ํด ๋งคํผ๋ฅผ ์ฌ์ฉํฉ๋๋ค:
ObjectMapper mapper = new ObjectMapper();
currencyPojo(an object ะฝะฐัะตะณะพ ะบะปะฐััะฐ) = mapper.readValue(jsonResponse(ะะถัะพะฝ ะฒ ัััะธะฝะณะต), CurrencyPojo.class(ะบะปะฐัั, ะบะพัะพััะน ะฝะฐะผ ะฝัะถะตะฝ));
์ฝ๋๊ฐ ์๋ํ๊ณ ์์ต๋๋ค. ์ด ํํฌ์์ ์ ๊ฐ ํ์ํ ๊ฒ์ ์ ํํ๊ฒ ๋์ด๋
๋๋ค. ๊ตฌ๋ฌธ ๋ถ์ ํ ํด๋์ค ๊ฐ์ฒด์ ์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. MoneyPojo{rates=Rates{rub=73.6944, inr=75.621547, eur=0.885436}} ๊ธฐ์ฉ๋๋ค. ๋์งธ ๋ ์๋ ์ผ๊ตด ์ ์ฒด์ ๋ฐ์๋ฅผ ์น๋ฉฐ ์์ผ๋ก ๋ฏธ์๋ฅผ ์ง์ต๋๋ค. ์๊ธ ๊ฐ์ ๋ค๋ฅผ ์ ์์ต๋๋ค. JSON ํ
์คํธ์ ๊ฐ์ฒด๋ ์๋ก ๋ค๋ฅธ ๋ ์ง์์ ์ธ์๋์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ๊ฒฐ๊ณผ๋ ๋ช
ํํด์ผ ํฉ๋๋ค. PS ์ฒ์์ผ๋ก ๊ธ์ ์ฐ๋ ๊ฒ์ด๋ฏ๋ก ์๋ฐํ๊ฒ ํ๋จํ์ง ๋ง์ธ์. ๊ทธ๋ฆฌ๊ณ ์ ๋ ์ด๋ณด ํด์ปค์ผ ๋ฟ์
๋๋ค =) ์ ๋ ๋นํ์ ์ฌ๋ํ๊ณ ๋ฐ์๋ค์
๋๋ค.) PS2 "๋ง์ ํธ์ง"์ ๋ํด ์ฌ๊ณผ๋๋ฆฝ๋๋ค๋ง, ์ ๊ฐ ๋ฉฐ์น ๋์ ์์
ํ ๋ด์ฉ์ ๋ฐํํ๋ ค๊ณ ๋
ธ๋ ฅํ์ต๋๋ค.
GO TO FULL VERSION