상세 컨텐츠

본문 제목

RestTemplate Example (Open API 사용) / HTTPS SSL 무시 설정

Spring/RestTemplate

by Chan.94 2024. 9. 24. 01:00

본문

반응형

Intro

Rest Template 기본 사용법 및 Response Error Handle에 관한 내용은 아래 포스팅을 참고하기 바란다.

RestTemplate을 이용하여 Open API를 사용해 보자.

 

RestTemplate 기본 사용법 / Response Error Handle

 

RestTemplate 기본 사용법 / Response Error Handle

RestTemplate란Spring Framework에서 RESTful 웹 서비스와 통신하기 위한 동기식 클라이언트로 HTTP 요청을 쉽게 보내고 응답을 받을 수 있도록 도와주는 유틸리티 클래스다. 주요 기능HTTP 메서드 지원GET,

fvor001.tistory.com

 


Open API

https://www.data.go.kr/

 

공공데이터 포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

www.data.go.kr

공공 데이터 포탈에는 다양한 Open API가 제공된다. 그중 한국수출입은행 환율 정보 Open API를 사용해 보겠다.

 


Exmaple

RestTemplateConfig.java

@Configuration
public class RestTemplateConfig {
    
    @Bean
    public RestTemplate restTemplate() throws Exception{
        RestTemplate restTemplate = new RestTemplate();
        
        HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();

        factory.setReadTimeout(5000);       // read timeout (ms)
        factory.setConnectTimeout(3000);    // connection timeout (ms)

        //Apache HttpComponents HttpClient
        CloseableHttpClient httpClient = HttpClientBuilder.create()
                                                          .setMaxConnTotal(50)        //최대 커넥션 수
                                                          .setMaxConnPerRoute(20)     //각 호스트(IP와 Port의 조합)당 커넥션 풀에 생성가능한 커넥션 수
                                                          .build();
                                    
        factory.setHttpClient(httpClient);

        restTemplate.setRequestFactory(factory);
        restTemplate.setErrorHandler(new RestTemplateErrorHandler());
        return restTemplate;
    }
    
    
}

 

Test.java

public String selectExchangeByKoreaexim(String bseDt) {
    ObjectMapper objectMapper = new ObjectMapper();
    
    URI uri = UriComponentsBuilder.fromHttpUrl("https://www.koreaexim.go.kr/site/program/financial/exchangeJSON")
            .queryParam("authkey", "xxxxxxxxxxxxxxxxxxx")  //인증키
            .queryParam("searchdate", bseDt)
            .queryParam("data", "AP01") //AP01 : 환율, AP02 : 대출금리, AP03 : 국제금리
            .build()
            .encode()                   // 한글 인코딩 처리 (default : UTF-8)
            .toUri();

    HttpHeaders headers = new HttpHeaders();                // header
    HttpEntity<String> entity = new HttpEntity<>(headers);  // http entity
    log.error("REST API Request URI : {}", uri.toString());
    ResponseEntity<String> response = restTemplate.exchange(uri, HttpMethod.GET, entity, String.class);
    
    HttpStatus responseStatus = response.getStatusCode();
    HttpHeaders responseHeaders = response.getHeaders();
    String responseBody = response.getBody();
    log.error("status : {}", responseStatus.value());
    log.error("response body : {}", responseBody);
    
    return responseBody;
}

HTTPS 요청 시 발생하는 SSL 인증 오류

 

sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

API URL이 HTTPS라서 SSL인증 오류가 발생하였다.

 

테스트를 위해 로컬 환경에서 SSL인증을 무시하는 방법에 대해 작성하도록 하겠다.

보안상 위험할 수 있으므로 운영 환경에서는 사용하지 말아야 한다.

 

RestTemplateConfig.java

@Configuration
public class RestTemplateConfig {
    
