T_era
@RestController를 @Controller와 @ResponseBody를 나눠 쓰는 이유 본문
1. View 렌더링과 REST API 혼합:
- 일부 요청은 View를 통해 HTML 페이지를 제공하고, 다른 요청은 REST API처럼 JSON이나 XML 데이터를 제공해야 하는 경우에 유용하다.
- 클래스 레벨에 @Controller를 적용하면 기본적으로 메서드들이 View 이름을 반환하여 ViewResolver를 통해 렌더링되지만
- API 엔드포인트에 해당하는 특정 메서드에만 @ResponseBody를 적용하여 해당 메서드의 반환 값은 HTTP 응답 본문으로 직접 전송하도록 설정할 수 있다.
예시
@Controller
public class UserController {
@GetMapping("/users")
public String getUserListPage(Model model) {
// 사용자 목록 데이터를 Model에 담아 View (예: userList.jsp)로 전달
model.addAttribute("users", userService.getAllUsers());
return "userList"; // View 이름 반환
}
@GetMapping("/users/{id}")
@ResponseBody
public UserDetail getUserDetail(@PathVariable Long id) {
// 특정 사용자 상세 정보를 JSON 형태로 반환
return userService.getUserDetail(id);
}
}
2. 레거시 코드 또는 점진적인 API 도입:
- 기존 Spring MVC 프로젝트에서 점진적으로 REST API를 도입하는 경우에 이러한 혼합 방식이 사용될 수 있다.
- 기존의 View 기반 컨트롤러는 그대로 유지하면서, 새로운 API 기능만 @ResponseBody를 사용하여 추가하는 것이 효율적일 수 있다.
3. 특정 메서드에만 추가적인 응답 제어:
- @ResponseBody를 메서드 레벨에 사용하면 응답 방식을 특정 메서드에 한정하여 세밀하게 제어할 수 있다.
- 예를 들어, 클래스 레벨의 설정과 관계없이 특정 메서드에서만 HTTP 상태 코드를 직접 설정하거나, 커스텀 헤더를 추가해야 하는 경우 ResponseEntity와 @ResponseBody를 함께 사용할 수 있다.
예시
@Controller
public class ApiController {
@GetMapping("/data")
@ResponseBody
public ResponseEntity<String> getData() {
String data = "Sample Data";
HttpHeaders headers = new HttpHeaders();
headers.add("X-Custom-Header", "Custom Value");
return new ResponseEntity<>(data, headers, HttpStatus.OK);
}
}
4. 명시적인 API 동작 표현:
- 때로는 코드의 가독성을 높이기 위해 특정 메서드가 REST API 엔드포인트임을 명시적으로 @ResponseBody로 표현하는 것이 좋을 수 있다. 클래스 레벨이 @Controller일지라도 해당 메서드가 JSON/XML 등의 데이터를 반환하는 API 역할을 한다는 것을 더 쉽게 이해할 수 있도록 돕는다.
결론적으로, @RestController는 순수한 REST API 개발에 편리하지만, View 렌더링과 API 제공을 혼합해야 하는 상황, 기존 코드와의 호환성 유지, 특정 메서드에 대한 세밀한 응답 제어 등의 이유로 클래스 레벨에 @Controller를 사용하고 메서드 레벨에 @ResponseBody를 적용하는 방식이 여전히 유효하며 활용된다. 개발 상황과 요구 사항에 따라 가장 적절한 방식을 선택하는 것이 중요하다.
- 순수한 REST API 개발 환경에서는 @RestController를 클래스 레벨에서 사용하는 것이 보편적이고 효율적.
- View 렌더링과 API 제공이 혼합된 환경에서는 @Controller와 @ResponseBody를 함께 사용하는 방식이 여전히 널리 활용.
'Programing > Spring' 카테고리의 다른 글
| Server에서 Client로 Data를 전달하는 방법 (0) | 2025.05.07 |
|---|---|
| HTTPMessageConverter (0) | 2025.05.07 |
| JSON 데이터 처리 (@RestController) (0) | 2025.05.07 |
| HttpEntity와 더 편리한 방법 (0) | 2025.05.07 |
| HTTP Message Body (요청) (0) | 2025.05.07 |