
REST, REST API, RESTful
📌 REST
REST(Reperesentational State Transfer)는 서버와 클라이언트 통신 방법 중 하나로, http URI를 통해 자원을 명시하고, http method(Get, Post, Put, Delete)를 이용하여 자원을 교환하는 통신방법이다.
(자원: 해당 소프트웨어가 관리하는 모든 것. 문서, 그림, 데이터, 해당 소프트웨어 자체 등)
장점
- http 프로토콜의 인프라를 그대로 사용하므로, REST API 사용을 위한 별도의 인프라를 구축할 필요가 없다.
- http 표준 프로토콜을 따르는 모든 플랫폼에서 사용 가능하다.
- 서버와 클라이언트의 역할을 명확하게 분리한다.
단점
- http method 형태가 제한적이다.
- 구형 브라우저(IE)에서는 호환이 되지 않아, 지원하지 못하는 동작이 많다.
📌 REST API
REST 아키텍처의 조건을 준수하는 API이다.
최근 openAPI(누구나 사용할 수 있도록 공개된 API), 마이크로 서비스 (하나의 큰 애플리케이션을 여러 개의 작은 애플리케이션으로 쪼개어 변경과 조합이 가능하도록 만든 아키텍처) 등을 제공하는 업체 대부분은 REST API를 제공한다.
API (Application Programming Interface)
데이터와 기능의 집합을 제공하여, 컴퓨터 프로그램 간 상호작용을 촉진하며 서로 정보를 교환 가능하도록 한다.
REST API 특징
- 사내 시스템들도 REST 기반으로 시스템을 분산해 확장성과 재사용성을 높여, 유지보수 및 운용을 편리하게 할 수 있다.
- REST는 HTTP 표준을 기반으로 구현하므로, HTTP를 지원하는 프로그램 언어로 클라이언트와 서버를 구축할 수 있다.
📌 RESTful
REST의 원리를 따르고, REST API 설계 규칙을 모두 지킨 시스템을 RESTful 하다고 한다.
폼 전송
📌 일반 폼 전송
GET
@GetMapping("url") : 해당 url에 대하여 Get 요청받았을 때 실행되도록 어노테이션
@RequestParam: query(?key=value 형태)로 전달된 값을 받는다.
- key의 이름으로 값을 받아온다.
- required = true가 기본값이다. false로 설정 시, 해당 query가 오지 않아도 접속이 가능하다.
@GetMapping("/get/response1")
public String getResponse(@ReqeustParam(value="name") String n, Model model){
// key의 위치에 "name"이 오면, 그 value를 String n으로 받겠다.
model.addAttribute("name", n);
return "response";
}
@GetMapping("/get/response2")
public String getResponse2(@RequestParam(value="name", required=false) String n, Model model) {
// required=false이므로 query가 오지 않아도 접속 가능하다.
model.addAttribute("name", n);
return "response";
}
@PathVariable: parameter로 전달된 값을 받는다.
- GetMapping 어노테이션에 전달받을 parameter을 표기해야 한다.
- parameter와 같은 이름으로 받아올 수 있고, 변경하여 받아올 수 도 있다.
@GetMapping("/get/response3/{name}/{age}")
public String getResponse3(@PathVariable String name, @PathVariable(value="age") String abc, Model model) {
model.addAttribute("name", name);
model.addAttribute("age", abc);
return "response";
}
※ GetMapping에 여러 url을 담아, 처리할 수 있다. (단, required=false 처리 주의)
@GetMapping("/get/response4/{name}", "/get/response4/{name}/{age}")
public String getResponse4(@PathVariable String name, @PathVariable(value="age", required=false), Model model) {
model.addAttribute("name", name);
model.addAttribute("age", abc);
return "response";
}
POST
@PostMapping: 해당 url에 대하여 Post 요청받았을 때 실행되도록 어노테이션
@RequestParam: 전달된 값을 받는다. (@RequestBody는 json 형태로 전달받았을 때 사용 가능하다.)
@ResponseBody: 템플릿을 호출하는 것이 아니라, 값을 전달한다. API로 데이터만 전달할 때 사용한다.
(viewResolver를 사용하지 않고, HttpMessageConverter가 작동하여 값을 반환함. 문자인 경우 StringConverter, 객체인 경우 JsonConverter가 작동.)
@PostMapping("/post/response1")
public String postResponse1(@RequestParam(required=false) String name, Model model){
model.addAttribute("name", name);
return "response"; // response.html을 웹브라우저에 보여줌 (res.render 기능)
}
@PostMappint("/post/response2")
@ResponseBody
public String postResponse2(@RequestParam(required=false) String name, Model model){
model.addAttribute("name", name);
return "response"; // response라는 문자열을 전달 (res.send, res.json 기능)
}
📌 DTO, VO
DTO
DTO(Data Transfer Object)는 계층 간 데이터 교환을 위해 사용하는 객체로, getter, setter 외 다른 로직을 가지지 않는 순수한 데이터 객체이다.
VO
VO(Value Object)는 DTO와 비슷하지만 read-Only 속성을 갖고 있는 객체로, getter 만 가지고 있어 값에 대한 수정이 불가능하다.

