Spring Web - Controller와 RestController

2024. 12. 18. 18:01·Spring

  • 어노테이션 간단 비교:
    • @Controller = 웹 페이지 반환용 컨트롤러.
    • @RestController = 데이터(JSON/XML) 반환용 컨트롤러 (@Controller + @ResponseBody).

1. @Controller

  • 역할: 웹 애플리케이션에서 뷰(View)를 반환하기 위한 컨트롤러로 사용됨
  • 주요 특징:
    • 메서드의 반환값은 뷰의 이름(String)이 되며, 뷰 리졸버(View Resolver)를 통해 실제 뷰(예: JSP, Thymeleaf 템플릿)가 렌더링됩니다.
    • 모델(Model) 객체를 사용하여 뷰에 데이터를 전달할 수 있습니다.
    • 사용 예시: 
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class PageController {

    @GetMapping("/welcome")
    public String welcomePage(Model model) {
        model.addAttribute("message", "안녕하세요, Spring Boot!");
        return "welcome"; // templates/welcome.html 뷰를 반환
    }
}

 

2. @RestController

  • 역할: RESTful 웹 서비스를 구축하기 위한 컨트롤러로 사용됩니다.
  • 주요 특징:
    • @Controller와 @ResponseBody를 합쳐 놓은 어노테이션입니다.
    • 메서드의 반환값은 뷰가 아닌 HTTP 응답 본문(body)에 직접 작성됩니다.
    • 주로 JSON 또는 XML 형태의 데이터를 반환하며, 클라이언트와 데이터 교환을 위해 사용됩니다.
  • 사용 예시 :
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ApiController {

    @GetMapping("/api/greeting")
    public Greeting greeting() {
        return new Greeting("안녕하세요, Spring Boot!");
    }
}

class Greeting {
    private String message;

    public Greeting(String message) {
        this.message = message;
    }

    // Getter and Setter
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
  • 이 경우 /api/greeting 요청에 대해 Greeting 객체가 JSON 형식으로 변환되어 응답 본문에 포함됩니다.

3. 주요 차이점 정리

특징 @Controller @RestController
응답 방식 뷰(View) 이름을 반환하여 UI를 렌더링 객체를 반환하여 JSON/XML 형태로 응답 본문에 작성
주요 용도 웹 페이지 렌더링 (HTML, JSP 등) RESTful API 개발 (데이터 통신)
필요한 추가 어노테이션 JSON 등을 반환하려면 메서드에 @ResponseBody 필요 @ResponseBody가 포함되어 있어 추가 어노테이션 불필요
예시 템플릿 엔진과 함께 사용하는 웹 애플리케이션 모바일 앱이나 프론트엔드와 통신하는 백엔드 API 서버

4. 실용적인 사용 팁

  • 웹 페이지를 반환하는 경우:
    • 템플릿 엔진(Thymeleaf, JSP 등)을 사용하여 HTML 페이지를 렌더링해야 한다면 @Controller를 사용하세요.
    • 뷰 템플릿 파일의 이름을 반환하고, 모델에 데이터를 담아 전달합니다.
  • JSON 또는 XML 데이터를 반환하는 경우:
    • RESTful API를 개발하거나 클라이언트와 데이터를 주고받아야 한다면 @RestController를 사용하세요.
    • 객체나 컬렉션을 반환하면 자동으로 JSON 또는 XML로 직렬화되어 응답에 포함됩니다.

5. 추가 예제

5.1 @Controller로 JSON 데이터 반환하기

@Controller를 사용하면서 JSON 데이터를 반환하려면 메서드에 @ResponseBody 어노테이션을 추가해야 합니다.

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class ApiController {

    @GetMapping("/api/data")
    @ResponseBody
    public Data getData() {
        return new Data("데이터입니다.");
    }
}

class Data {
    private String content;

    public Data(String content) {
        this.content = content;
    }

    // Getter and Setter
    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

  • @ResponseBody를 통해 메서드의 반환값이 뷰가 아닌 응답 본문에 직접 작성됩니다.
  • 그러나 이럴 경우 @RestController를 사용하는 것이 더 간결합니다.

5.2 @RestController로 뷰 반환하려는 경우

@RestController는 뷰 이름을 반환하더라도 뷰 리졸버가 동작하지 않습니다. 따라서 뷰를 렌더링하려면 @Controller를 사용해야 합니다.


6. 요약

  • @Controller:
    • 뷰 템플릿을 사용하여 웹 페이지를 반환할 때 사용.
    • 메서드의 반환값은 뷰의 이름이며, 모델 데이터를 뷰로 전달 가능.
    • 데이터가 아닌 UI를 렌더링해야 하는 경우 적합.
  • @RestController:
    • RESTful 웹 서비스를 구축할 때 사용.
    • 메서드의 반환값은 JSON 또는 XML 등의 데이터로 직렬화되어 응답 본문에 포함.
    • 별도의 뷰 없이 데이터 자체를 클라이언트에 전달할 때 적합.

7. 선택 가이드

  • 웹 페이지를 제공하는 애플리케이션:
    • 사용자에게 HTML 페이지를 렌더링해야 한다면 @Controller를 사용하세요.
    • 예: 전통적인 MVC 웹 애플리케이션.
  • RESTful API 서버:
    • 프론트엔드 애플리케이션(React, Angular 등)이나 모바일 앱에 데이터를 제공해야 한다면 @RestController를 사용하세요.
    • 예: JSON 기반의 API 서버.

8. 추가 참고

  • Spring 공식 문서:
    • Spring Web MVC - Controller
    • Building a RESTful Web Service

'Spring' 카테고리의 다른 글

Spring Web MVC - Http 요청  (0) 2024.12.19
Spring Boot Web 프로젝트에서 JSP 적용하기  (0) 2024.12.19
Spring Boot - Spring Web  (0) 2024.12.18
MyBatis - SqlSession  (0) 2024.12.16
MyBatis - Mapper XML  (1) 2024.12.15
'Spring' 카테고리의 다른 글
  • Spring Web MVC - Http 요청
  • Spring Boot Web 프로젝트에서 JSP 적용하기
  • Spring Boot - Spring Web
  • MyBatis - SqlSession
jhyngu
jhyngu
취업하자.
    티스토리 홈
    |
  • jhyngu
    jhyngu
    jhyngu
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • Dev (151)
      • Java (2)
      • Spring (51)
      • Spring Security (39)
        • JWT (22)
        • OAuth2 (17)
      • Kotlin (2)
      • React (6)
      • Coding Test (28)
      • DB (0)
      • Git (5)
      • Linux (14)
      • docker (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Linux
    Spring
    JavaScript
    JWT
    Spring Boot
    git
    JDBC
    api client
    MariaDB
    Postman
    spring web
    react
    oauth2
    Spring Security
    백준
    mybatis
    Spring Framework
    MVC
    OAuth2
    알고리즘
  • hELLO· Designed By정상우.v4.10.3
jhyngu
Spring Web - Controller와 RestController
상단으로

티스토리툴바