개발공작소
article thumbnail
728x90

 

 

 

 

 

프로젝트를 하면서 HttpURLConnection 때문에 스트레스 받은 김에 정리함..

 

 

HTTP 네트워크 통신 요약정보

 

URL(대부분 HTTP 프로토콜 사용)을 통해 서버와 통신하는 java 프로그램을 개발할 때

URLConnection과 HttpURLConnection 클래스를 사용한다. ( javascriipt의 ajax, fetch, axios 같은 느낌? )

 

쉽게 말해 백엔드단에서 HTTP통신을 통해 데이터를 가져온다고 생각하면 될 것 같다.

 

 

서버통신 단계

 

크게 다음과 같은 단계를 밟는다. 그냥 java에서 아래 단계를 그대로 코드로 작성해주면 됨.. 

대충 이런 흐름이라고만 이해하고 넘어가고, 밑의 샘플 코드를 보면서 자세히 보도록 하자.

 

 

1. URL객체 생성

2. URLConnection객체 생성

3. URL 연결

4. 입출력 스트림을

5. 입력 스트림 가져오기/데이터 읽기

6. 출력 스트림 가져오기/데이터 쓰기

7. 연결 닫기

 

 

샘플코드

 

언제나처럼 공공데이터포털에서 데이터를 가져와보도록 하자. 공공데이터포털은 아래 글을 참조하도록 하자.

( 공공데이터포털 설명 :: 공공데이터포털에서 API로 데이터 가져오기 )

 

 

HttpTestService.java

package app.model.com;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

import org.json.JSONObject;
import org.json.XML;

import com.fasterxml.jackson.core.JsonParser;

public class HttpTestService {

	public static void main(String[] args) throws IOException {
		
		/*	URL에 각종 파라메터를 추가하기 위한 StringBuilder 객체 생성
		 * 	해당 객체 makeMyURL에 append 함수를 통해 파라메터를 추가함
		 * */
		StringBuilder makeMyURL = new StringBuilder("http://apis.data.go.kr/B551182/rprtHospService/getRprtHospService");
		
		// 해당 API의 인증키를 String타입으로 선언
		String myServiceKey = "kKpMW-------------Y6Wv1Tfvrckn9d3DoT0vWO0EjY5xN06%2BP53Po%2FaGkNo193gHjU8SuGkE2%2Fu65phwcW6NA%3D%3D";
		
		// makeMyURL에 데이터를 가져오기 위한 각종 파라메터를 추가함 ( UTF-8로 인코딩 )
		makeMyURL.append("?" + URLEncoder.encode("serviceKey", "UTF-8") + "=" + myServiceKey);
		makeMyURL.append("&" + URLEncoder.encode("pageNo", "UTF-8") + "=1");		
		makeMyURL.append("&" + URLEncoder.encode("numOfRows", "UTF-8") + "=10");
		
		
		/*
		 * URL객체에 내가 만들어 둔, makeMyURL를 String타입으로 변환하여 파라메터로 사용
		 * url = "http://apis.data.go.kr/B551182/rprtHospService/getRprtHospService?serviceKey=인증키&pageNo=1&numOfRows=10";
		 * */
		URL url = new URL(makeMyURL.toString());
		
		
		/*
		 * 서버통신을 하기위한 Connection 객체 생성, 만들어둔 url을 Connection타입으로 변환하여 선언해줌
		 * */
		HttpURLConnection conn = (HttpURLConnection)url.openConnection();
		
		// 통신을 위한 메소드방식 SET ( 여기서는 단순조회이기 때문에 GET방식 )
		conn.setRequestMethod("GET");
		
		// 통신상태를 콘솔에 찍어줌
		System.out.println("Response code: " + conn.getResponseCode());
		
		BufferedReader rd;
		
		// 서버통신이 정상적으로 이루어지면 BufferedReader 객체에 해당 데이터를 넣어줌
		if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
			rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
		}else {
            rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
        }
		
		 // 저장된 데이터를 라인별로 읽어 StringBuilder 객체로 저장.
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = rd.readLine()) != null) {
            sb.append(line);
        }
        // 객체 해제.
        rd.close();
        conn.disconnect();
        // 전달받은 데이터 확인.
        System.out.println(sb.toString());
        
        System.out.println("\nㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ구분선ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ\n");
        
        
        // XML형식을 JSON형식으로 변환하여 콘솔에 출력
        JSONObject json = XML.toJSONObject(sb.toString());
        String jsonStr = json.toString();
        System.out.println(jsonStr);
	}

}

 

자신이 받고 싶은 API문서를 참조하여, 서비스 URL, 필수 파라메터, 인증키 정도만 바꿔주도록 하자.

나는 건강보험심사평가원 데이터를 선택했다.

 

 

결과

 

 

 

 

 

 

 

728x90
profile

개발공작소

@모찌바라기

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!