일반 폼에 DTO 이용하기
- Get 방식: @ModelAttribute 전송 가능, @RequestBody 오류(실패)
- Post 방식: @ModelAttribute 전송 가능, @RequestBody 오류(실패)
- @ModelAttribute: html 폼 데이터를 컨트롤러로 전달할 때 사용한다. (생략할 수 있음)
- @RequestBody: json 또는 xml 데이터 형식을 읽는다. (axios로 json 형태 전달해줄 때 사용 가능)
@GetMapping("/dto/response1")
@ResponseBody
public String dtoAPI1(@ModelAttribute UserDTO userDTO){
String msg = userDTO.getName()+" "+userDTO.getAge()+"!!!";
return msg;
}
@GetMapping("/dto/response2")
@ResponseBody
public String dtoAPI2(@RequestBody UserDTO userDTO){
String msg = userDTO.getName()+" "+userDTO.getAge()+"!!!";
return msg;
}
@PostMapping("/dto/response3")
@ResponseBody
public String dtoAPI1(UserDTO userDTO){
String msg = userDTO.getName()+" "+userDTO.getAge()+"!!!";
return msg;
}
@PostMapping("/dto/response4")
@ResponseBody
public String dtoAPI2(@RequestBody UserDTO userDTO){
String msg = userDTO.getName()+" "+userDTO.getAge()+"!!!";
return msg;
}
일반 폼에 VO 이용하기
- Get 방식: @ModelAttribute Null, @RequestBody 오류(실패)
- Post 방식: @ModelAttribute Null, @RequestBody 오류(실패)
- @ModelAttribute는 set 함수로 html 폼 데이터 값을 가져오기 때문에, get 함수만 있는 VO로는 값을 가져올 수 없어 Null 값이 된다.
@GetMapping("/vo/response1")
@ResponseBody
public String voAPI1(UserVO userVO){
String msg = userVO.getName() + " " + userVO.getAge() + "!!!";
return msg; // null
}
📌 axios 전송
Get
- @RequestParam 가능
- DTO - @ModelAttribute 가능
- VO - Null (setter 함수가 없는 VO로는 값이 들어갈 수 없음)
Post
- @RequestParam 오류
(axios로 값을 전달하는 경우, 파라미터로 값이 들어오지 않기 때문에, required=true를 기본값으로 갖는 @RequestParma에서 오류가 발생) - DTO - @ModelAttribute Null
(axios post 요청은 파라미터 형태가 아니기 때문에 읽을 수 없음) - DTO - @RequestBody 가능
(@Requestbody는 json 형태의 데이터를 읽을 수 있으므로, axios post 요청으로 전달되는 json 데이터를 받을 수 있음) - VO - @ModelAttribute Null
- VO - @RequestBody 가능
(@RequestBody는 setter 함수 실행이 아니라, 각각의 필드(변수)에 직접적으로 값을 주입하여 매핑하기 때문에, VO에서도 가능. @ModelAttribute는 setter 함수를 실행해 값을 넣어주기 때문에 VO에서 불가능한 것)
폼 전송 총정리
일반 폼 전송
- RequestParam: Get, Post 모두 가능
- ParamVariable: Get만 가능
DTO - 일반 폼 전송
- Get 전송 가능
- Post 전송 @RequestBody 있는 경우, 오류
- Post 전송 @RequestBody 없는 경우, 가능
VO -일반 폼 전송
- Get 전송 Null
- Post 전송 @RequestBody 있는 경우, 오류
- Post 전송 @RequestBody 없는 경우, Null
Axios 이용 - DTO
- Get 일반 가능
- Get DTO 가능
- Post 일반 오류
- Post DTO @RequestBody 있는 경우, 가능
- Post DTO @RequestBody 없는 경우, Null
Axios 이용 - VO
- Get 일반 가능
- Get VO Null
- Post 일반 오류
- Post VO @RequestBody 있는 경우, 가능
- Post VO @RequestBody 없는 경우, Null
참조링크
'포스코x코딩온 웹 풀스택 양성과정' 카테고리의 다른 글
| [포스코x코딩온] 웹 풀스택 과정 18주차 회고 | Spring JPA (0) | 2024.04.18 |
|---|---|
| [포스코x코딩온] 웹 풀스택 과정 18주차 회고 | Spring JDBC, MyBatis (0) | 2024.04.18 |
| [포스코x코딩온] 웹 풀스택 과정 18주차 회고 | Spring Bean (0) | 2024.04.18 |
| [포스코x코딩온] 웹 풀스택 과정 17주차 회고 | Spring (0) | 2024.04.18 |
| [포스코x코딩온] 웹 풀스택 과정 17주차 회고 | JAVA 래퍼, 제네릭, 콜렉션 (1) | 2024.04.18 |