    @Bean
    public RestTemplate restTemplate() throws Exception{
        RestTemplate restTemplate = new RestTemplate();
        
        /**
         * SSL 검증 비활성화 (로컬 환경에서만 사용)
         */
        // 모든 인증서 신뢰
        SSLContext sslContext = SSLContextBuilder.create()
                .loadTrustMaterial(TrustAllStrategy.INSTANCE)
                .build();
        
		...
		
        CloseableHttpClient httpClient = HttpClientBuilder.create()
                                                          .setSSLContext(sslContext)
														  
                                                          ...
														  
                                                          .build();
                                    
		...
		
        return restTemplate;
    }
    
    
}

 

Test 로그

REST API Request URI : https://www.koreaexim.go.kr/site/program/financial/exchangeJSON?authkey=xxxxxxxxxxxx&searchdate=20240923&data=AP01
status : 200
response body : [{"result":1,"cur_unit":"AED","ttb":"358.44","tts":"365.69","deal_bas_r":"362.07","bkpr":"362","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"362","kftc_deal_bas_r":"362.07","cur_nm":"아랍에미리트 디르함"},{"result":1,"cur_unit":"AUD","ttb":"896","tts":"914.11","deal_bas_r":"905.06","bkpr":"905","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"905","kftc_deal_bas_r":"905.06","cur_nm":"호주 달러"},{"result":1,"cur_unit":"BHD","ttb":"3,493.7","tts":"3,564.27","deal_bas_r":"3,528.99","bkpr":"3,528","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"3,528","kftc_deal_bas_r":"3,528.99","cur_nm":"바레인 디나르"},{"result":1,"cur_unit":"BND","ttb":"1,019.9","tts":"1,040.51","deal_bas_r":"1,030.21","bkpr":"1,030","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"1,030","kftc_deal_bas_r":"1,030.21","cur_nm":"브루나이 달러"},{"result":1,"cur_unit":"CAD","ttb":"970.29","tts":"989.9","deal_bas_r":"980.1","bkpr":"980","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"980","kftc_deal_bas_r":"980.1","cur_nm":"캐나다 달러"},{"result":1,"cur_unit":"CHF","ttb":"1,547.75","tts":"1,579.02","deal_bas_r":"1,563.39","bkpr":"1,563","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"1,563","kftc_deal_bas_r":"1,563.39","cur_nm":"스위스 프랑"},{"result":1,"cur_unit":"CNH","ttb":"186.68","tts":"190.45","deal_bas_r":"188.57","bkpr":"188","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"188","kftc_deal_bas_r":"188.57","cur_nm":"위안화"},{"result":1,"cur_unit":"DKK","ttb":"196.99","tts":"200.96","deal_bas_r":"198.98","bkpr":"198","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"198","kftc_deal_bas_r":"198.98","cur_nm":"덴마아크 크로네"},{"result":1,"cur_unit":"EUR","ttb":"1,469.38","tts":"1,499.07","deal_bas_r":"1,484.23","bkpr":"1,484","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"1,484","kftc_deal_bas_r":"1,484.23","cur_nm":"유로"},{"result":1,"cur_unit":"GBP","ttb":"1,753.05","tts":"1,788.46","deal_bas_r":"1,770.76","bkpr":"1,770","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"1,770","kftc_deal_bas_r":"1,770.76","cur_nm":"영국 파운드"},{"result":1,"cur_unit":"HKD","ttb":"168.99","tts":"172.4","deal_bas_r":"170.7","bkpr":"170","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"170","kftc_deal_bas_r":"170.7","cur_nm":"홍콩 달러"},{"result":1,"cur_unit":"IDR(100)","ttb":"8.69","tts":"8.86","deal_bas_r":"8.78","bkpr":"8","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"8","kftc_deal_bas_r":"8.78","cur_nm":"인도네시아 루피아"},{"result":1,"cur_unit":"JPY(100)","ttb":"914.69","tts":"933.16","deal_bas_r":"923.93","bkpr":"923","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"923","kftc_deal_bas_r":"923.93","cur_nm":"일본 옌"},{"result":1,"cur_unit":"KRW","ttb":"0","tts":"0","deal_bas_r":"1","bkpr":"1","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"1","kftc_deal_bas_r":"1","cur_nm":"한국 원"},{"result":1,"cur_unit":"KWD","ttb":"4,315.73","tts":"4,402.92","deal_bas_r":"4,359.33","bkpr":"4,359","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"4,359","kftc_deal_bas_r":"4,359.33","cur_nm":"쿠웨이트 디나르"},{"result":1,"cur_unit":"MYR","ttb":"313.1","tts":"319.43","deal_bas_r":"316.27","bkpr":"316","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"316","kftc_deal_bas_r":"316.27","cur_nm":"말레이지아 링기트"},{"result":1,"cur_unit":"NOK","ttb":"125.43","tts":"127.96","deal_bas_r":"126.7","bkpr":"126","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"126","kftc_deal_bas_r":"126.7","cur_nm":"노르웨이 크로네"},{"result":1,"cur_unit":"NZD","ttb":"820.96","tts":"837.55","deal_bas_r":"829.26","bkpr":"829","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"829","kftc_deal_bas_r":"829.26","cur_nm":"뉴질랜드 달러"},{"result":1,"cur_unit":"SAR","ttb":"350.86","tts":"357.95","deal_bas_r":"354.41","bkpr":"354","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"354","kftc_deal_bas_r":"354.41","cur_nm":"사우디 리얄"},{"result":1,"cur_unit":"SEK","ttb":"129.42","tts":"132.03","deal_bas_r":"130.73","bkpr":"130","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"130","kftc_deal_bas_r":"130.73","cur_nm":"스웨덴 크로나"},{"result":1,"cur_unit":"SGD","ttb":"1,019.9","tts":"1,040.51","deal_bas_r":"1,030.21","bkpr":"1,030","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"1,030","kftc_deal_bas_r":"1,030.21","cur_nm":"싱가포르 달러"},{"result":1,"cur_unit":"THB","ttb":"39.99","tts":"40.8","deal_bas_r":"40.4","bkpr":"40","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"40","kftc_deal_bas_r":"40.4","cur_nm":"태국 바트"},{"result":1,"cur_unit":"USD","ttb":"1,316.6","tts":"1,343.19","deal_bas_r":"1,329.9","bkpr":"1,329","yy_efee_r":"0","ten_dd_efee_r":"0","kftc_bkpr":"1,329","kftc_deal_bas_r":"1,329.9","cur_nm":"미국 달러"}]

 

