SpringMVC_RESTAPI (1)

이유준·2024년 6월 5일

Backend_School

목록 보기
3/6

1. @Controller 및 @RestController의 차이

1.1 @Controller

@Controller 어노테이션은 Spring MVC의 기본 컨트롤러 어노테이션으로, 주로 웹 애플리케이션에서 HTTP 요청을 처리하는 역할을 한다.

이 어노테이션은 클래스 레벨에서 사용되며, 해당 클래스를 웹 요청을 처리하는 컨트롤러로 등록한다.

1.1.1 @Controller의 특징 및 사용법은 무엇이 있을까?

  • @Controller는 주로 뷰 템플릿을 반환하고, MVC 패턴의 'V' 즉, 뷰(view)와 관련이 깊다.

  • 이 어노테이션이 붙은 클래스의 메서드에는 ModelAndView, String(뷰 이름을 나타내는), Model, Map 등을 반환할 수 있으며, 이를 통해 데이터를 뷰로 전달하고 뷰를 렌더링 할 수 있다.

  • 반환된 뷰 이름은 ViewResolver에 의해 해석되어 최종적으로 사용자에게 보일 페이지를 생성한다.

1.2 @RestController

@RestController 애노테이션은 @Controller와 @ResponseBody를 결합한 것으로, RESTful 웹 서비스를 쉽게 만들 수 있도록 돕는다.

이 어노테이션은 클래스가 HTTP 요청을 처리하고 데이터를 JSON이나 XML 형태로 클라이언트에게 직접 반환한다는 것을 나타낸다.

1.2.1 @RestController의 특징 및 사용법은 무엇이 있을까?

  • @RestController는 각 메서드가 기본적으로 HTTP 응답 본문(resposeBody)에 데이터를 매핑하도록 한다.

  • @RestController가 적용된 컨트롤러의 메서드는 HttpMessageConverter를 사용하여 반환된 객체를 HTTP 응답 본문으로 직접 쓰게 된다. 이 과정에서 객체는 자동으로 JSON이나 XML로 변환된다.

  • REST API를 개발할 때 주로 사용되며, 클라이언트에게 데이터 모델 자체를 반환하는 데 적합하다.

1.3 @Controller와 @RestController의 주요 차이점

  • 응답 처리
    • @Controller는 뷰를 반환하는 것에 중점을 둔다.
    • 일반적으로 웹 페이지를 반환하는 데 사용된다.
    • @RestController는 RESTful API를 구현하는 데 사용된다.
    • JSON이나 XML 등의 형태로 데이터를 직접 반환한다.

이러한 차이를 이해하는 것은 HTTP 기반의 서비스를 설계할 때 중요하기에, 각각의 어노테이션을 사용 목적과 필요에 따라 선택하여 사용하며, 두 가지 방식을 적절히 혼합하여 사용할 수도 있다.

여기서 REST API란 뭘까??

위에서 REST API를 개발할 때 주로 @RestController를 사용한다고 언급했다. 그런데 REST API가 무엇인지에 대해 정확히 몰라서 이에 대해 찾아보았다.

우선, REST API란, "REST를 기반으로 만들어진 API"를 의미한다.

그러면, REST는 뭘까?

REST란, REST(Representational State Transfer)의 약자로, '자원을 이름으로 구분하여 해당 자원의 상태를 주고받는 것'을 의미한다.

REST란?

  1. HTTP URI(Iniform Resource Identifier)를 통해 자원(Resource)을 명시하고,

  2. HTTP Method(POST, GET, PUT, PATCH, DELETE 등)를 통해

  3. 해당 자원(URI)에 대한 CRUD Operation을 적용하는 것을 의미한다.

REST 구성 요소

REST는 다음의 3가지로 구성되어 있다.

  1. 자원(Resource) : HTTP URI

  2. 자원에 대한 행위(Verb) : HTTP Method

  3. 자원에 대한 행위의 내용 (Representations) : HTTP Message Pay Load

즉, RESTI API는 REST의 원리를 따르는 API를 말한다!!

1.4 @RestController 예제

@RestController
public class MyRestController {
    @GetMapping("/api/greeting")
    public Map<String, String> greet(@RequestParam(name = "name", required = false, defaultValue = "World") String name){
        Map<String, String> response = new HashMap<>();
        response.put("message", "Hello, " + name + "!");
        return response;
    }
}
@RequestController

