๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Spring Boot๋กœ RESTful API ๊ฐœ๋ฐœ: ์‰ฝ๊ณ  ํšจ์œจ์ ์ธ API ์„ค๊ณ„ ๋ฐฉ๋ฒ•

mrmount 2024. 10. 21.

 

RESTful API ๋Š” ํ˜„๋Œ€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์—์„œ ํ•„์ˆ˜์ ์ธ ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค. Spring Boot ๋Š” ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ REST API๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์–‘ํ•œ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ํฌ์ŠคํŒ…์—์„œ๋Š” RESTful API ์„ค๊ณ„ ์›์น™ , @RestController ์™€ @RequestMapping ์‚ฌ์šฉ๋ฒ• , ๊ทธ๋ฆฌ๊ณ  JSON ๋ฐ XML ์‘๋‹ต ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ• ์„ ์ž์„ธํžˆ ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 


 

 

๋ชฉ์ฐจ

  1. RESTful API๋ž€ ๋ฌด์—‡์ธ๊ฐ€?
  2. RESTful API ์„ค๊ณ„ ์›์น™๊ณผ ๋ชจ๋ฒ” ์‚ฌ๋ก€
  3. @RestController ์™€ @RequestMapping ์‚ฌ์šฉ๋ฒ•
  4. Spring Boot๋กœ JSON๊ณผ XML ์‘๋‹ต ์ฒ˜๋ฆฌํ•˜๊ธฐ
  5. ํŠธ๋ Œ๋“œ์™€ REST API ํ™œ์šฉ์˜ ์ค‘์š”์„ฑ

 


 

1. RESTful API๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

REST(Representational State Transfer) ๋Š” ์›น ๋ฆฌ์†Œ์Šค์™€ ํด๋ผ์ด์–ธํŠธ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•˜๊ธฐ ์œ„ํ•œ ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ์ž…๋‹ˆ๋‹ค. RESTful API๋Š” ์ด๋Ÿฌํ•œ ์›์น™์— ๋”ฐ๋ผ ์„ค๊ณ„๋œ API๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

RESTful API์˜ ์ฃผ์š” ํŠน์ง•

  • ๋ฌด์ƒํƒœ(Stateless) : ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š์Œ
  • ํ‘œ์ค€ HTTP ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ : GET, POST, PUT, DELETE ๋“ฑ
  • URL๋กœ ๋ฆฌ์†Œ์Šค ์‹๋ณ„ : API ์—”๋“œํฌ์ธํŠธ๋Š” ๋ฆฌ์†Œ์Šค์˜ ๊ฒฝ๋กœ๋ฅผ ๋‚˜ํƒ€๋ƒ„
  • ๋‹ค์–‘ํ•œ ํฌ๋งท ์ง€์› : JSON, XML ๋“ฑ์œผ๋กœ ๋ฐ์ดํ„ฐ ์ฃผ๊ณ ๋ฐ›๊ธฐ

RESTful API๋Š” ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๊ตํ™˜ ์— ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋„ ํ•„์ˆ˜์ ์ธ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

 


 

2. RESTful API ์„ค๊ณ„ ์›์น™๊ณผ ๋ชจ๋ฒ” ์‚ฌ๋ก€

