Notice
Recent Posts
Recent Comments
Link
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

코딩 이래요래

@Controller vs @RestController 본문

위클리 페이퍼

@Controller vs @RestController

강범호 2025. 5. 13. 00:36

@Controller?? @RestController??

Spring MVC에서 클라이언트의 요청을 처리하는 흐름을 @Controller와 @RestController를 이용해 처리할 수 있음

두 어노테이션의 특징과 차이점을 알아보자


📦 @RequestBody, @ResponseBody

클라이언트와 서버 간의 소통을 위해 body(본문)에 데이터를 담아 보내야 하는데, 이때 클라이언트가 서버로 요청할 때 본문에 담은 데이터를 Request Body, 서버가 클라이언트로 응답할 때 본문에 담은 데이터를 Response Body라고 부름

요즘은 거의 표준처럼 JSON(JavaScript Object Notation) 형식을 사용함

📌 @RequestBody

클라이언트가 보낸 JSON 데이터를 자바 객체로 변환해주는 역할

📌 @ResponseBody

자바 객체를 JSON 데이터로 바꿔서 클라이언트로 응답해주는 역할


🎯 @Controller vs @RestController

둘 다 Spring MVC에서 컨트롤러로 인식되도록 해주는 어노테이션임. 가장 큰 차이점은 View를 반환하느냐, JSON 데이터를 반환하느냐에 있음

  • @Controller는 기본적으로 View를 반환하는 데 쓰이고
  • @RestController는 데이터를 반환하는 데 쓰임 (내부적으로 @ResponseBody 포함)

📎 참고로 두 어노테이션 다 @Component를 포함하고 있어서 Spring Bean으로 등록됨

✅ @Controller 예제 (View 반환)

@Controller
public class HelloController {

    @GetMapping("/hello") 
    public String hello(Model model) {
        model.addAttribute("message", "안녕하세요"); 
        return "hello"; // hello.html이라는 View 파일을 찾아서 렌더링함
    }
}
  • /hello로 접속하면 resources/templates/hello.html 뷰를 렌더링함 (Thymeleaf 기준)
  • Model을 통해 데이터를 View에 전달함

💡 @Controller는 보통 View를 반환하지만 메소드 레벨의 @ResponseBody 어노테이션을 사용하면 JSON으로 반환할 수 있음


✅ @RestController 예제 (JSON 반환)

@RestController
public class HelloRestController {

    @GetMapping("/hello")
    public String hello() {
        return "안녕하세요"; // 클라이언트에게 JSON 응답으로 "안녕하세요" 전달됨
    }
}
  • /hello로 접속하면 화면 없이 응답 본문에 문자열이 JSON처럼 직접 출력됨 (text/plain 또는 application/json)
  • 프론트엔드나 외부 API 클라이언트가 데이터를 받아가기에 적합함

🌐 Spring 요청 처리 구조 흐름도 (요약)

https://gowoonsori.com/blog/spring/architecture/

  1. 클라이언트의 요청은 DispatcherServlet을 거침
  2. HandlerMapping을 통해 알맞은 Controller를 찾아 요청을 수행함
  3. Controller는 받은 요청을 처리하고 (Service > Repository > DB) 결과를 반환함
  4. 반환 값이
    1. View를 반환할 때
      1. 논리 View 이름(String)을 반환함
      2. DispatcherServlet은 ViewResolver를 통해 논리 View 이름에 해당하는 View를 찾아 클라이언트에 반환함
    2. 자바 객체를 반환할 때
      • DispatcherServlet은 HttpMessageConverter를 호출함
      • HttpMessageConverter는 자바 객체를 HTTP 응답 메시지의 Body에 넣을 수 있도록 JSON 등으로 변환해줌