- 어노테이션 간단 비교:
- @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' 카테고리의 다른 글
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 |