REST API๋ฅผ ์ž˜ ์„ค๊ณ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ชจ๋ฒ” ์‚ฌ๋ก€ ๋ฅผ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์›์น™ ์„ค๋ช… ์˜ˆ์‹œ
๋ฆฌ์†Œ์Šค ์ง€ํ–ฅ์  URL ์—”๋“œํฌ์ธํŠธ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋ช…์‚ฌ๋กœ ์„ค๊ณ„ /users , /orders
HTTP ๋ฉ”์„œ๋“œ ์ค€์ˆ˜ GET, POST, PUT, DELETE๋ฅผ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์‚ฌ์šฉ GET: ์กฐํšŒ, POST: ์ƒ์„ฑ, PUT: ์ˆ˜์ •, DELETE: ์‚ญ์ œ
์ƒํƒœ ์ฝ”๋“œ๋ฅผ ํ™œ์šฉ ์‘๋‹ต์— ์ ์ ˆํ•œ HTTP ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ํฌํ•จ 200: ์„ฑ๊ณต, 404: ๋ฆฌ์†Œ์Šค ์—†์Œ, 500: ์„œ๋ฒ„ ์˜ค๋ฅ˜
JSON ์‚ฌ์šฉ ๊ถŒ์žฅ ๋ฐ์ดํ„ฐ ํฌ๋งท์œผ๋กœ ์ฃผ๋กœ JSON ์‚ฌ์šฉ { "id": 1, "name": "ํ™๊ธธ๋™" }
URI๋Š” ๋ช…ํ™•ํ•˜๊ฒŒ ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ตœ์†Œํ™”, ํ•„์ˆ˜ ๋ฐ์ดํ„ฐ๋Š” ๊ฒฝ๋กœ์— ํฌํ•จ /users/123/orders




 

3. @RestController ์™€ @RequestMapping ์‚ฌ์šฉ๋ฒ•

Spring Boot์—์„œ๋Š” @RestController ์™€ @RequestMapping ์• ๋„ˆํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด RESTful API๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ: ์‚ฌ์šฉ์ž ์ •๋ณด API

package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
public class UserController {

    private Map<Integer, String> users = new HashMap<>();

    // ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ (GET)
    @GetMapping("/users/{id}")
    public String getUser(@PathVariable Integer id) {
        return users.getOrDefault(id, "์‚ฌ์šฉ์ž๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.");
    }

    // ์‚ฌ์šฉ์ž ์ƒ์„ฑ (POST)
    @PostMapping("/users")
    public String addUser(@RequestBody Map<String, String> user) {
        int id = users.size() + 1;
        users.put(id, user.get("name"));
        return "์‚ฌ์šฉ์ž " + user.get("name") + "์ด(๊ฐ€) ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.";
    }
}

์ฝ”๋“œ ์„ค๋ช…

  1. @RestController : REST API์˜ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  2. @GetMapping : /users/{id} ๊ฒฝ๋กœ๋กœ GET ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  3. @PostMapping : /users ๊ฒฝ๋กœ๋กœ POST ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  4. @PathVariable : URL ๊ฒฝ๋กœ์˜ ๋ณ€์ˆ˜๋ฅผ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.
  5. @RequestBody : ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ณด๋‚ธ JSON ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 


 

4. Spring Boot๋กœ JSON๊ณผ XML ์‘๋‹ต ์ฒ˜๋ฆฌํ•˜๊ธฐ

Spring Boot๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ JSON ํฌ๋งท ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ XML ์‘๋‹ต ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋„ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JSON ์‘๋‹ต ์˜ˆ์ œ

{
    "id": 1,
    "name": "ํ™๊ธธ๋™"
}

XML ์‘๋‹ต ์„ค์ •

pom.xml ํŒŒ์ผ์— Jackson XML ์˜์กด์„ฑ ์„ ์ถ”๊ฐ€ํ•˜๋ฉด XML ์‘๋‹ต๋„ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
</dependency>

์ปจํŠธ๋กค๋Ÿฌ์—์„œ XML ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@GetMapping(value = "/user/{id}", produces = "application/xml")
public User getUserAsXml(@PathVariable Integer id) {
    return new User(id, "ํ™๊ธธ๋™");
}

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” /user/{id} ๊ฒฝ๋กœ์—์„œ XML ํ˜•์‹์œผ๋กœ ์‘๋‹ต์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 


 

5. ํŠธ๋ Œ๋“œ์™€ REST API ํ™œ์šฉ์˜ ์ค‘์š”์„ฑ

  • REST API ๋Š” ์›น๊ณผ ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๊ตํ™˜ ํ‘œ์ค€์œผ๋กœ ์ž๋ฆฌ ์žก์•˜์Šต๋‹ˆ๋‹ค.
  • Statista ์— ๋”ฐ๋ฅด๋ฉด, 2024๋…„๊นŒ์ง€ ์ „ ์„ธ๊ณ„ API ์‚ฌ์šฉ๋Ÿ‰์€ ๋งค๋…„ 30% ์ด์ƒ ์ฆ๊ฐ€ ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.
  • ๊ตญ๋‚ด ๋Œ€๊ธฐ์—…๋“ค๋„ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜ ๋ฅผ ๋„์ž…ํ•˜๋ฉฐ RESTful API๋ฅผ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

