[Spring] ๐ŸŒฑ RestTemplate

์ด์ค€์˜ยท2023๋…„ 9์›” 7์ผ
2

๐ŸŒฑ Spring

๋ชฉ๋ก ๋ณด๊ธฐ
14/18
post-thumbnail

๐ŸŒฑ RestTemplate

RestTemplate ์ด๋ž€?

์ง€๊ธˆ๊นŒ์ง€ ํ•ด์˜ค๋˜ ๊ฐ„๋‹จํ•œ ๊ฐœ๋ฐœ๋“ค์€ Client, ๋ธŒ๋ผ์šฐ์ €๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์„ ๋ฐ›๋Š” ์„œ๋ฒ„์˜ ์ž…์žฅ์—์„œ ๊ฐœ๋ฐœ์„ ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์†Œ์…œ ๋กœ๊ทธ์ธ, ๊ฒฐ์ œ, ์ „ํ™”๋ฒˆํ˜ธ ์ธ์ฆ ๋“ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ๋งŒ์œผ๋กœ๋Š” ๊ตฌํ˜„์ด ์–ด๋ ค์šด ๊ธฐ๋Šฅ๋“ค์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ๊ธฐ์กด์˜ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์š”์ฒญ์„ ๋ฐ›๋Š” ์„œ๋ฒ„์˜ ์ž…์žฅ์ด์—ˆ์ง€๋งŒ, ๊ธฐ์กด ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์ž…์žฅ์—์„œ ๋‹ค๋ฅธ ์„œ๋ฒ„์˜ API์— ์š”์ฒญ์„ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Spring์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์š”์ฒญ์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ๐ŸŒฑ RestTemplate ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

RestTemplate๋Š” ์Šคํ”„๋ง 3.0๋ถ€ํ„ฐ ์ง€์›๋˜์—ˆ๊ณ , json, xml ๋ชจ๋‘ ์‘๋‹ต ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ HTTP ์˜ ๋ฉ”์†Œ๋“œ(GET, POST, PATCH, DELETE)๋ฅผ ์š”์ฒญ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋„์™€์ฃผ๊ณ , ์š”์ฒญ์— ์‹ค์–ด ๋ณด๋‚ผ header, body๋‚˜ query๋“ค๋„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


RestTemplate ๋™์ž‘ ์›๋ฆฌ

  1. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€(ํด๋ผ์ด์–ธํŠธ ์ž…์žฅ์˜ ์„œ๋ฒ„) ์—์„œ RestTemplate๋ฅผ ์ƒ์„ฑํ•˜๊ณ , URI, HTTP ํ—ค๋”, body๋“ฑ์„ ๋‹ด์•„ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

  2. RestTemplate๋Š” HttpMEssageConverter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ requestEntity๋ฅผ ์š”์ฒญ๋ฉ”์„ธ์ง€๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  3. RestTemplate ๋Š” ClientHttpRequestFactory ๋กœ ๋ถ€ํ„ฐ ClientHttpRequest๋ฅผ ๊ฐ€์ ธ์™€ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

  4. ClientHttpRequest ๋Š” ์š”์ฒญ๋ฉ”์„ธ์ง€๋ฅผ ๋งŒ๋“ค์–ด HTTP๋ฅผ ํ†ตํ•ด ์„œ๋ฒ„(์„œ๋ฒ„ ์ž…์žฅ์˜ ์„œ๋ฒ„)์— ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

  5. ResponseTemplate ๋Š” ResponseErrorHandler๋กœ ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  6. ClientHttpResponse์—์„œ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ์˜ค๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฉด ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  7. RestTemplate๋Š” HttpMessageConverter๋ฅผ ์ด์šฉํ•ด ์‘๋‹ต ๋ฉ”์„ธ์ง€๋ฅผ java object๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  8. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ฐ˜ํ™˜ ๋ฉ๋‹ˆ๋‹ค.



RestTemplate ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…

์ƒ์„ฑ์ž ์ฃผ์ž…์„ ํ†ตํ•ด RestTemplate๋ฅผ ์ฃผ์ž…๋ฐ›์œผ๋ ค๊ณ  ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์˜ค๋ฅ˜ ๋ฉ”์„ธ์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ›”๏ธ Could not autowire. No beans of 'RestTemplate' type found.

