JavaRush /Java Blog /Random-KO /์žญ์Šจ๊ณผ์˜ ์ฒซ ๊ฒฝํ—˜.
ะ˜ะฒะฐะฝ
๋ ˆ๋ฒจ 23
ะœะพัะบะฒะฐ

์žญ์Šจ๊ณผ์˜ ์ฒซ ๊ฒฝํ—˜.

Random-KO ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค
์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„! ์˜›๋‚  ์˜›์ ์—, ๋จธ๋‚˜๋จผ ์€ํ•˜๊ณ„์—์„œ ๋งค์šฐ ๊ธด 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 "๋งŽ์€ ํŽธ์ง€"์— ๋Œ€ํ•ด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค๋งŒ, ์ œ๊ฐ€ ๋ฉฐ์น  ๋™์•ˆ ์ž‘์—…ํ•œ ๋‚ด์šฉ์„ ๋ฐœํ‘œํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค.
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION