[스프링]Spring UriComponents

모래·2022년 8월 31일
0

졸업프로젝트

목록 보기
5/9

졸업프로젝트를 하면서 썼던 UriComponents에 대해 내가 보려고 정리함!

이전 편에서 티맵 API를 이용해 통합검색 결과를 받아오는 것을 성공했고,
이 다음은 엘리베이터 데이터를 받아올 차례였다.

저번에는 RestTemplate에 대해 알아봤으니
이번엔 UriCompontents에 대해 적어놓으려고 한다.

1. UriComponents란?

UriComponents는 URI를 동적으로 생성해주는 클래스다.
UriComponents를 사용하면 파라미터 값을 지정하거나 변경하는 일이 쉬워진다. 원하는 URI로 각각의 링크를 생성할 수 있어서 Rest 스타일로 개발하는데 편리하다.

2. UriComponentsBuilder란?

UriComponentsBuilder는 클래스 명에서 유추할 수 있듯이, UriComponents를 build 할 수 있도록 도와주는 클래스이다.
UriComponents 클래스의 생성자는 모두 package-private 또는 private 이기 때문에, 개발자가 이를 직접 구현하지 않는 이상 생성자를 통해 직접 생성할 수는 없다.

우리는 생성자를 이용하는 대신, UriComponentsBuilder 클래스를 이용하여 UriComponents 의 인스턴스를 생성할 수 있다.

<생성 방법>

① Static Factory Method 중에 하나를 이용하여 UriComponentsBuilder 객체를 생성한다.

[Static Factory Method의 종류]

  • newInstance()
  • fromPath(String)
  • fromUri (URI)
  • fromUriString (String)
  • fromHttpUrl (String)
  • fromHttpRequest (HttpRequest)
  • fromOriginHeader (String)

② 대응되는 각 메서드를 이용하여 URI 구성요소를 설정하거나 인코딩을 설정한다.

  • scheme(String)
  • userInfo(String)
  • host(String)
  • port(String or int)
  • path(String)
  • queryParam(String, Object...)
  • queryParams(MultiValueMap<String, String>)
  • fragment(String)
  • encode(void or Charset) : void일 경우 UTF-8 로 인코딩
  • expand(Map<String, ?> or Object... or UriTemplateVariables) : URI 템플릿 변수 값을 지정

③ build() 메서드를 이용하여 UriComponents 인스턴스를 build
or buildAndExpand() 메서드를 이용하여 URI 템플릿 변수를 설정한 후 build

위 세 단계를 거치게 되면 최종적으로 UriComponents 인스턴스가 생성된다.

그러면 이제 UriComponents의 toUri() 메서드를 이용하여 URI 객체로 변환한 후, 이를 이용해 원하는 작업을 수행해도 되고, uriString() 메서드를 이용해 String 형태의 URI를 얻어낸 후 이용해도 된다.

그럼,
open api를 이용해서 엘리베이터 데이터를 받아와보자.

3. open api 사용해서 데이터 받아오기

요청 메세지 예시에는
http://openapi.elevator.go.kr/openapi/service/ElevatorOperationService/getOperationInfoList?serviceKey=인증키&buld_address=창원시 마산합포구&pageNo=1&numOfRows=10

이렇게 써있었다.

요청 메세지 명세를 보니, serviceKey와 buld_address, numOfRows, pageNo가 필수 파라미터구나!

나는 fromHttpUrl을 사용해서 그 안에 url을 넣어 UriComponentsBuilder 객체를 생성했고,
queryParam에는 필수 파라미터인 buld_address, numOfRows, pageNo를 넣어주고,
build() 메서드를 이용해서 빌드해줬다.

우리 졸업프로젝트에 썼던 예시

public Object elevatorAPI() {
		RestTemplate restTemplate = new RestTemplate();
        HttpHeaders headers = new HttpHeaders(); //헤더

        UriComponents uri = UriComponentsBuilder
                .fromHttpUrl(elevator_url)
                .queryParam("serviceKey", elevator_apikey) //서비스키
                .queryParam("buld_address", address) //주소
                .queryParam("numOfRows", 1) // 개수
                .queryParam("pageNo", 1)
                .build();

        ResponseEntity<String> result = restTemplate.exchange(uri.toUriString(), HttpMethod.GET, new HttpEntity<String>(headers), String.class);
        }
}

결과가 잘 받아와졌다.

> REFERENCE🙇‍♀️

https://blog.naver.com/PostView.naver?blogId=aservmz&logNo=222322019981&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView
https://developer-davii.tistory.com/41

profile
웹 백엔드 개발자가 되기 위해 열심히 공부를 하자🔥

0개의 댓글