[Spring] RestTemplate, UriComponentsBuilder
RestTemplate
- Spring์์ ์ง์ํ๋ ๊ฐ์ฒด๋ก ๊ฐํธํ๊ฒ Rest ๋ฐฉ์ API๋ฅผ ํธ์ถํ ์ ์๋ Spring ๋ด์ฅ ํด๋์ค์ ๋๋ค.
- Spring 3.0๋ถํฐ ์ง์๋์๊ณ , json, xml ์๋ต์ ๋ชจ๋ ๋ฐ์ ์ ์์ต๋๋ค.
Rest API ์๋น์ค๋ฅผ ์์ฒญ ํ ์๋ต ๋ฐ์ ์ ์๋๋ก ์ค๊ณ๋์ด์์ผ๋ฉฐ HTTP ํ๋กํ ์ฝ์ ๋ฉ์๋(ex. GET, POST, DELETE, PUT)๋ค์ ์ ํฉํ ์ฌ๋ฌ ๋ฉ์๋๋ค์ ์ ๊ณตํฉ๋๋ค. - Spring Framework 5๋ถํฐ๋ WebClient ๋ผ๋ ์๋ก์ด HTTP ํด๋ผ์ด์ธํธ๋ฅผ ๋์ ํ์ฌ ๊ธฐ์กด์ ๋๊ธฐ์ API๋ฅผ ์ ๊ณตํ ๋ฟ ๋ง ์๋๋ผ ํจ์จ์ ์ธ ๋น์ฐจ๋จ ๋ฐ ๋น๋๊ธฐ ์ ๊ทผ ๋ฐฉ์์ ์ง์ํ์ฌ, Spring 5.0 ์ดํ ๋ถํฐ๋ RestTemplate๋ deprecated ๋์์ต๋๋ค. (WebClient ์ฌ์ฉ ์งํฅ)
RestTemplate์ ํน์ง
· Spring 3.0 ๋ถํฐ ์ง์ํ๋ Spring์ HTTP ํต์ ํ
ํ๋ฆฟ
· HTTP ์์ฒญ ํ JSON, XML, String ๊ณผ ๊ฐ์ ์๋ต์ ๋ฐ์ ์ ์๋ ํ
ํ๋ฆฟ
· Blocking I/O ๊ธฐ๋ฐ์ ๋๊ธฐ๋ฐฉ์์ ์ฌ์ฉํ๋ ํ
ํ๋ฆฟ
· RESTful ํ์์ ๋ง์ถ์ด์ง ํ
ํ๋ฆฟ
· Header, Content-Tpye๋ฑ์ ์ค์ ํ์ฌ ์ธ๋ถ API ํธ์ถ
· Server to Server ํต์ ์ ์ฌ์ฉ
RestTemplate ๋ฉ์๋
Api ํธ์ถ ํด๋์ค ์ข ๋ฅ
- RestTemplate
- Spring 3๋ถํฐ ์ง์ ๋์๊ณ REST API ํธ์ถ์ดํ ์๋ต์ ๋ฐ์ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋๊ธฐ๋ฐฉ์์ ๋๋ค
- AsyncRestTemplate
- Spring 4์ ์ถ๊ฐ๋ ๋น๋๊ธฐ RestTemplate์ ๋๋ค
- Spring 5.0์์๋ deprecated ๋์์ต๋๋ค
- WebClient
- Spring 5์ ์ถ๊ฐ๋ ๋ ผ๋ธ๋ญ, ๋ฆฌ์ํฐ๋ธ ์น ํด๋ฆฌ์ด์ธํธ๋ก ๋๊ธฐ, ๋น๋๊ธฐ ๋ฐฉ์์ ์ง์ํฉ๋๋ค.
RestTemplate ์ฌ์ฉ ๋ฐฉ๋ฒ
0. ๊ฒฐ๊ณผ๊ฐ์ ๋ด์ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
1. ํ์์์ ์ค์ ์ HttpComponentsClientHttpRequestFactory ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
2. RestTemplate ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
3. header ์ค์ ์ ์ํด HttpHeader ํด๋์ค๋ฅผ ์์ฑํ ํ HttpEntity ๊ฐ์ฒด์ ๋ฃ์ด์ค๋๋ค.
4. ์์ฒญ URL์ ์ ์ํด์ค๋๋ค.
5. exchange() ๋ฉ์๋๋ก api๋ฅผ ํธ์ถํฉ๋๋ค.
6. ์์ฒญํ ๊ฒฐ๊ณผ๋ฅผ HashMap์ ์ถ๊ฐํฉ๋๋ค.
UriComponents
- URI๋ฅผ ๊ตฌ์ฑํ๋ Components๋ค์ ํจ๊ณผ์ ์ผ๋ก ๋ค๋ฃฐ ์ ์๋๋ก ํ๋ ํด๋์ค
- URI์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ ๊ตฌ์ฑ์์๋ณ๋ก ๋ถ๋ฆฌํ์ฌ ๋ณ์์ ์ ์ฅํ์ฌ ๊ฐ์ง๊ณ ์๋ URI ๊ตฌ์ฑ์์์ ์งํฉ
- URI๋ฅผ ๊ตฌ์ฑํ๋ ์ปดํฌ๋ํธ
- Scheme
- UserInfo
- Host
- Port
- Path
- Query
- Fragment
UriComponentsBuilder
- UriComponents ๋ฅผ Buildํ ์ ์๋๋ก ๋์์ฃผ๋ ํด๋์ค
- ์ฌ๋ฌ ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ค์ ์ฐ๊ฒฐํ์ฌ URL ํํ๋ก ๋ง๋ค์ด ์ฃผ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค.
- ์ฆ Controller๋จ์์ addAttribute๋ก ํ๋ ํ๋ ์์ฑ์ ์ง์ ํด์ฃผ์ง ์์๋ ์ด class๋ฅผ ์ด์ฉํ๋ฉด ์์ฝ๊ณ ๊ฐ๋จํ๊ฒ ํ๋ผ๋ฏธํฐ๋ค์ ์ ๋ฌํ ์ ์์ต๋๋ค.
์์ ์ฝ๋
//์์ฒญํ๋ ๊ฒ์ uri ์์ฑ
public SearchLocalRes searchLocal(SearchLocalReq searchLocalReq){
URI uri = UriComponentsBuilder.fromUriString(naverLocalSearchUrl)
.queryParams(searchLocalReq.toMultiValueMap())
.build()
.encode()
.toUri();
HttpHeaders headers = new HttpHeaders();
headers.set("X-Naver-Client-Id", naverClientId);
headers.set("X-Naver-Client-Secret", naverClientSecret);
headers.setContentType(MediaType.APPLICATION_JSON);
// ์ด header๋ฅผ entity ์ ๋ด๊ธฐ
HttpEntity httpEntity = new HttpEntity<>(headers);
//responseType ์ค์
// ParameterizedTypeReference: ์ ๋ค๋ฆญ ํ์
์ ์ธ์ํ๊ณ ์ ๋ฌํ๋ค.
// ์์ธํ๊ฒ๋ RestTemplate์ ์๋ต ํ์
์ ์ง์ ํ ๋ ์ ๋ค๋ฆญ ์ ๋ณด๋ฅผ ์ ํํ๊ฒ ์์์ผ ํ ํ์๊ฐ ์๋ค.
// ParameterizedTypeReference์ <SearchLocalRes> ์ ๋ณด๋ฅผ ์ค์ ์ต๋ช
์์ ํด๋์ค๋ฅผ ๋ง๋ ๋ค.
// (์ฐธ๊ณ ๋ก ParameterizedTypeReference๋ abstract ํด๋์ค๋ผ ์ง์ ์์ฑ์ด ๋ถ๊ฐ๋ฅํ๋ค)
// ์ด ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก API์ ์๋ต๊ฐ์ <SearchLocalRes> ํ์
์ผ๋ก ๋ณํํด์ ๋ฐ์ ์ ์๋ ๊ฒ์ด๋ค.
var responseType = new ParameterizedTypeReference<SearchLocalRes>(){};
//restTemplate ํตํด์ ์์ฒญ๊ฐ ๋ฐ๊ธฐ
ResponseEntity<SearchLocalRes> responseEntity = new RestTemplate().exchange(
uri,
HttpMethod.GET,
httpEntity,
responseType
);
// ResponseEntity ํ์
์ผ๋ก ๋ฆฌํด๋ฐ์ผ๋ฉด ์ข์์ ์ ์ํ์ฝ๋, ํค๋์ ๋ณด ๋ฑ๋ ์กฐํ๊ฐ ๊ฐ๋ฅํ๋ค.
// getBody๋ฅผ ํตํด์ ๊ฒฐ๊ณผ๋ฅผ return
return responseEntity.getBody();
์ฐธ์กฐhttps://juntcom.tistory.com/141
https://blog.naver.com/PostView.naver?blogId=aservmz&logNo=222322019981