์ด๋ ‡๊ฒŒ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” RestTemplate๋Š” RestTemplateBuilder์˜ .build() ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์œ„์™€๊ฐ™์ด Builder๋ฅผ ๋จผ์ € ์ฃผ์ž…๋ฐ›์€ ํ›„ RestTemplate๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



๐ŸŒฑ RestTemplate ์š”์ฒญ ๋ณด๋‚ด๊ธฐ

Get, Post, Patch, Delete์š”์ฒญ์€ ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„์— ๋”ฐ๋ผ ์›ํ•˜๋Š” ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

URI๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ธ์ž๋กœ ์ „๋‹ฌํ•ด์ฃผ๊ณ , ํ•„์š”์— ๋”ฐ๋ผ body, header, ๋ฐ˜ํ™˜๋ฐ›์„ ClassType๋“ฑ์„ ์ถ”๊ฐ€๋กœ ์ „๋‹ฌํ•ด ์ค๋‹ˆ๋‹ค.

URI ์ƒ์„ฑํ•˜๊ธฐ

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

exchange ๊ฐ™์€ ๊ฒฝ์šฐ RequestEntity๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ถ€๋ถ„์ด ์กฐ๊ธˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์œ„์—์„œ ๋ดค๋˜ getForEntity ์™€ ๊ฐ™์ด ์–ด๋–ค ์š”์ฒญ์„ ๋ณด๋‚ผ ๊ฒƒ์ด๋ผ๊ณ  ๋ช…์‹œ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, GET์š”์ฒญ์„ ๋ณด๋‚ผ์ง€ POST ์š”์ฒญ์„ ๋ณด๋‚ผ ์ง€ ๋”ฐ๋กœ ์„ค์ •์„ ํ•ด ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฉ”์†Œ๋“œ ํ˜•์‹์„ RequestEntity ์— ๋‹ด์•„์„œ ์ „๋‹ฌํ•จ์œผ๋กœ์จ ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์™€ ๊ฐ™์ด .post, .get ๋“ฑ์„ ํ†ตํ•ด ์–ด๋– ํ•œ ์š”์ฒญ์„ ๋ณด๋‚ผ ๊ฒƒ์ธ์ง€ ์ •ํ•˜๊ณ , .header๋ฅผ ํ†ตํ•ด ํ—ค๋”์— ํ† ํฐ ๊ฐ’ ๋“ฑ์„ ์‹ค์–ด ๋ณด๋‚ด๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๊ณ , .body๋ฅผ ํ†ตํ•ด ์–ด๋– ํ•œ ๋‚ด์šฉ์„ ๋‹ด์•„ ๋ณด๋‚ผ ๊ฒƒ์ธ์ง€ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ RequestEntity ๊ฐ์ฒด๋ฅผ exchange์˜ ์ธ์ž๋กœ ์ „๋‹ฌํ•ด ์›ํ•˜๋Š” ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐ŸŒฑ RestTemplate ์‘๋‹ต ์ฒ˜๋ฆฌํ•˜๊ธฐ

์š”์ฒญ์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋ณด๋ƒˆ๋‹ค๋ฉด ๊ทธ์—๋Œ€ํ•œ ์‘๋‹ต์ด ์ง€์ •ํ–ˆ๋˜ 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 ์™€ JSONArray ์‚ฌ์šฉํ•˜์—ฌ ์‘๋‹ต ์ฒ˜๋ฆฌ

  1. ๋ฌธ์ž์—ด ์ •๋ณด๋ฅผ JSONObject๋กœ ๋ฐ”๊พธ๊ธฐ

  2. JSONObject์—์„œ items ๋ฐฐ์—ด ๊บผ๋‚ด๊ธฐ

  3. enhanced-for๋ฌธ์œผ๋กœ ํ•˜๋‚˜ํ•˜๋‚˜ Dto๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

  4. Dto ์ƒ์„ฑ์ž ๋‚ด๋ถ€์—์„œ JSONObject์˜ ๊ฐ’ ๊บผ๋‚ด์–ด ์ƒ์„ฑํ•˜๊ธฐ



์ฐธ๊ณ 
profile
์ž‘์€ ๊ฑธ์Œ์ด๋ผ๋„ ๊พธ์ค€ํžˆ

0๊ฐœ์˜ ๋Œ“๊ธ€