모래블로그

[스프링] Spring UriComponents 본문

Framework/Spring

[스프링] Spring UriComponents

별모래 2023. 11. 22. 17:05
728x90

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

728x90