스프링에서 @Controller와 @RestController의 차이점은 무엇인가요?

_____
Q: @Controller와 @RestController의 차이점은 무엇인가요?

A: `@Controller`와 `@RestController`는 모두 스프링 MVC에서 요청을 처리하는 컨트롤러를 나타내는 어노테이션이지만, 주요 차이점은 HTTP 응답 처리 방식에 있습니다.

---

1. 기본 역할
- @Controller
전통적인 MVC 패턴에서 사용되며, 뷰(예: JSP, Thymeleaf) 이름을 반환하여 서버 측에서 뷰를 렌더링합니다.
- @RestController
RESTful 웹 서비스 개발에 특화된 컨트롤러로, 메서드의 반환 값을 HTTP 응답 본문(body)에 직접 쓰는 데 사용합니다.

---

2. 내부 작동 방식
- @Controller
뷰 이름을 반환할 경우, 반환값은 뷰 리졸버(ViewResolver)에 의해 해석되어 HTML 등의 뷰 페이지로 변환됩니다.
JSON이나 XML 같은 데이터 응답을 하려면 `@ResponseBody` 어노테이션을 메서드에 별도로 붙여야 합니다.

- @RestController
`@Controller`와 `@ResponseBody`가 결합된 형태로, 모든 메서드에 자동으로 `@ResponseBody`가 적용됩니다. 즉, 반환값이 HTTP 응답 본문에 그대로 쓰이며 별도의 뷰 렌더링 과정이 없습니다.

---

3. 사용 예시

- @Controller 사용 시
```java
@Controller
public class HomeController {
@GetMapping("/home")
public String home() {
return "home"; // 뷰 이름 반환 → home.jsp, home.html 렌더링
}

@GetMapping("/data")
@ResponseBody
public String data() {
return "{\"key\":\"value\"}"; // JSON 직접 반환
}
}
```

- @RestController 사용 시
```java
@RestController
public class ApiController {
@GetMapping("/data")
public Map data() {
Map map = new HashMap<>();
map.put("key", "value");
return map; // 자동으로 JSON 변환 후 본문에 작성
}
}
```

---

4. 요약

| 구분 | @Controller | @RestController |
|-----------------|----------------------------------|----------------------------------------|
| 기본 목적 | 뷰(View) 반환 및 렌더링 | REST API 응답 본문 반환 |
| 반환값 처리 | 뷰 이름으로 해석, @ResponseBody는 별도 명시 | 자동으로 @ResponseBody 적용 |
| JSON 응답 방식 | @ResponseBody 필요 | 기본적으로 JSON (또는 지정된 메시지 컨버터) 반환 |
| 사용 영역 | 전통적인 MVC 웹 애플리케이션 | RESTful API 서버 개발 |

---

결론:
- 뷰를 렌더링하는 웹 페이지를 반환할 때는 `@Controller`를 사용하고,
- JSON 또는 기타 데이터 포맷으로 REST API 응답을 반환할 때는 `@RestController`를 사용하는 것이 일반적입니다.
스프링 프레임워크에서 `@Controller`와 `@RestController`는 모두 웹 애플리케이션의 컨트롤러를 정의하는 데 사용되지만, 그 용도와 동작 방식에서 중요한 차이점이 있습니다.

아래에서 이 두 어노테이션의 차이점을 자세히 설명하겠습니다.

1. @Controller- 용도 : `@Controller`는 MVC 패턴에서 사용되는 컨트롤러를 정의합니다.

주로 HTML 페이지를 반환하는 웹 애플리케이션에서 사용됩니다.

- 응답 타입 : `@Controller`는 뷰를 반환하는 메서드를 정의합니다.

이 메서드는 일반적으로 JSP, Thymeleaf와 같은 템플릿 엔진을 통해 렌더링된 HTML 페이지를 반환합니다.

- 예시 : ```java @Controller public class MyController { @GetMapping("/hello") public String hello(Model model) { model.addAttribute("message", "Hello, World!"); return "hello"; // hello.html 템플릿을 반환 } } ```

2. @RestController- 용도 : `@RestController`는 RESTful 웹 서비스의 컨트롤러를 정의합니다.

주로 JSON 또는 XML과 같은 데이터 형식을 반환하는 API에서 사용됩니다.

- 응답 타입 : `@RestController`는 메서드에서 반환하는 객체를 자동으로 JSON으로 변환하여 클라이언트에 전달합니다.

별도로 `@ResponseBody`를 사용할 필요가 없습니다.

- 예시 : ```java @RestController public class MyRestController { @GetMapping("/api/hello") public String hello() { return "Hello, World!"; // JSON 형태로 반환 } } ``` 주요 차이점 요약- 응답 형식 : `@Controller`는 뷰 이름을 반환하여 HTML 페이지를 렌더링하는 반면, `@RestController`는 객체를 반환하여 JSON 또는 XML 형식으로 데이터를 제공합니다.

- 어노테이션 조합 : `@RestController`는 내부적으로 `@Controller`와 `@ResponseBody`를 결합한 것입니다.

따라서 `@RestController`를 사용하면 모든 메서드가 자동으로 JSON 응답을 생성합니다.

결론웹 애플리케이션을 개발할 때, 어떤 어노테이션을 사용할지는 애플리케이션의 요구 사항에 따라 달라집니다.

HTML 페이지를 반환하는 경우에는 `@Controller`를, RESTful API를 제공하는 경우에는 `@RestController`를 사용하는 것이 적합합니다.

이 두 어노테이션의 차이를 이해하면 스프링 애플리케이션을 보다 효율적으로 설계하고 구현할 수 있습니다.

작성자: ㅁㅁ [비회원] | 작성일자: 1년 전 2024-08-26 08:20:37
조회수: 211 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.