BACKEND/JAVA & SPRING

HttpURLConnection을 이용한 API 데이터 받아오기

이-프 2024. 4. 25. 21:50

최근 프로젝트를 하면서 한국관광공사에서 제공하는 '무장애여행정보' OPEN API를 활용하여 데이터를 DB에 저장하는 업무를 맡았다. 이전에 관광공사의 숙소정보를 활용해 DB에 저장해본 경험이 있는데 이번 기회에 HttpURLConnection에 대해 다시한번 정리해보고자 한다. 🌱

 

  1. URL 객체 생성
    • Http 연결 : HttpURLConnection
      • URL 내용을 읽어오거나, URL에 GET, POST 방식으로 데이터를 전달
      • ⇒ 웹페이지나, 서블릿에 데이터 전달 가능
    • URL 클래스 이용해 생성자 생성
  2. URL에서 URLConnection 객체 얻기
    • openConnection()을 이용해 url 연결
      • url 존재 : 한국관광공사에서 발급한 개인 key를 Query Parameter로 넣어준다. (명세서 기반)
  3. URLConnection 구성하기
  4. InputStream & Buffer 사용
BufferedReader bf = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8")); 
result.append(bf.readLine());
🧐 왜 StringBuffer을 사용해야할까 ?
  • StringBuffer는 기본적으로 CPU 와 보조기억장치 사이의 임시 저장공간이며 cpu 다음으로 빠른 RAM을 사용하기에 Scanner보다 훨씬!! 빠르게 데이터를 받을 수 있다.
  • 또한, Buffer는 일정량의 데이터가 쌓일 때까지 모두 쌓은 후 한번에 처리하기에 훨씬 빠른 속도로 연산을 할 수 있다.
  • CPU는 다른 일을 미리 처리한 후, Buffer에 데이터가 다 쌓일 때까지 쌓였는지 확인만 해주면 되기에 자원 낭비를 하지 않아도 된다.

 

 

5. StringBuilder 사용

  • String은 불변 객체이기에, 값이 변경되야하거나, 연산될때 새로운 String을 생성한다.
  • 하지만, 이때 많은 메모리할당과 해제를 발생시키기 때문에 String을 통으로 연산하는 것은 성능적으로 좋지 않다.
  • 그렇기에 StringBuilder를 사용한다.
    • StringBuilder는 변경이 가능한 문자열을 만들어 주기에, 문자열을 연산하는 과정을 효율적으로 할 수 있다.
  • 이후, 문자열로 변경할 때 toString()으로 해주면 된다.

 

 

6. ObjectMapper로 String 값 파싱하여 VO로 받기

🧐 ObjectMapper란?
  • jackson 라이브러리
  • JSON 형식을 사용할 때, 응답들을 직렬화하고, 요청들을 역직렬화 할 때 사용

 

🧐 직렬화 ?
  • 데이터를 전송하거나, 저장할 때는 byte 문자열이기에 객체들을 문자열로 바꿔준다
    ObjectMapper mapper = new ObjectMapper();
    Member member = new Member("김oo", "여성");
    
    String text = mapper.WriteValueAsString(member); //{"name":"김oo","age":"여성"}
    
  • Object ⇒ String 문자열

 

🧐 역직렬화 ?
  • 데이터가 모두 전송된 이후, 수신 측에서 다시 문자열을 기존의 객체로 회복시킨다.
    Member memberObject = mapper.readValue(text, Member.class); //Member{name='김oo',age='여성'}
    
  • String 문자열 ⇒ Object

 

🎶 Spring Boot는 이미 spring-boot-starter-web에 Jackson 라이브러리가 있기 때문에, Object ↔ JSON간의 변환은 자동으로 처리된다고 보면 된다 !!
ex) @RestController 는 요청과 응답이 내부적으로 직렬화/역직렬화 가 된다 (b.o. Jackson 라이브러리)