String To Json

[
	{
		"result": 1,
		"cur_unit": "AED",
		"ttb": "358.44",
		"tts": "365.69",
		"deal_bas_r": "362.07",
		"bkpr": "362",
		"yy_efee_r": "0",
		"ten_dd_efee_r": "0",
		"kftc_bkpr": "362",
		"kftc_deal_bas_r": "362.07",
		"cur_nm": "아랍에미리트 디르함"
	},
	{
		"result": 1,
		"cur_unit": "AUD",
		"ttb": "896",
		"tts": "914.11",
		"deal_bas_r": "905.06",
		"bkpr": "905",
		"yy_efee_r": "0",
		"ten_dd_efee_r": "0",
		"kftc_bkpr": "905",
		"kftc_deal_bas_r": "905.06",
		"cur_nm": "호주 달러"
	},
	{
		"result": 1,
		"cur_unit": "BHD",
		"ttb": "3,493.7",
		"tts": "3,564.27",
		"deal_bas_r": "3,528.99",
		"bkpr": "3,528",
		"yy_efee_r": "0",
		"ten_dd_efee_r": "0",
		"kftc_bkpr": "3,528",
		"kftc_deal_bas_r": "3,528.99",
		"cur_nm": "바레인 디나르"
	},
	{
		"result": 1,
		"cur_unit": "BND",
		"ttb": "1,019.9",
		"tts": "1,040.51",
		"deal_bas_r": "1,030.21",
		"bkpr": "1,030",
		"yy_efee_r": "0",
		"ten_dd_efee_r": "0",
		"kftc_bkpr": "1,030",
		"kftc_deal_bas_r": "1,030.21",
		"cur_nm": "브루나이 달러"
	},
	{
		"result": 1,
		"cur_unit": "CAD",
		"ttb": "970.29",
		"tts": "989.9",
		"deal_bas_r": "980.1",
		"bkpr": "980",
		"yy_efee_r": "0",
		"ten_dd_efee_r": "0",
		"kftc_bkpr": "980",
		"kftc_deal_bas_r": "980.1",
		"cur_nm": "캐나다 달러"
	},
	{
		"result": 1,
		"cur_unit": "CHF",
		"ttb": "1,547.75",
		"tts": "1,579.02",
		"deal_bas_r": "1,563.39",
		"bkpr": "1,563",
		"yy_efee_r": "0",
		"ten_dd_efee_r": "0",
		"kftc_bkpr": "1,563",
		"kftc_deal_bas_r": "1,563.39",
		"cur_nm": "스위스 프랑"
	},
	{
		"result": 1,
		"cur_unit": "CNH",
		"ttb": "186.68",
		"tts": "190.45",
		"deal_bas_r": "188.57",
		"bkpr": "188",
		"yy_efee_r": "0",
		"ten_dd_efee_r": "0",
		"kftc_bkpr": "188",
		"kftc_deal_bas_r": "188.57",
		"cur_nm": "위안화"
	},
	{
		"result": 1,
		"cur_unit": "DKK",
		"ttb": "196.99",
		"tts": "200.96",
		"deal_bas_r": "198.98",
		"bkpr": "198",
		"yy_efee_r": "0",
		"ten_dd_efee_r": "0",
		"kftc_bkpr": "198",
		"kftc_deal_bas_r": "198.98",
		"cur_nm": "덴마아크 크로네"
	},
	{
		"result": 1,
		"cur_unit": "EUR",
		"ttb": "1,469.38",
		"tts": "1,499.07",
		"deal_bas_r": "1,484.23",
		"bkpr": "1,484",
		"yy_efee_r": "0",
		"ten_dd_efee_r": "0",
		"kftc_bkpr": "1,484",
		"kftc_deal_bas_r": "1,484.23",
		"cur_nm": "유로"
	},
	{
		"result": 1,
		"cur_unit": "GBP",
		"ttb": "1,753.05",
		"tts": "1,788.46",
		"deal_bas_r": "1,770.76",
		"bkpr": "1,770",
		"yy_efee_r": "0",
		"ten_dd_efee_r": "0",
		"kftc_bkpr": "1,770",
		"kftc_deal_bas_r": "1,770.76",
		"cur_nm": "영국 파운드"
	},
	{
		"result": 1,
		"cur_unit": "HKD",
		"ttb": "168.99",
		"tts": "172.4",
		"deal_bas_r": "170.7",
		"bkpr": "170",
		"yy_efee_r": "0",
		"ten_dd_efee_r": "0",
		"kftc_bkpr": "170",
		"kftc_deal_bas_r": "170.7",
		"cur_nm": "홍콩 달러"
	},
	{
		"result": 1,
		"cur_unit": "IDR(100)",
		"ttb": "8.69",
		"tts": "8.86",
		"deal_bas_r": "8.78",
		"bkpr": "8",
		"yy_efee_r": "0",
		"ten_dd_efee_r": "0",
		"kftc_bkpr": "8",
		"kftc_deal_bas_r": "8.78",
		"cur_nm": "인도네시아 루피아"
	},
	{
		"result": 1,
		"cur_unit": "JPY(100)",
		"ttb": "914.69",
		"tts": "933.16",
		"deal_bas_r": "923.93",
		"bkpr": "923",
		"yy_efee_r": "0",
		"ten_dd_efee_r": "0",
		"kftc_bkpr": "923",
		"kftc_deal_bas_r": "923.93",
		"cur_nm": "일본 옌"
	},
	{
		"result": 1,
		"cur_unit": "KRW",
		"ttb": "0",
		"tts": "0",
		"deal_bas_r": "1",
		"bkpr": "1",
		"yy_efee_r": "0",
		"ten_dd_efee_r": "0",
		"kftc_bkpr": "1",
		"kftc_deal_bas_r": "1",
		"cur_nm": "한국 원"
	},
	{
		"result": 1,
		"cur_unit": "KWD",
		"ttb": "4,315.73",
		"tts": "4,402.92",
		"deal_bas_r": "4,359.33",
		"bkpr": "4,359",
		"yy_efee_r": "0",
		"ten_dd_efee_r": "0",
		"kftc_bkpr": "4,359",
		"kftc_deal_bas_r": "4,359.33",
		"cur_nm": "쿠웨이트 디나르"
	},
	{
		"result": 1,
		"cur_unit": "MYR",
		"ttb": "313.1",
		"tts": "319.43",
		"deal_bas_r": "316.27",
		"bkpr": "316",
		"yy_efee_r": "0",
		"ten_dd_efee_r": "0",
		"kftc_bkpr": "316",
		"kftc_deal_bas_r": "316.27",
		"cur_nm": "말레이지아 링기트"
	},
	{
		"result": 1,
		"cur_unit": "NOK",
		"ttb": "125.43",
		"tts": "127.96",
		"deal_bas_r": "126.7",
		"bkpr": "126",
		"yy_efee_r": "0",
		"ten_dd_efee_r": "0",
		"kftc_bkpr": "126",
		"kftc_deal_bas_r": "126.7",
		"cur_nm": "노르웨이 크로네"
	},
	{
		"result": 1,
		"cur_unit": "NZD",
		"ttb": "820.96",
		"tts": "837.55",
		"deal_bas_r": "829.26",
		"bkpr": "829",
		"yy_efee_r": "0",
		"ten_dd_efee_r": "0",
		"kftc_bkpr": "829",
		"kftc_deal_bas_r": "829.26",
		"cur_nm": "뉴질랜드 달러"
	},
	{
		"result": 1,
		"cur_unit": "SAR",
		"ttb": "350.86",
		"tts": "357.95",
		"deal_bas_r": "354.41",
		"bkpr": "354",
		"yy_efee_r": "0",
		"ten_dd_efee_r": "0",
		"kftc_bkpr": "354",
		"kftc_deal_bas_r": "354.41",
		"cur_nm": "사우디 리얄"
	},
	{
		"result": 1,
		"cur_unit": "SEK",
		"ttb": "129.42",
		"tts": "132.03",
		"deal_bas_r": "130.73",
		"bkpr": "130",
		"yy_efee_r": "0",
		"ten_dd_efee_r": "0",
		"kftc_bkpr": "130",
		"kftc_deal_bas_r": "130.73",
		"cur_nm": "스웨덴 크로나"
	},
	{
		"result": 1,
		"cur_unit": "SGD",
		"ttb": "1,019.9",
		"tts": "1,040.51",
		"deal_bas_r": "1,030.21",
		"bkpr": "1,030",
		"yy_efee_r": "0",
		"ten_dd_efee_r": "0",
		"kftc_bkpr": "1,030",
		"kftc_deal_bas_r": "1,030.21",
		"cur_nm": "싱가포르 달러"
	},
	{
		"result": 1,
		"cur_unit": "THB",
		"ttb": "39.99",
		"tts": "40.8",
		"deal_bas_r": "40.4",
		"bkpr": "40",
		"yy_efee_r": "0",
		"ten_dd_efee_r": "0",
		"kftc_bkpr": "40",
		"kftc_deal_bas_r": "40.4",
		"cur_nm": "태국 바트"
	},
	{
		"result": 1,
		"cur_unit": "USD",
		"ttb": "1,316.6",
		"tts": "1,343.19",
		"deal_bas_r": "1,329.9",
		"bkpr": "1,329",
		"yy_efee_r": "0",
		"ten_dd_efee_r": "0",
		"kftc_bkpr": "1,329",
		"kftc_deal_bas_r": "1,329.9",
		"cur_nm": "미국 달러"
	}
]
반응형

'Spring > RestTemplate' 카테고리의 다른 글

RestTemplate 기본 사용법 / Response Error Handle  (1) 2024.09.23

관련글 더보기

댓글 영역

>