개인프로젝트/어린이사고다발지역검색

OpenApi 호출 @Component 생성

질주하는구 2022. 3. 11. 17:22

기본 셋팅이 마무리 되었고 어떤 구성으로 소스를 생성 할지도 결정 했으니 OpenApi를 호출하는 componet를 작성 해보겠습니다.

ApiCallComp 는 검색 조건을 전달 받아 api를 호출 하고 그 결과를 return 해주는 아주 간단한 소스 입니다.

URL 호출은 HttpClient 패키지를 통해서 작업 하겠습니다.

저는 편한 okhttp를 주로 사용 했는데 HttpClient를 사용하는 이유는 해당 패키지가

https://docs.upbit.com/reference/%EC%A0%84%EC%B2%B4-%EA%B3%84%EC%A2%8C-%EC%A1%B0%ED%9A%8C

 

업비트 개발자 센터

업비트 Open API 사용을 위한 개발 문서를 제공 합니다.업비트 Open API 사용하여 다양한 앱과 프로그램을 제작해보세요.

docs.upbit.com

업비트 api의 예제 소스로 사용되는 패키지 이기 때문 입니다.

http연결 부터 뭔가 강력한 신뢰를 느낄수 있습니다.(http연결 관련한 라이브러리는 워낙에 잘 되어 있어서 무엇을 사용하던 상관 없습니다. 개인적으로는 okhttp를 추천하고 싶습니다.)

 

@Component("apiCallComp")
public class ApiCallComp {
	private String serviceUrl = "http://apis.data.go.kr/B552061/frequentzoneChild/getRestFrequentzoneChild";
	
	//application.properties의 설정 정보를 가지고 올때 @Value("${설정key}") 형식으로 호출
	@Value("${openApi.serviceKey}")
	private String serviceKey;
	
	public String callAccidentAreaInfo(SearchParamVO paramVO) throws ClientProtocolException, IOException {
		HttpClient client 				= HttpClientBuilder.create().build();
        HttpGet request 				= new HttpGet(serviceUrl+"?"+URLEncodedUtils.format(makeParameterList(paramVO.getSearchYear(), paramVO.getSearchSiDo(), paramVO.getSearchGuGun(), paramVO.getSearchPageNo()), "utf-8"));
        HttpResponse response 			= client.execute(request);
        HttpEntity entity 				= response.getEntity();
        
        String returnJson				= EntityUtils.toString(entity, "UTF-8");
		return returnJson;
	}
	
	public List<BasicNameValuePair> makeParameterList(String searchYearCd, String siDo, String guGun, String searchPageNo){
		List<BasicNameValuePair> params = new LinkedList<BasicNameValuePair>();
		
        params.add(new BasicNameValuePair("ServiceKey", serviceKey));
        params.add(new BasicNameValuePair("type", "json"));
        params.add(new BasicNameValuePair("searchYearCd", searchYearCd));
        params.add(new BasicNameValuePair("siDo", makeSiDoCode(siDo)));
        params.add(new BasicNameValuePair("guGun", makeGuGunCode(guGun)));
        params.add(new BasicNameValuePair("numOfRows", "10"));
        params.add(new BasicNameValuePair("pageNo", searchPageNo));        
        
        return params;
	}
	
	//법정동 코드값 앞 2자리만 사용 (ex>4111100000 -> 41)
	public String makeSiDoCode(String siDo) {
		return StringUtils.substring(siDo, 0, 2);
	}
	//법정동 코드값 2~5자리만 사용  (ex>4111100000 -> 111)
	public String makeGuGunCode(String guGun) {
		return StringUtils.substring(guGun, 2, 5);
	}
	
}

특별한 내용은 없고 service키를 가지고 오기 위해 application.properties 파일에 openApi.serviceKey 프로퍼티를 추가 했습니다.

추가로 get방식으로 호출시 현재 소스는 BasicNameValuePair 를 이용하고 있지만 다른 방법으로 아래와 같은 방법도

존재 합니다.

URIBuilder builder = new URIBuilder();
builder.setScheme("http")
		.setHost(host)
		.setPort(port)
		.setPath(yourpath)
		.setParameter("column1", "data1")
		.setParameter("column2", "data2");

파라미터 전달 시 편한 방법으로 선택 해서 소스 구성을 해주시면 됩니다.

현재 소스에서는 응답 실패에 대한 처리가 되어 있지 않은데 서비스 하시려는 소스 에서는 관련 소스가 추가 되어야

합니다.

반응형