클래스 레벨에서 @RequestController 어노테이션을 사용하면, 클래스 내의 모든 메서드는 기본적으로 HTTP 응답 본문에 그들의 반환 값을 매핑한다.

@RequestBody와 @ResponseBody 차이점

강사님이 @RequestBody 어노테이션을 사용하셨는데, 교안에는 @ResponseBody가 나와있다. 뭐가 다른 걸까?

다음은 @RequestBody 어노테이션이 사용된 강의 시간 중 사용한 코드이다.


   @PostMapping
   public Todo addTodo(@RequestBody Todo todo){
       return todoService.addTodo(todo.getTodo());
   }
   @PatchMapping("/{id}")
   public Todo updateById(@PathVariable("id") Long id) {
       return todoService.updateTodo(id);
   }
   @PatchMapping
   public Todo updateTodo(@RequestBody Todo todo){
       return todoService.updateTodo(todo);
   }
   @DeleteMapping
   public String deleteTodo(@RequestBody Todo todo){
       todoService.deleteTodo(todo.getId());
       return "ok";
   }

스프링에서 비동기 처리를 하는 경우 @RequestBody, @ResponseBody를 사용한다. 비동기 처리를 위해 이 어노테이션들은 어떻게 작동할까?

클라이언트와 서버의 비동기 통신

클라이언트와 서버의 비동기 통신

  • 클라이언트 -> 서버로 통신하는 메시지는 request(요청) 메시지.

  • 서버 -> 클라이언트로 통신하는 메시지는 response(응답) 메시지.

ⓘ 웹에서 화면전환(새로고침) 없이 이루어지는 동작들은 대부분 비동기 통신으로 이루어진다!


비동기 통신을 하기 위해서는 클라이언트 -> 서버로 요청 메시지를 보낼 때, 본문에 데이터를 담아서 보내야 하고, 서버 -> 클라이언트로 응답을 보낼 때에도 본문에 데이터를 담아서 보내야 한다.

여기서 본문이 바로 body이다!!

즉, 요청 본문 requestBody, 응답 본문 responseBody를 담아서 보내야 한다.

이때 본문에 담기는 데이터 형식은 여러 가지 형태가 있겠지만, 가장 대표적으로 사용되는 것은 JSON이다. 즉, 비동기식 클라이언트 - 서버 통신을 위해 JSON 형식의 데이터를 주고받는 것이다.

addTodo, updateTodo는 클라이언트가 서버로 변경 사항을 요청하는 것이기 때문에 requestBody를 쓴 것이 아닐까라는 생각이 든다.

📖오늘을 마치며


금일은 시간에 비해서 많은 내용을 배우지는 않았다. REST에 대한 개념은 처음 접해보는 것 같고, 실습도 이전에 했던, Controller, Entity, Repository, Service, Test 위주로 작성했기에, 새로운 걸 많이 배웠다기보다는 기존에 배웠던 것을 복습하고, 새롭게 배운 것과 적용하는 과정이었다. Service 로직을 작성할 때 익숙지는 않다는 생각이 들었기에, Service 부분은 조금 더 익숙해져야겠다는 생각이 든다.

마지막으로 HTTP 주요 메서드를 테스트할 수 있는 방법과 관련 이미지, 링크들을 첨부하고 마친다.

Intellij에서 .http 파일

Todo.html 코드

### GET /todos
GET http://localhost:8080/api/todos
Accept: application/json

### GET /todos/{id}
GET http://localhost:8080/api/todos/2
Accept: application/json

### POST /todos
POST http://localhost:8080/api/todos
Content-Type: application/json

{
  "todo": "New Todo Item"
}

### PATCH /todos/{id}
PATCH http://localhost:8080/api/todos/2
Accept: application/json

### PATCH /todos
PATCH http://localhost:8080/api/todos
Content-Type: application/json

{
  "id": 2,
  "todo": "Update Todo"
}

### DELETE /todos
DELETE http://localhost:8080/api/todos
Content-Type: application/json

{
  "id": 10
}
  • Talend API Tester

구글 크롬의 확장 프로그램

https://chrome.google.com/webstore/detail/talend-api-tester-free-ed/aejoelaoggembcahagimdiliamlcdmfm/related?hl=ko

powerShell의 curl
[출처] SpringMVC_RESTAPI|작성자 LUReady

0개의 댓글