์ง๊ธ๊น์ง ํด์ค๋ ๊ฐ๋จํ ๊ฐ๋ฐ๋ค์ Client, ๋ธ๋ผ์ฐ์ ๋ก๋ถํฐ ์์ฒญ์ ๋ฐ๋ ์๋ฒ์ ์ ์ฅ์์ ๊ฐ๋ฐ์ ํ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์์ ๋ก๊ทธ์ธ, ๊ฒฐ์ , ์ ํ๋ฒํธ ์ธ์ฆ ๋ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ๋ง์ผ๋ก๋ ๊ตฌํ์ด ์ด๋ ค์ด ๊ธฐ๋ฅ๋ค์ด ๋ง์ด ์์ต๋๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ ๊ธฐ์กด์ ํด๋ผ์ด์ธํธ์๊ฒ ์์ฒญ์ ๋ฐ๋ ์๋ฒ์ ์ ์ฅ์ด์์ง๋ง, ๊ธฐ์กด ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ ์ ์ฅ์์ ๋ค๋ฅธ ์๋ฒ์ API์ ์์ฒญ์ ๋ณด๋ด์ผ ํฉ๋๋ค.
Spring์์๋ ์ด๋ฌํ ์์ฒญ์ ๊ฐํธํ๊ฒ ํ ์ ์๋๋ก ๋์์ฃผ๋ ๐ฑ RestTemplate ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์์ต๋๋ค.
RestTemplate๋ ์คํ๋ง 3.0๋ถํฐ ์ง์๋์๊ณ , json, xml ๋ชจ๋ ์๋ต ๋ฐ์ ์ ์์ต๋๋ค. ๋ํ HTTP ์ ๋ฉ์๋(GET, POST, PATCH, DELETE)๋ฅผ ์์ฒญ ๊ฐ๋ฅํ๊ฒ ๋์์ฃผ๊ณ , ์์ฒญ์ ์ค์ด ๋ณด๋ผ header, body๋ query๋ค๋ ์ค์ ํ ์ ์๋๋ก ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ดํ๋ฆฌ์ผ์ด์ ๋ด๋ถ(ํด๋ผ์ด์ธํธ ์ ์ฅ์ ์๋ฒ) ์์ RestTemplate๋ฅผ ์์ฑํ๊ณ , URI, HTTP ํค๋, body๋ฑ์ ๋ด์ ์์ฒญ์ ๋ณด๋ ๋๋ค.
RestTemplate๋ HttpMEssageConverter๋ฅผ ์ฌ์ฉํ์ฌ requestEntity๋ฅผ ์์ฒญ๋ฉ์ธ์ง๋ก ๋ณํํฉ๋๋ค.
RestTemplate ๋ ClientHttpRequestFactory ๋ก ๋ถํฐ ClientHttpRequest๋ฅผ ๊ฐ์ ธ์ ์์ฒญ์ ๋ณด๋ ๋๋ค.
ClientHttpRequest ๋ ์์ฒญ๋ฉ์ธ์ง๋ฅผ ๋ง๋ค์ด HTTP๋ฅผ ํตํด ์๋ฒ(์๋ฒ ์ ์ฅ์ ์๋ฒ)์ ์์ฒญํฉ๋๋ค.
ResponseTemplate ๋ ResponseErrorHandler๋ก ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
ClientHttpResponse์์ ์๋ต ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์ค๋ฅ๊ฐ ์์ผ๋ฉด ์ฒ๋ฆฌํฉ๋๋ค.
RestTemplate๋ HttpMessageConverter๋ฅผ ์ด์ฉํด ์๋ต ๋ฉ์ธ์ง๋ฅผ java object๋ก ๋ณํํฉ๋๋ค.
์ดํ๋ฆฌ์ผ์ด์ ์ ๋ฐํ ๋ฉ๋๋ค.
์์ฑ์ ์ฃผ์ ์ ํตํด RestTemplate๋ฅผ ์ฃผ์ ๋ฐ์ผ๋ ค๊ณ ํ๋ฉด ์๋์ ๊ฐ์ ์ค๋ฅ ๋ฉ์ธ์ง๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
โ๏ธ Could not autowire. No beans of 'RestTemplate' type found.
์ด๋ ๊ฒ ์์กด๊ด๊ณ ์ฃผ์ ์ด ์ผ์ด๋์ง ์๋ ์ด์ ๋ RestTemplate๋ RestTemplateBuilder์ .build() ๋ฉ์๋๋ฅผ ํตํด ๋ฐ์์ฌ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฐ๋ผ์ ์์๊ฐ์ด Builder๋ฅผ ๋จผ์ ์ฃผ์ ๋ฐ์ ํ RestTemplate๋ฅผ ํธ์ถํ์ฌ ์์กด๊ด๊ณ ์ฃผ์ ์ ํ ์ ์์ต๋๋ค.
Get, Post, Patch, Delete์์ฒญ์ ๋ฉ์๋์ ์ด๋ฆ์ ๋ฐ๋ผ ์ํ๋ ์์ฒญ์ ๋ณด๋ผ ์ ์์ต๋๋ค.
URI๋ฅผ ์์ฑํ์ฌ ์ธ์๋ก ์ ๋ฌํด์ฃผ๊ณ , ํ์์ ๋ฐ๋ผ body, header, ๋ฐํ๋ฐ์ ClassType๋ฑ์ ์ถ๊ฐ๋ก ์ ๋ฌํด ์ค๋๋ค.
RestTemplate์ ๋ด์ URI๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
URI๋์ ๋ถ๋ ?key=value ํ์์ QueryParameter๋ queryParam("key","value") ์ํ์์ผ๋ก ์ถ๊ฐ ๊ฐ๋ฅํ๊ณ ,
URI์ {id} ๊ฐ์ PathVariable์ expand()๋ฅผ ํตํด ์ง์ ํ ์ ์์ต๋๋ค.
RestTemplate HTTP ์์ฒญ ์์
body๋ถ๋ถ์๋ HTTP Request์ Body๋ถ๋ถ์ ๋ด์์ ๋ณด๋ด๊ณ ์ถ์ ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ์ ๋ฌํ๋ฉด RestTemplate๋ด๋ถ์์ HTTP body์ ๋ณํํ์ฌ ๋ด์์ค๋๋ค.
๐ก exchange๋ requestEntity์ HTTP๋ฉ์๋๋ฅผ ๋ด์ ์ํ๋ ์์ฒญ์ ๋ณด๋ผ ์ ์์ต๋๋ค.
exchange ๊ฐ์ ๊ฒฝ์ฐ RequestEntity๋ฅผ ์ธ์๋ก ์ ๋ฌํด์ผ ํ๋ค๋ ๋ถ๋ถ์ด ์กฐ๊ธ ๋ค๋ฆ ๋๋ค. ์์์ ๋ดค๋ getForEntity ์ ๊ฐ์ด ์ด๋ค ์์ฒญ์ ๋ณด๋ผ ๊ฒ์ด๋ผ๊ณ ๋ช ์๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์, GET์์ฒญ์ ๋ณด๋ผ์ง POST ์์ฒญ์ ๋ณด๋ผ ์ง ๋ฐ๋ก ์ค์ ์ ํด ์ฃผ์ด์ผ ํฉ๋๋ค. ์ด๋ฌํ ๋ฉ์๋ ํ์์ RequestEntity ์ ๋ด์์ ์ ๋ฌํจ์ผ๋ก์จ ์ ํ ์ ์์ต๋๋ค.
์์ ๊ฐ์ด .post, .get ๋ฑ์ ํตํด ์ด๋ ํ ์์ฒญ์ ๋ณด๋ผ ๊ฒ์ธ์ง ์ ํ๊ณ , .header๋ฅผ ํตํด ํค๋์ ํ ํฐ ๊ฐ ๋ฑ์ ์ค์ด ๋ณด๋ด๋ ๊ฒ๋ ๊ฐ๋ฅํ๊ณ , .body๋ฅผ ํตํด ์ด๋ ํ ๋ด์ฉ์ ๋ด์ ๋ณด๋ผ ๊ฒ์ธ์ง ์ง์ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ RequestEntity ๊ฐ์ฒด๋ฅผ exchange์ ์ธ์๋ก ์ ๋ฌํด ์ํ๋ ์์ฒญ์ ๋ณด๋ผ ์ ์์ต๋๋ค.
์์ฒญ์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ณด๋๋ค๋ฉด ๊ทธ์๋ํ ์๋ต์ด ์ง์ ํ๋ Type์ ๋ง๊ฒ๋ฐํ๊ฐ์ ๋ด๊ฒจ ๋์ด์ค๊ฒ ๋ฉ๋๋ค. (String.class์ผ๋ก ์ง์ ํ๋ฉด ResponsEntity<String> ์ผ๋ก ๋ฐํ๋ฐ๊ฒ ๋)
๋ฐํ๋ฐ์ ResponseEntity์์ ์๋ต์ผ๋ก ๋์ด์จ HttpStatus ์ฝ๋์, body๋ฅผ ๋ฐ์์ฌ ์ ์์ต๋๋ค.
body ๊ฐ์ ์ํ๋ ํ์์ ํด๋์ค๋ก ๋ณํํ ์ ์์ด ๋ฐ๋ก ๋ณํํด ํด๋น ๊ฐ์ Client(๋ธ๋ผ์ฐ์ ) ์๊ฒ ์ ๋ฌ ํ ์๋ ์๊ฒ ์ง๋ง,
๋ณดํต ๋ฐ์์ค๋ ์๋ต์ ์๋์ ๊ฐ์ด Json ๋ด๋ถ์ Json์ด ์ค์ฒฉ๋์ด ๋ฐํ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ์ด๋ฌํ ๊ฒฝ์ฐ๋ String.class๋ก ์๋ต์ ๋ฐ์ ํ JSONObject ์ JSONArray ๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ ํ์์ผ๋ก ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
{
"items":[
{"title":"Mac","price":3888000},
{"title":"iPad","price":1230000},
{"title":"iPhone","price":1550000},
{"title":"Watch","price":450000},
{"title":"AirPods","price":350000}
]
}
๋ฌธ์์ด ์ ๋ณด๋ฅผ JSONObject๋ก ๋ฐ๊พธ๊ธฐ
JSONObject์์ items ๋ฐฐ์ด ๊บผ๋ด๊ธฐ
enhanced-for๋ฌธ์ผ๋ก ํ๋ํ๋ Dto๋ก ๋ณํํ๊ธฐ
Dto ์์ฑ์ ๋ด๋ถ์์ JSONObject์ ๊ฐ ๊บผ๋ด์ด ์์ฑํ๊ธฐ