Spring Boot - @Controller와 @RestController (feat. Spring MVC 핵심 구조)

2025. 7. 6. 19:22·Language & Framework/Spring Boot
728x90

📌 Intro
Spring에서는 웹 요청을 처리하기 위해 @Controller, @RestController와 같은 어노테이션을 사용한다.
이번 글에서는 이 두 어노테이션의 차이를 이해하기 위해 Spring MVC의 핵심 구조를 먼저 살펴보고, 그 위에서 각 어노테이션의 처리 흐름과 용도를 비교해보자.

 

1. Spring MVC 구조의 핵심: DispatcherServlet

Spring MVC는 다음과 같은 프론트 컨트롤러 패턴(Front Controller Pattern)을 따른다.

더보기

여기서 프론트 컨트롤러 패턴은 사용자의 모든 요청을 한 곳(중앙 컨트롤러)에서 먼저 받아서, 이후 어떤 로직(컨트롤러, 서비스 등)으로 넘길지를 결정하는 방식을 의미한다.

이 패턴에서 모든 요청은 중앙 진입점인 `DispatcherServlet`으로 들어오며, 이후의 흐름을 모두 이 객체가 조율한다.

 

 

 

1.1.  처리 흐름

  1. 클라이언트가 HTTP 요청 전송
  2. `DispatcherServlet`이 요청 수신
  3. `HandlerMapping`을 통해 어떤 `Controller`가 처리할지 결정
  4. 해당 `Controller`를 실행할 수 있는 `HandlerAdapter` 확보
  5. `Controller` 메서드 실행 → 결과 반환
  6. `View` 처리 단계
    1. 템플릿(View 이름 반환 시): `ViewResolver`가 실제 뷰 렌더링
    2. 데이터 응답(JSON 등): `HttpMessageConverter`가 객체 → JSON 변환
  7. 최종 응답 반환

 

1.2. 핵심 컴포넌트 정리

컴포넌트 주요 역할 실무에서 체크할 사항
DispatcherServlet 요청 흐름의 중심 / 예외 처리 예외 핸들링 주의
HandlerMapping URI → Controller 매핑 중복 매핑 여부
HandlerAdapter 핸들러 실행 추상화 커스텀 핸들러 가능 여부
ViewResolver View 이름 → 실제 뷰 경로 결정 prefix/suffix 설정
HttpMessageConverter 객체 ↔ HTTP 메시지 변환 (JSON, XML) Content-Type 정확히 설정

 

 


2. @Controller – 전통적인 서버 사이드 렌더링 방식

`@Controller`는 View 렌더링을 위한 컨트롤러로, 템플릿 기반 응답에 적합하다.

하지만 필요 시 `@ResponseBody`를 통해 데이터도 반환할 수 있다.

 

2.1. View 반환 흐름 예시

@Controller
public class HomeController {

    @GetMapping("/home")
    public String home(Model model) {
        model.addAttribute("msg", "Hello!");
        return "home";  // → /templates/home.html 렌더링
    }
}
처리 흐름 요약
  1. 클라이언트가 `/home` 요청
  2. `DispatcherServlet`이 요청 수신
  3. `HandlerMapping` → `HomeController` 선택
  4. 메서드 실행 후 "home" 반환 (반환값 "home"은 View 이름)
  5. `ViewResolver`가 "home" → `home.html` 파일을 찾아 렌더링
  6. HTML 응답 전송

 

2.2. Data 반환 예시 (with @ResponseBody)

컨트롤러에서는 데이터를 반환하려면 `@ResponseBody` 어노테이션을 활용해주어야 한다.

이를 통해 Controller도 Json 형태로 데이터를 반환할 수 있다.

@Controller
public class DataController {
    @GetMapping("/data")
    @ResponseBody
    public Map<String, String> data() {
        return Map.of("msg", "Hello!");
    }
}

`@ResponseBody`를 붙이면 View 렌더링을 생략하고 HttpMessageConverter를 통해 JSON 응답이 된다.


3. @RestController – RESTful API 전용 컨트롤러

`@RestController`는 내부적으로 `@Controller` + `@ResponseBody`가 결합된 어노테이션이다.

즉, 반환하는 객체가 항상 JSON으로 직렬화되어 클라이언트에 전송된다.
→ REST API 개발 시 필수 사용

