Spring Boot๋ก RESTful API ๊ฐ๋ฐ: ์ฝ๊ณ ํจ์จ์ ์ธ API ์ค๊ณ ๋ฐฉ๋ฒ
RESTful API ๋ ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์
๊ฐ๋ฐ์์ ํ์์ ์ธ ๊ตฌ์ฑ ์์์
๋๋ค. Spring Boot ๋ ๋น ๋ฅด๊ณ ๊ฐ๋จํ๊ฒ REST API๋ฅผ ๊ตฌ์ถํ ์ ์๋๋ก ๋ค์ํ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ํฌ์คํ
์์๋ RESTful API ์ค๊ณ ์์น ,
@RestController
์
@RequestMapping
์ฌ์ฉ๋ฒ , ๊ทธ๋ฆฌ๊ณ JSON ๋ฐ XML ์๋ต ์ฒ๋ฆฌ ๋ฐฉ๋ฒ ์ ์์ธํ ๋ค๋ค๋ณด๊ฒ ์ต๋๋ค.
๋ชฉ์ฐจ
- RESTful API๋ ๋ฌด์์ธ๊ฐ?
- RESTful API ์ค๊ณ ์์น๊ณผ ๋ชจ๋ฒ ์ฌ๋ก
-
@RestController
์@RequestMapping
์ฌ์ฉ๋ฒ - Spring Boot๋ก JSON๊ณผ XML ์๋ต ์ฒ๋ฆฌํ๊ธฐ
- ํธ๋ ๋์ 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") + "์ด(๊ฐ) ์ถ๊ฐ๋์์ต๋๋ค.";
}
}
์ฝ๋ ์ค๋ช
-
@RestController
: REST API์ ์๋ํฌ์ธํธ๋ฅผ ์ ๊ณตํ๋ ํด๋์ค์ ์ฌ์ฉํฉ๋๋ค. -
@GetMapping
:/users/{id}
๊ฒฝ๋ก๋ก GET ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ฐํํฉ๋๋ค. -
@PostMapping
:/users
๊ฒฝ๋ก๋ก POST ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์๋ก์ด ์ฌ์ฉ์๋ฅผ ์ถ๊ฐํฉ๋๋ค. -
@PathVariable
: URL ๊ฒฝ๋ก์ ๋ณ์๋ฅผ ๋งคํํฉ๋๋ค. -
@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 ๋ ์ด๋ฅผ ๊ฐ๋จํ๊ฒ ๊ฐ๋ฐํ ์ ์๋๋ก ๋๋ ์ต๊ณ ์ ํ๋ ์์ํฌ์ ๋๋ค.
๊ด๋ จ ๋งํฌ
RESTful API ์ค๊ณ ๊ฐ์ด๋๐
JSON vs XML: ์ด๋ ๊ฒ์ ์ฌ์ฉํ ๊น?๐
Spring Initializr๋ก ๋น ๋ฅด๊ฒ ํ๋ก์ ํธ ์์ํ๊ธฐ๐
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์ ๊ธฐ๋ณธ์ ํํํ ๋ค์ง๋ฉด ๋ง์ดํฌ๋ก์๋น์ค ์ ๊ฐ์ ๊ณ ๊ธ ๊ธฐ์ ๋ก ํ์ฅํ๋ ๋ฐ ํฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค!
๋๊ธ