๐Ÿ“ŒSpring์—์„œ API, @RequestBody, HTTP Body ์™„๋ฒฝ ์ดํ•ดํ•˜๊ธฐ

My Pale Blue Dotยท2025๋…„ 4์›” 24์ผ
0

SPRING

๋ชฉ๋ก ๋ณด๊ธฐ
9/36
post-thumbnail

๐Ÿ“… 2025.04.24


๐Ÿ“ ํ•™์Šต ๋‚ด์šฉ

1๏ธโƒฃ API๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

โžฅ ์‹œ์Šคํ…œ ๊ฐ„ ์†Œํ†ต์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค

โœ… ๊ฐœ๋… ์ •์˜

API (Application Programming Interface)

API๋Š” ์†Œํ”„ํŠธ์›จ์–ด์™€ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ๊ธฐ๋Šฅ์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•ด ์ •ํ•ด๋†“์€ ๊ทœ์น™(์ธํ„ฐํŽ˜์ด์Šค)์ž…๋‹ˆ๋‹ค.

์„œ๋กœ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์ด ํšจ์œจ์ ์ด๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ์†Œํ†ตํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.

โœ… ์ฃผ์š” ํŠน์ง•

  • ํ‘œ์ค€ํ™”๋œ ์†Œํ†ต ๋ฐฉ์‹ ์ œ๊ณต
  • ๊ธฐ๋Šฅ ์žฌ์‚ฌ์šฉ ๋ฐ ํ™•์žฅ์„ฑ
  • ๋‚ด๋ถ€ ๋กœ์ง ๋ณดํ˜ธ(๋ณด์•ˆ์„ฑ)

โœ… ๋Œ€ํ‘œ ์‚ฌ๋ก€

  • REST API (์›น ํ†ต์‹  ํ‘œ์ค€)
  • ์นด์นด์˜ค ์ง€๋„ API
  • ๊ฒฐ์ œ API (PayPal, Stripe ๋“ฑ)
  • ๊ตฌ๊ธ€/๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ API

2๏ธโƒฃ HTTP ์š”์ฒญ์—์„œ Body๋ž€?

โžฅ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ณต๊ฐ„

โœ… HTTP ์š”์ฒญ ๊ตฌ์กฐ

1. ์š”์ฒญ๋ผ์ธ (Request Line)
2. ํ—ค๋” (Headers)
3. ๋ฐ”๋”” (Body)   โฌ… ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ด๊ธฐ๋Š” ์˜์—ญ

โœ… Body์˜ ์—ญํ• 

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ JSON, XML, ํ…์ŠคํŠธ, ํŒŒ์ผ ๋“ฑ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†ก.
  • ์ฃผ๋กœ POST, PUT ์š”์ฒญ ์‹œ ์‚ฌ์šฉ.
  • GET ์š”์ฒญ์€ ๋ณดํ†ต Body๊ฐ€ ์—†์Œ.

โœ… ์˜ˆ์‹œ (JSON ์ „์†ก)

POST /api/user HTTP/1.1
Content-Type: application/json

{
   "username": "jaewoong",
   "email": "jae@example.com"
}
  • ์œ„ JSON ๋ฐ์ดํ„ฐ๊ฐ€ HTTP Body์— ํ•ด๋‹น.

3๏ธโƒฃ @RequestBody(required = false)์˜ ์˜๋ฏธ

โžฅ HTTP Body ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋ฐ”๋กœ ๋งคํ•‘ํ•˜๋Š” ๋ฐฉ๋ฒ•

โœ… ๊ธฐ๋ณธ ๋™์ž‘

  • @RequestBody๋Š” HTTP ์š”์ฒญ์˜ Body๋ฅผ ์ž๋ฐ” ๊ฐ์ฒด๋‚˜ String์œผ๋กœ ๋ณ€ํ™˜.
  • ๊ธฐ๋ณธ๊ฐ’: required = true โ†’ Body๊ฐ€ ์—†์œผ๋ฉด 400 Bad Request ์˜ค๋ฅ˜ ๋ฐœ์ƒ.

โœ… required = false ์„ค์ • ์ด์œ 

  • Body๊ฐ€ ์—†์–ด๋„ ์š”์ฒญ ํ—ˆ์šฉ (์œ ์—ฐํ•œ API ์„ค๊ณ„ ๊ฐ€๋Šฅ).
  • Body๊ฐ€ ์—†์œผ๋ฉด null๋กœ ์ฒ˜๋ฆฌ๋จ.

โœ… ์ฝ”๋“œ ์˜ˆ์‹œ (์ฃผ์„ ํฌํ•จ)

@PostMapping("/example")  // POST ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์—”๋“œํฌ์ธํŠธ
public ResponseEntity<String> example(@RequestBody(required = false) String jsonData) {
    if (jsonData == null) {
        return ResponseEntity.ok("No data provided");  // Body๊ฐ€ ์—†์„ ๋•Œ ์‘๋‹ต
    }
    return ResponseEntity.ok("Received data: " + jsonData);  // Body๊ฐ€ ์žˆ์„ ๋•Œ ์‘๋‹ต
}

๐Ÿ”น ์ถœ๋ ฅ ๊ฒฐ๊ณผ

  • Body ์—†์Œ โ†’ "No data provided"
  • Body ์žˆ์Œ โ†’ "Received data: {jsonData}"

๐Ÿ”ฅ ์ •๋ฆฌ

API์™€ HTTP Body, ๊ทธ๋ฆฌ๊ณ  @RequestBody๋ฅผ ์ดํ•ดํ•˜๋ฉด ์œ ์—ฐํ•˜๊ณ  ํšจ์œจ์ ์ธ RESTful ์„œ๋น„์Šค๋ฅผ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•ญ๋ชฉ์„ค๋ช…
API์‹œ์Šคํ…œ ๊ฐ„ ๋ฐ์ดํ„ฐ ๋ฐ ๊ธฐ๋Šฅ์„ ์ฃผ๊ณ ๋ฐ›๋Š” ์ธํ„ฐํŽ˜์ด์Šค
HTTP Body์š”์ฒญ ์‹œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์˜์—ญ
@RequestBodyHTTP Body๋ฅผ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” Spring ์–ด๋…ธํ…Œ์ด์…˜
required=falseBody๊ฐ€ ์—†์–ด๋„ ์š”์ฒญ์„ ํ—ˆ์šฉ, ๋„์ฒ˜๋ฆฌ๋กœ ์œ ์—ฐํ•œ ๋Œ€์‘ ๊ฐ€๋Šฅ

๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ


profile
Here, My Pale Blue.๐ŸŒ

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