별도의 `@ResponseBody` 없이도 JSON으로 자동 변환된다. 내부적으로는 `HttpMessageConverter`가 동작한다.
@RestController
public class ApiController {
    @GetMapping("/api/hello")
    public Map<String, String> hello() {
        return Map.of("message", "Hello, REST!");
    }
}
처리 흐름
  1. 클라이언트가 `/api/hello` 요청
  2. `DispatcherServlet`이 요청 수신
  3. `HandlerMapping` → `ApiController` 선택
  4. `hello()` 호출 후 `Map` 객체 반환
  5. `HttpMessageConverte`r가 JSON 변환 (`{"message": "Hello, REST!"}`)
  6. JSON 응답이 클라이언트에 전송됨

4. @Controller vs @RestController 비교

항목 `@Controller ` `@RestController`
주 용도 View 반환 (템플릿 렌더링) JSON 등 데이터 반환 (REST API)
View 처리 방식 ViewResolver 사용하지 않음
JSON 응답 시 `@ResponseBody` 필요 자동 처리됨
추천 사용처 웹 페이지, 서버 렌더링 기반 서비스 RESTful API, 모바일 백엔드

 


✏️ 마무리

  • Spring MVC는 `DispatcherServlet`을 중심으로 다양한 컴포넌트들이 요청을 처리하는 구조를 갖고 있다.
  • `@Controller`는 View와 데이터를 모두 반환할 수 있지만, RESTful API에 적합한 방식은 `@RestController`이다.
  • 내부적으로는 `HttpMessageConverter`, `ViewResolver` 등이 적절히 개입하여 응답 포맷을 결정한다.

 

📎 참고자료

  • https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller.html
  • https://docs.spring.io/spring-framework/reference/languages/kotlin/coroutines.html#controllers
  • https://www.baeldung.com/spring-controller-vs-restcontroller
  • https://mangkyu.tistory.com/49
728x90
저작자표시 비영리 변경금지 (새창열림)
'Language & Framework/Spring Boot' 카테고리의 다른 글
  • Spring Controller에 @RequiredArgsConstructor 적용하기
  • @AllArgsConstructor vs @RequiredArgsConstructor — 언제, 왜 사용해야 할까?
  • Spring에서 AOP(Aspect Oriented Programming)가 필요한 이유
  • Spring에서 Bean 등록하는 3가지 방법(@ComponentScan, @Bean, XML)
밍구링구리
밍구링구리
밍구리의 실험실 이것저것 배우고 기록을 남깁니다
  • 밍구링구리
    Mingguri Labatory
    밍구링구리
    • 홈
    • 태그
    • 방명록
    • 깃허브
  • 전체
    오늘
    어제
    • 분류 전체보기 (96)
      • Language & Framework (15)
        • Java (3)
        • Vue.js (1)
        • Spring Boot (10)
      • Computer Science (4)
        • Operating System) (0)
        • Database (2)
        • Network (1)
        • Data Structure (0)
        • Algorithm (1)
      • Architecture & Design (7)
      • Cloud & Infra (5)
      • Trouble Shooting (0)
        • 에러 해결 (0)
        • 삽질 기록 (0)
      • 회고 (0)
      • Coding Practice (42)
        • Backjoon (24)
        • LeetCode (6)
        • Programmers (12)
      • Book (0)
      • ETC (21)
        • 블로그 관리 (3)
        • 일상 (1)
        • 후기 (2)
        • 밍구의 실험실 (1)
        • 🤔Study . Question🔍 (14)
      • 부트캠프 (1)
  • 인기 글

  • 최근 글

  • 최근 댓글

  • 태그

    투포인터
    dfs
    테스트케이스
    Spring Boot
    스케일업
    객체지향
    스터디
    git
    스케일아웃
    백준
    SOLID
    우선순위큐
    코딩테스트
    BFS
    백트래킹
    LeetCode
    퀴즈
    구현
    OOP
    유스케이스
    코드잇
    골드4
    프로그래머스
    vue.js
    백엔드
    문제
    그리디
    골드5
    알고리즘
    level 2
  • 250x250
  • hELLO· Designed By정상우.v4.10.3
밍구링구리
Spring Boot - @Controller와 @RestController (feat. Spring MVC 핵심 구조)
상단으로

티스토리툴바