RESTful API๋Š” ๋น ๋ฅด๊ณ  ์œ ์—ฐํ•œ ์‹œ์Šคํ…œ ๊ตฌ์ถ•์˜ ํ•„์ˆ˜ ๋„๊ตฌ์ด๋ฉฐ, Spring Boot ๋Š” ์ด๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ์ตœ๊ณ ์˜ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.

 


 

๊ด€๋ จ ๋งํฌ


Spring ๊ณต์‹ ๋ฌธ์„œ๐Ÿ‘†

RESTful API ์„ค๊ณ„ ๊ฐ€์ด๋“œ๐Ÿ‘†

JSON vs XML: ์–ด๋Š ๊ฒƒ์„ ์‚ฌ์šฉํ• ๊นŒ?๐Ÿ‘†

Spring Boot GitHub๐Ÿ‘†

Spring Initializr๋กœ ๋น ๋ฅด๊ฒŒ ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ํ•˜๊ธฐ๐Ÿ‘†

HTTP ์ƒํƒœ ์ฝ”๋“œ ์ •๋ฆฌ๐Ÿ‘†




FAQ

 

1. REST API์™€ SOAP API์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

  • REST API๋Š” ๊ฒฝ๋Ÿ‰ํ™”๋œ ๋ฐ์ดํ„ฐ ์ „์†ก์— ์œ ๋ฆฌํ•˜๊ณ , SOAP API๋Š” ๋ณด์•ˆ๊ณผ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์— ๊ฐ•์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

2. JSON๊ณผ XML ์ค‘ ๋ฌด์—‡์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋‚˜์š”?

  • ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ JSON ์„ ๊ถŒ์žฅํ•˜์ง€๋งŒ, XML์ด ํ•„์š”ํ•œ ํŠน์ • ์‹œ์Šคํ…œ์—์„œ๋Š” XML์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

3. Spring Boot์—์„œ ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

  • ๋„ค, ResponseEntity ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‘๋‹ต ๋ณธ๋ฌธ๊ณผ ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. Spring Boot์—์„œ REST API ํ…Œ์ŠคํŠธ๋Š” ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์š”?

  • MockMvc ์™€ @SpringBootTest ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด REST API๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

5. HTTP ์ƒํƒœ ์ฝ”๋“œ ์‚ฌ์šฉ์ด ์ค‘์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

  • ํด๋ผ์ด์–ธํŠธ๋Š” ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์š”์ฒญ์˜ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 


 

๋งˆ๋ฌด๋ฆฌ

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” Spring Boot๋ฅผ ์‚ฌ์šฉํ•œ RESTful API ๊ฐœ๋ฐœ ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. RESTful API๋Š” ํ˜„๋Œ€ ์›น ๊ฐœ๋ฐœ์˜ ํ•„์ˆ˜ ์š”์†Œ์ด๋ฉฐ, Spring Boot๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฅผ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ๊ตฌ์ถ• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ์ด ํฌ์ŠคํŒ…์„ ๋ฐ”ํƒ•์œผ๋กœ ์ง์ ‘ RESTful API๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ณ , ๋” ๋‚˜์•„๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๋™ํ•˜๊ฑฐ๋‚˜ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•ด๋ณด์„ธ์š”. RESTful API์˜ ๊ธฐ๋ณธ์„ ํƒ„ํƒ„ํžˆ ๋‹ค์ง€๋ฉด ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์™€ ๊ฐ™์€ ๊ณ ๊ธ‰ ๊ธฐ์ˆ ๋กœ ํ™•์žฅํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค!

๋Œ“๊ธ€