포스코x코딩온 웹 풀스택 양성과정

[포스코x코딩온] 웹 풀스택 과정 18주차 회고 | Spring REST API

Codult 2024. 4. 18. 23:40
728x90

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


참조링크

https://hahahoho5915.tistory.com/54

728x90