Java/Spring

[Spring] Controller와 RestController의 차이

LimeCoding 2023. 8. 17. 16:13

@Controller 

  1. 스프링의 전통적인 컨트롤러
  2. @Component의 구체적인 버전이다.
  3. MVC 패턴에서의 Controller 역할임을 알려준다.
  4. classpath scanning을 통해 구현된 클래스를 자동으로 인식할 수 있게 해준다. -> 좀 더 공부 필요
  5. 주로 @controller와 @RequestMapping을 조합하여 요청 관련 메소드에 사용한다.
  6. @Controller를 사용하는 요청 관련 메소드에 @ResponseBody를 달아서 HttpResponse로 돌려주도록 만든다.

 

 

 

@RestController 

  1. 스프링 4.0버전에서 처음 소개됐으며, RESTful 웹 서비스를 쉽게 만들수 있도록 해줌
  2. @Controller의 구체적인 버전이다.
  3. @RestController는 @Controller와 @ResponseBody를 가지고 있다.
  4. @RestController를 사용하는 클래스내의 모든 메소드들은 요청에 대한 응답을 HttpResponse로 리턴하도록 한다.

 

 

요약

@Controller는 스프링 MVC 패턴에서 controller 역할을 하는 클래스임을 나타내는 어노테이션이며, MVC패턴에서의 전반적인 컨트롤러 역할을 수행한다. 여기서 RESTful API를 쉽게 구성하기 위해 만들어진 Controller가 @RestController다.

 

@RequiredArgsConstructor
@RestController
public class ApiController {

    private final PostsService postsService;

    @PostMapping("/api/v1/posts")
    public Long save(@RequestBody PostSaveRequestDto requestDto) {
        return postsService.save(requestDto);
    }

    @GetMapping("/api/v1/posts/{id}")
    public PostResponseDto save(@PathVariable Long id) {
        return postsService.findById(id);
    }
}

 

이 코드를 수행하는 과정에서 @RestController를 @Controller로 적어서 요청을 테스트하는 과정에서 JSON으로 파싱이 불가능하다는 오류 메세지를 확인했다.

 

 

 

@Controller로 요청을 처리하는 과정에서 어떤 데이터가 오가는지까지는 알 수 없었다. 하지만 요청에 대한 정보로 JSON 형태로 데이터를 받아야한다는 것을 알고 있었고 @RestController를 사용해야 JSON 형태로 데이터를 전송할 수 있다는 것을 알았다.

 

 

 

 

[참고자료]

https://www.baeldung.com/spring-controller-vs-restcontroller

https://www.geeksforgeeks.org/difference-between-controller-and-restcontroller-annotation-in-spring/