#2 HTTP API ์์ฒญ ๋งคํ, ํค๋ ์กฐํ
by JiwonDev์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๋ API ๊ท์น์ ๋ง๋ค๊ธฐ ๋๋ฆ์ด๊ฒ ์ง๋ง, ๋ณดํต์ REST API๋ฅผ ๋ง์ด ๊ตฌํํ๋ค.
# RESTful API๋?
REpresentational State Transfer '๋ํ์ ์ธ ์ํ ์ ๋ฌ'
REST๋ ์น์ ์กด์ฌํ๋ ๋ชจ๋ ์์์ ๊ณ ์ ํ URI๋ฅผ ๋ถ์ฌํด์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋งํ๋ค.
RESTful API๋ HTTP ๋ฉ์๋๋ฅผ RESTํ๊ฒ ์ฌ์ฉํ๋ ์ํคํ ์ณ ์คํ์ผ์ด๋ค. ๊ธฐ์กด์ ๋ฉ์๋๋ค (Post, Get, Put, Delete)๋ฅผ ์ฉ๋์ ๋ฐ๋ผ ๋๋๊ณ ํด๋น ์์์ ๋ํ CRUD๋ฅผ ์ ์ฉ์ํค๋ ๋ฐฉ๋ฒ์ด๋ค.
- ์์(Resource) : URI๋ก ํํ, ๋ชจ๋ ์์์๋ ๊ณ ์ ํ ID๊ฐ ์กด์ฌํ๋ค.
- ํ์(Verb) : HTTP Method ์ฌ์ฉ, GET, POST๋ฑ์ผ๋ก ์๋ฒ์ ํด๋น ์์์ ๋ํ ์กฐ์์ ์์ฒญํ๋ค.
- ํํ : REST์์ ์์์ json, xml, text, rss๋ฑ ์ฌ๋ฌ ํํ๋ก ํํํ์ฌ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ค.
์ฅ์ | - HTTP ์ธํ๋ผ๋ฅผ ๊ทธ๋๋ก ํ์ฉํ๋ค. - ์ฆ HTTP๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ํ๋ซํผ์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. - REST ๋ฉ์์ง๊ฐ ์ง๊ด์ ์ด๋ผ ์ฝ๊ณ ์ฌ์ฉํ๊ธฐ ์ฝ๋ค. - ์๋ฒ์ ํด๋ผ์ด์ธํธ์ ์ญํ ์ ๋ช ํํ๊ฒ ๋ถ๋ฆฌํ ์ ์๋ค. |
๋จ์ | - ํ์ค์ด ์กด์ฌํ์ง ์๋๋ค. ๊ฐ์ ํ ์ ์๋ค. - ์ฌ์ฉํ ์ ์๋ ๋ฉ์๋๊ฐ 4๊ฐ ๋ฐ์ ์๋ค. |
@ REST์ ํน์ง
- Uniform Interface (์ธํฐํ์ด์ค ์ผ๊ด์ฑ)
- URI๋ก ์ง์ ํ ๋ฆฌ์์ค์ ๋ํ ์กฐ์์ด ํต์ผ๋๊ณ , ์์ฒญ ๋ฉ์์ง๋ง์ผ๋ก ์๋ฏธ๋ฅผ ํ์ ํ ์ ์๋ค.
-ํน์ ์ธ์ด๋ ๊ธฐ์ ์ ์ข ์๋์ง์๋๋ค. HTTP๋ฅผ ์ด์ฉํ์ฌ ๋ชจ๋ ํ๋ซํผ์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. - ๋ช
ํํ ์๋ฒ-ํด๋ผ์ด์ธํธ ๊ตฌ์กฐ
- ์์์ด ์๋ ์ชฝ์ด Server, ์์์ ์์ฒญํ๋ ์ชฝ์ด Client๊ฐ ๋๋ค.
- Server: API๋ฅผ ์ ๊ณตํ๊ณ ๋น์ฆ๋์ค ๋ก์ง ์ฒ๋ฆฌ ๋ฐ ์ ์ฅ์ ์ฑ ์์ง๋ค.
- Client: ์ฌ์ฉ์ ์ธ์ฆ์ด๋ context(์ธ์ , ๋ก๊ทธ์ธ ์ ๋ณด) ๋ฑ์ ์ง์ ๊ด๋ฆฌํ๊ณ ์ฑ ์์ง๋ค. - Stateless (๋ฌด์ํ)
- HTTP ์์ฒด๊ฐ ๋ฌด์ํ์ฑ์ ๊ฐ๊ธฐ๋ ํ๊ณ , ํด๋ผ์ด์ธํธ์ ์ํ๋ฅผ URI๋ก ๋ฐ๊ธฐ ๋๋ฌธ์ ์๋ฒ์ ์ ์ฅํ ํ์๊ฐ ์๋ค.
- ์ฆ ์๋ฒ๋ ๊ฐ๊ฐ์ ์์ฒญ์ ๋ณ๊ฐ์ ๊ฒ์ผ๋ก ์ธ์ํ๊ณ ์ฒ๋ฆฌํ๋ค. - Cacheable (์บ์ ๊ฐ๋ฅ)
๋ฌด์ํ์ฑ ๋๋ถ์ ํธ๋์ญ์ ์ด ๋ฐ์ํ์ง ์๊ณ , ๋๋์ ์์ฒญ์ ํจ์จ์ ์ผ๋ก ์บ์ํ์ฌ ์ฑ๋ฅ์ ํฅ์ ์ํฌ ์ ์๋ค. - Layered System (๊ณ์ธตํ)
REST Server๋ฅผ ๋ค์ค ๊ณ์ธต์ผ๋ก ๊ตฌ์ฑํ๊ธฐ ์ฝ๋ค.
- API ์๋ฒ๋ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๊ณ , ๊ทธ ์ ๋จ์ ํ๋ก์, ๋ณด์, ๋ก๋๋ฐธ๋ฐ์ฑ, ์ํธํ๋ฑ์ ์ถ๊ฐํ๊ธฐ ์ฝ๋ค.
- ์ฆ ํ์ฅ์ฑ์ด ๋ฐ์ด๋๋ค.
# API ์์ฒญ ๋งคํํ๊ธฐ
ํ์ ๊ด๋ฆฌ API๋ก ์๋ฅผ ๋ค๋ฉด ์๋์ ๊ฐ๋ค. ์ด๋ฅผ ์คํ๋ง MVC๋ก ๋งคํํด๋ณด์.
- ํ์ ๋ชฉ๋ก ์กฐํ: GET /users
- ํ์ ๋ฑ๋ก: POST /users
- ํ์ ์กฐํ: GET /users/{userId}
- ํ์ ์์ : PATCH /users/{userId}
- ํ์ ์ญ์ : DELETE /users/{userId}
@RestController
@RequestMapping("/mapping/users")
public class MappingClassController {
/**
* GET /mapping/users
*/
@GetMapping
public String users() {
return "get users";
}
/**
* POST /mapping/users
*/
@PostMapping
public String addUser() {
return "post user";
}
/**
* GET /mapping/users/{userId}
*/
@GetMapping("/{userId}")
public String findUser(@PathVariable String userId) {
return "get userId=" + userId;
}
/**
* PATCH /mapping/users/{userId}
*/
@PatchMapping("/{userId}")
public String updateUser(@PathVariable String userId) {
return "update userId=" + userId;
}
/**
* DELETE /mapping/users/{userId}
*/
@DeleteMapping("/{userId}")
public String deleteUser(@PathVariable String userId) {
return "delete userId=" + userId;
}
}
# HTTP ํค๋ ์กฐํ
mapping๋ ๋ฉ์๋๋ ํ์ํ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ณจ๋ผ์ ์ฌ์ฉํ ์ ์๋ค.
์๋ฐ ์ธํฐํ์ด์ค๋ก ์ ํด์ง ๊ฒ์ด ์๋๋ผ ์คํ๋ง ํ๋ ์์ํฌ์์ ์ ์ฐํ๊ฒ ์ฌ์ฉํ๋๋ก ๋ง๋ค์ด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค. ์ฐธ๊ณ ๋ก MultiValueMap์ Map๊ณผ ์ ์ฌํ๋ฐ, ํ๋์ key์ ์ฌ๋ฌ๊ฐ์ ๋ฐ์ ์ ์๋ ์๋ฐ ์ปฌ๋ ์ ์ด๋ค.
* ๋ก๊ทธ๊ฐ ํ์ํ๋ฉด @Slf4j์ ์ฌ์ฉํ์. ์ด๋ ๋กฌ๋ณต ํ๊ทธ์ธ๋ฐ, ์ฌ์ฉํ๋ฉด ์๋์ ๊ฐ์ด ์ ์ธํด์ค๋ค.
private static final org.slf4j.Logger log =
org.slf4j.LoggerFactory.getLogger(RequestHeaderController.class);
์ถ๊ฐ์ ์ผ๋ก ์ฌ์ฉํ @์ด๋ ธํ ์ด์
- @RequestHeader MultiValueMap headerMap : ๋ชจ๋ HTTP ํค๋๋ฅผ ๊ฐ์ ธ์จ๋ค.
- @RequestHeader("host") String Host : ํน์ HTTP ํค๋๋ฅผ ์ด๋ฆ์ผ๋ก ๊ฐ์ ธ์จ๋ค.
- @CookieValue("myCookie", required = false) : ํน์ ์ฟ ํค๋ฅผ ์กฐํ. required๋ ํ์ ๊ฐ ์ฌ๋ถ(์์ผ๋ฉด ์์ธ ๋ฐ์)
@Slf4j
@RestController
public class RequestHeaderController {
@RequestMapping("/headers")
public String headers(HttpServletRequest request,
HttpServletResponse response,
HttpMethod httpMethod,
Locale locale,
@RequestHeader MultiValueMap<String, String>
headerMap,
@RequestHeader("host") String host,
@CookieValue(value = "myCookie", required = false)
String cookie
) {
log.info("request ์ ๋ณด ={}", request);
log.info("response ์ ๋ณด ={}", response);
log.info("httpMethod ์ ๋ณด ={}", httpMethod);
log.info("locale ์ ๋ณด ={}", locale);
log.info("headerMap ์ ๋ณด ={}", headerMap);
log.info("header host ์ ๋ณด ={}", host);
log.info("myCookie ์ ๋ณด ={}", cookie);
return "ok";
}
}
'๐ฑ Spring Framework > Spring MVC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Thymeleaf#2 Spring๊ณผ HTML Form ์ฒ๋ฆฌ (0) | 2021.08.28 |
---|---|
Thymeleaf#1 ๊ธฐ๋ณธ๊ธฐ๋ฅ (0) | 2021.08.28 |
#1 HTTP ์์ฒญ ๋งคํ๊ณผ ๊ธฐ๋ณธ ๋ก๊น (0) | 2021.08.11 |
# HTTP ๋ฐ์ดํฐ ์ ์ก/์๋ต (0) | 2021.08.11 |
# Spring MVC๋ฅผ ๋ฐฐ์ฐ๊ธฐ ์ ์ (0) | 2021.08.11 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev