API๋ "Application Programming Interface"์ ์ฝ์๋ก, ์๋ก ๋ค๋ฅธ ๋ ํ๋ก๊ทธ๋จ์ด ์๋ก ๋ํํ ์ ์๊ฒ ํด์ฃผ๋ ์ธ์ด์ด์ ๋ช ์ธ์

์น API๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ๋คํธ์ํฌ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํจ

GET /api/products/1 HTTP/1.1
Host: example.com
Accept: application/json
์ฅ์
์น API๋ ํน์ OS๋ ์ธ์ด์ ์์กดํ์ง ์๊ณ , ํ์คํ๋ HTTP ์์ฒญ๊ณผ JSON/XML ๋ฑ์ ํฌ๋งท๋ง ์งํค๋ฉด ์ด๋ค ํ๋ซํผ์์๋ ์ ๊ทผ์ด ๊ฐ๋ฅํจ
๋๊ท๋ชจ ์์คํ ์์๋ ๊ฐ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ ์ฌ๋ฌ ๊ฐ์ ๋ ๋ฆฝ์ ์ธ ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ์กด์ฌ
-> ์ด๋ค์ ๊ฐ์์ API๋ฅผ ํตํด ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ ๋์ํจ
ex) ์ฃผ๋ฌธ ์๋น์ค์ ์ํ ์๋น์ค๊ฐ ๋ถ๋ฆฌ๋์ด ์์
[์ฃผ๋ฌธ ์๋น์ค] --(HTTP API)--> [์ํ ์๋น์ค] --(HTTP API)--> [ํ์ ์๋น์ค]
๐ ๋ฌด์ํ์ฑ (Statelessness)
๐ ๋น์ฐ๊ฒฐ์ฑ (Connectionless)
SOAP(Simple Object Access Protocol)์ HTTP, SMTP ๋ฑ์ ํ๋กํ ์ฝ ์์์ XML ํ์์ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋ฐฉ์์ API ํต์ ํ๋กํ ์ฝ
-> ์ฃผ๋ก 2000๋ ๋ ์ด๋ฐ ์ํฐํ๋ผ์ด์ฆ ์์คํ ์์ ํ์ค์ผ๋ก ์๋ฆฌ์ก์ผ๋ฉฐ ๋๊ท๋ชจ ์์คํ ๊ฐ ์ฐ๋์ ์ฌ์ฉ๋จ
SOAP์ ์ฌ์ฉํ๊ฒ ๋ ์ด์
๐ ํ๋ซํผ๊ณผ ์ธ์ด์ ๋
๋ฆฝ์ ์ธ ํต์ ๊ท์ฝ์ด ํ์ํด์ก๊ธฐ ๋๋ฌธ
SOAP ๋ฉ์์ง๋ ํฌ๊ฒ Envelope, Header, Body ์ธ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ, ๊ฐ ์์๋ XML๋ก ๊ตฌ์ฑ๋์ด ์์ด ์๊ฒฉํ ๊ตฌ์กฐ์ ๋ช
ํํ ๋ช
์ธ๋ฅผ ๋ฐ๋ฆ
<soapenv:Envelope xmlns:soapenv="<http://schemas.xmlsoap.org/soap/envelope/>">
<soapenv:Header/>
<soapenv:Body>
<getUser>
<id>1</id>
</getUser>
</soapenv:Body>
</soapenv:Envelope>
Envelope : SOAP ๋ฉ์์ง์ ๋ฃจํธ ์์, ๋ชจ๋ ๋ฉ์์ง๋ ์ด ์์ ํฌํจ๋จHeader : ์ธ์ฆ, ํธ๋์ญ์
๋ฑ์ ๋ฉํ ์ ๋ณด๋ฅผ ๋ด๋ ๊ณต๊ฐ(์ ํ์ )Body : ์ค์ ํธ์ถํ๋ ค๋ ๋ฉ์๋ ์ ๋ณด์ ํ๋ผ๋ฏธํฐ๊ฐ ๋ค์ด๊ฐ๐ SOAP์ ์ฅ์
๐ SOAP์ ํ๊ณ
โ XML ๊ธฐ๋ฐ์ด๋ผ ๋ฉ์์ง๊ฐ ๋ฌด๊ฒ๊ณ ๋ณต์ก
โ ๊ตฌํ๊ณผ ๋๋ฒ๊น
๋์ด๋๊ฐ ๋์
โ ์น ํ๊ฒฝ(๋ธ๋ผ์ฐ์ , ๋ชจ๋ฐ์ผ)์ ๋ถ์ ํฉ
โ ๋จ์ํ CRUD ์์
์๋ ๊ณผํ ์ค๊ณ
๐ โ์์ ์ ์ด์ง๋ง ๋๋ฌด ๋ฌด๊ฒ๋คโ๋ ํ๊ฐ๋ฅผ ๋ฐ๊ฒ ๋จ
REST(Representational State Transfer)๋ 2000๋ ์ Roy Fielding์ด ์ ์ํ ์น ์๋น์ค ๊ตฌ์กฐ์ ์ด๋ฆ์ผ๋ก, ๊ฐ๋จํ ๊ตฌ์กฐ๋ก ๋์์ ์ฃผ๋ API ์คํฌ์ ํฉ๋ฆฌ์ ์ผ๋ก ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ธ ์์คํ ์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋จ
๐ REST๋ ํ๋กํ ์ฝ์ด ์๋๋ผ ์ํคํ ์ฒ ์คํ์ผ

๐ ์น, ๋ชจ๋ฐ์ผ ์๋์๋ REST๊ฐ ํจ์ฌ ํจ์จ์ ์ด์๊ธฐ ๋๋ฌธ์ ๋๋ถ๋ถ์ ์น API๊ฐ REST ๊ธฐ๋ฐ์ผ๋ก ์ ํ๋์์
๐ REST์ ์ฅ์
๐ REST์ ๋จ์
@Restcontroller=@Controller+@ResponseBody
Spring MVC์์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋@Controller๋ ์์ฒญ์ ๋ํด HTML View ํ ํ๋ฆฟ์ ๋ฐํํ๋๋ฐ ์ฌ์ฉ๋จ. But REST API ๊ฐ๋ฐ์์๋ JSON, XML, ํ์ผ ๋ฑ ์ค์ ๋ฐ์ดํฐ ์์ฒด๋ฅผ ๋ฐํํด์ผ ํ๋ฏ๋ก@RestController์ฌ์ฉ
@RestController
public class HelloRestController {
@GetMapping("/hello")
public String hello() {
return "Hello, JSON!"; // View๊ฐ ์๋ HTTP ๋ณธ๋ฌธ์ ๊ทธ๋๋ก ์๋ต๋จ
}
}
@RestController๋ ํด๋์ค ๋จ์์ ์ ์ฉ๋๋ฉฐ, ๋ด๋ถ ๋ชจ๋ ๋ฉ์๋๋ @ResponseBody ํจ๊ณผ๋ฅผ ๊ฐ์งapplication/json์ด๋ฉฐ, Accept ํค๋๋ก ๋ช
์ ๊ฐ๋ฅPOST /api/users
Content-Type: application/json
DispatcerServlet์ด ๋ฐ์์ ์ฒ๋ฆฌํจDispatcherServlet์ HandlerMapping๋ค์๊ฒ ์์ฒญ์ ์์ํจ@ResquestMapping, @GetMapping ๋ฑ์ ์ ๋ณด@PostMapping("/api/users")
public UserResponse create(@RequestBody UserRequest request)
public UserResponse create(
@RequestBody UserRequest request
)
๐ ์ญํ
@RequestBody, @ResponseBody ์ฒ๋ฆฌ์ ํต์ฌ ์ปดํฌ๋ํธ๐ ๋์ ๊ณผ์
MappingJackson2HttpMessageConverter)UserRequest ๊ฐ์ฒด๋ก ์ญ์ง๋ ฌํJSON
{
"name": "kim",
"age": 25
}
Java
new UserRequest("kim", 25)
UserResponse response = userService.create(request);
์ปจํธ๋กค๋ฌ๊ฐ ๊ฐ์ฒด๋ฅผ ๋ฐํ
@RestController์ ์๋ฏธ
@Controller + @ResponseBody
๋ฐํ๊ฐ์ View๊ฐ ์๋๋ผ HTTP Body๋ก ์ฒ๋ฆฌ
๋ค์ HTTP Message Converter๊ฐ ๋์
Java ๊ฐ์ฒด -> HTTP Response Body
๐ ๋์ ๊ณผ์
Accept ํค๋ ํ์ธ (์: application/json)UserResponse -> JSON ์ง๋ ฌํDispatcherServlet ์ด๋ฅผ ํฌํจํ ์๋ต์ ์์ฑ
Spring Boot์์ @RestController ์์ฒญ์ DispatcherServlet์ ์ค์ฌ์ผ๋ก HandlerMapping๊ณผ HandlerAdapter๋ฅผ ๊ฑฐ์ณ ์ฒ๋ฆฌ๋๋ฉฐ, HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ๋ ์ปจํธ๋กค๋ฌ ํธ์ถ ์ ์๋ ์์ฒญ ๋ฐ๋๋ฅผ ์๋ฐ ๊ฐ์ฒด๋ก ๋ณํํ๊ณ , ํธ์ถ ํ์๋ ๋ฐํ ๊ฐ์ฒด๋ฅผ HTTP ์๋ต ๋ฐ๋๋ก ์ง๋ ฌํํ๋ ์ญํ ์ ์ํํจ