REST API
๋จผ์ REST๋ 'Representational State Transfer'์ ์ฝ์๋ก, ์๋ ์์ด๋ ์น(WWW)๊ณผ ๊ฐ์ ๋ถ์ฐ ํ์ดํผ๋ฏธ๋์ด ์์คํ ์ํคํ ์ฒ์ ํ ํ์ ์ ๋๋ค. ์ฃผ๊ณ ๋ฐ๋ ์์(Resource)์ ์ด๋ฆ์ ๊ท์ ํ๊ณ URI์ ๋ช ์ํด HTTP๋ฉ์๋(GET, POST, PUT, DELETE)๋ฅผ ํตํด ํด๋น ์์์ ์ํ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ฒ์ ์๋ฏธ ํฉ๋๋ค.
REST API๋ REST์ํคํ ์ฒ๋ฅผ ๋ฐ๋ฅด๋ ์์คํ /์ ํ๋ฆฌ์ผ์ด์ ์ธํฐํ์ด์ค๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค. REST ์ํคํ ์ฒ๋ฅผ ๊ตฌํํ๋ ์น ์๋น์ค๋ฅผ 'RESTfulํ๋ค'๋ผ๊ณ ํํํฉ๋๋ค.
REST์ ํน์ง
์ ๋ํผ ์ธํฐํ์ด์ค
์ ๋ํผ ์ธํฐํ์ด์ค๋ ์ผ๊ด๋ ์ธํฐํ์ด์ค๋ฅผ ์๋ฏธ ํฉ๋๋ค. ์ฆ, REST ์๋ฒ๋ HTTP ํ์ค ์ ์ก ๊ท์ฝ์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์ ์ด๋ค ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ๋ง๋ค์ด์ก๋๋์ ์๊ด์์ด ํ๋ซํผ ๋ฐ ๊ธฐ์ ์ ์ข ์๋์ง ์๊ณ ๋ค ํธํํ์ฌ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธ ํฉ๋๋ค.
๋ฌด์ํ์ฑ(Stateless)
๋ฌด์ํ์ฑ์ด๋ ์๋ฒ์ ์ํ ์ ๋ณด๋ฅผ ๋ฐ๋ก ๋ณด๊ดํ๊ฑฐ๋ ๊ด๋ฆฌํ์ง ์๋๋ค๋ ์๋ฏธ ์ ๋๋ค.
์๋ฒ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ ์์ฒญ์ ๋ํด ์ธ์ ์ด๋ ์ฟ ํค ์ ๋ณด๋ฅผ ๋ณ๋ ๋ณด๊ดํ์ง ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํ ํด๋ผ์ด์ธํธ๊ฐ ์ฌ๋ฌ ์์ฒญ์ ๋ณด๋ด๋ ์ฌ๋ฌ ํด๋ผ์ด์ธํธ๊ฐ ํ๋์ ์์ฒญ์ ๋ณด๋ด๋ ๊ฐ๋ณ์ ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. ๋ฐ๋ผ์, ๋น์ฆ๋์ค ๋ก์ง์ ์์ ๋๊ฐ ๋๊ณ ์ค๊ณ๊ฐ ๋จ์ํฉ๋๋ค.
์บ์
REST๋ HTTP ํ์ค์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ฏ๋ก HTTP์ ์บ์ฑ ๊ธฐ๋ฅ์ ์ ์ฉํ ์ ์์ต๋๋ค.
๋ ์ด์ด ์์คํ
REST ์๋ฒ๋ ๋คํธ์ํฌ ์์ ์ฌ๋ฌ ๊ณ์ธต์ผ๋ก ๊ตฌ์ฑ๋ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์๋ฒ์ ๋ณต์ก๋์ ๊ด๊ณ์์ด ํด๋ผ์ด์ธํธ๋ ์๋ฒ์ ์ฐ๊ฒฐ๋๋ ํฌ์ธํธ๋ง ์๋ฉด ๋ฉ๋๋ค.
ํด๋ผ์ด์ธํธ-์๋ฒ ์ํคํ ์ฒ
REST ์๋ฒ๋ API๋ฅผ ์ ๊ณตํ๊ณ ํด๋ผ์ด์ธํธ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ๋ ๊ตฌ์กฐ๋ก ๋ถ๋ฆฌํด ์ค๊ณํฉ๋๋ค.
์ด ๊ตฌ์ฑ์ ์๋ก์ ๋ํ ์์กด์ฑ์ ๋ฎ์ถ๋ ๊ธฐ๋ฅ์ ํฉ๋๋ค.
โญ๏ธREST์ URI ์ค๊ณ ๊ท์น
URI๋ ํน์ ๋ฆฌ์์ค๋ฅผ ์๋ณํ ์ ์๋ ์๋ณ์๋ฅผ ์๋ฏธํฉ๋๋ค.
- URI์ ๋ง์ง๋ง์๋ '/'๋ฅผ ํฌํจํ์ง ์์ต๋๋ค.
- ์ธ๋๋ฐ ๋์ ํ์ดํ(-)์ ์ฌ์ฉ
- ํ์(๋์ฌ)๊ฐ ์๋ ๊ฒฐ๊ณผ(๋ช ์ฌ)๋ฅผ ํฌํจ
- ์๋ฌธ์๋ก ์์ฑ
- ํ์ผ์ ํ์ฅ์๋ ํฌํจํ์ง ์์
@RequestMapping์ผ๋ก ๊ตฌํ
@RestController
@RequestMapping("api/v1/get-api")
public class GetController {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String getHello() {
return "Hello world";
}
}
๋งค๊ฐ๋ณ์๊ฐ ์๋ GET ๋ฉ์๋ ๊ตฌํ
@RestController
@RequestMapping("api/v1/get-api")
public class GetController {
@GetMapping(value ="/name")
public String getHello() {
return "Get : ๊ณฐ๋์ด์ฌ์ก์ฌ";
}
}
@PathVariable์ ํ์ฉํ GET ๋ฉ์๋ ๊ตฌํ
@GetMapping(value = "/variable1/{variable}")
public String getVariable1(@PathVariable String variable) {
return variable;
}
@GetMapping(value = "/variable2/{variable}")
public String getVariable2(@PathVariable("variable") String var) {
return var;
}
@RequestParam์ ํ์ฉํ GET ๋ฉ์๋ ๊ตฌํ
// http://localhost:8113/api/v1/get-api/request1?name=ddd&email=ddd2024@gmail.com&organization=kh
@GetMapping(value = "/request1")
public String getRequestParam(
@RequestParam String name,
@RequestParam String email,
@RequestParam String organization) {
return name + " " + email + " " + organization;
}
@RestController์ @GetMapping์ ์ฌ์ฉํ JSON
package com.springboot.hello.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
public class TestJsonController {
@GetMapping("/members")
// @ResponseBody : @RestController ์ด๋
ธํ
์ด์
์ด ์์ผ๋ฉด ํด๋น ์ด๋
ธํ
์ด์
์ ๋ช
์ ํ์ง ์์๋ ๋๋ค.
public List<Map<String, Object>> findMembers() {
List<Map<String, Object>> members = new ArrayList<>();
for(int i = 1; i <= 20; i++) {
Map<String, Object> member = new HashMap<>();
member.put("id", i);
member.put("name", i + "๋ฒ ๊ฐ๋ฐ์");
member.put("age", 10+ i);
members.add(member);
}
return members;
}
}
@RestController
public class MemberController {
@GetMapping("/memberVO")
public MemberVO member() {
MemberVO vo = new MemberVO();
vo.setId("ddd2024");
vo.setPwd("!@#$df0");
vo.setName("ํ๊ธธ๋");
vo.setEmail("ddd2024@gmail.net");
return vo;
}
}
@GetMapping("/memberList")
public List<MemberVO> listMember() {
List<MemberVO> list = new ArrayList<>();
for(int i = 0; i < 10; i ++) {
MemberVO vo = new MemberVO();
vo.setId("ddd" + i);
vo.setPwd("@#$#df" + i);
vo.setName("ํ๊ธธ๋" + i);
vo.setEmail("ddd" + i + "@gmail.com");
list.add(vo);
}
return list;
}
@ResponseEntry ์ฌ์ฉํด์ ์๋ตํ๊ธฐ
@GetMapping("/membersList2")
public ResponseEntity<List<MemberVO>> listMember2() {
List<MemberVO> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
MemberVO vo = new MemberVO();
vo.setId("ddd");
vo.setPwd("@$%#@df");
vo.setName("ํ๊ธธ๋");
vo.setEmail("ddd@gmail.com");
list.add(vo);
}
return new ResponseEntity(list, HttpStatus.INTERNAL_SERVER_ERROR);
}
POST API ๋ง๋ค๊ธฐ
@RequestMapping์ผ๋ก ๊ตฌํํ๊ธฐ
@RestController
@RequestMapping("/api/v1/post-api")
public class PostController {
@RequestMapping(value = "/domain", method = RequestMethod.POST)
public String postExample() {
return "Hello Post API";
}
}
@RequestBody๋ฅผ ํ์ฉํ POST ๋ฉ์๋ ๊ตฌํ
@PostMapping(value = "/member")
public String postMember(@RequestBody Map<String, Object> postData) {
StringBuilder sb = new StringBuilder();
postData.entrySet().forEach(map -> {
sb.append(map.getKey() + " : " + map.getValue() + "\n");
});
return sb.toString();
}
@ResponseEntity ์ฌ์ฉํด์ ์๋ต
@GetMapping("/GetMemberParam")
public ResponseEntity <List<MemberVO>> memberList(@RequestParam String cmd) {
if(cmd.equals("MemberList")) {
MemberDAO dao = new MemberDAO();
List<MemberVO> list = dao.memberSelect();
return new ResponseEntity<>(list, HttpStatus.OK);
} else {
return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST);
}
}
'๐๏ธ Backend > Spring Boot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring Boot - 1. ์ฃผ์ ๊ฐ๋ (์ ์ด ์ญ์ , ์์กด์ฑ ์ฃผ์ , ์ด๋ ธํ ์ด์ ) (0) | 2023.06.07 |
---|---|
Spring Boot ๋ค์ด๊ฐ๊ธฐ ์ Java์์ ํต์ฌ์ ์ผ๋ก ์์์ผ ํ ๊ฐ๋ ์ ๋ฆฌ (0) | 2023.06.05 |