T_era

@RestController를 @Controller와 @ResponseBody를 나눠 쓰는 이유 본문

Programing/Spring

@RestController를 @Controller와 @ResponseBody를 나눠 쓰는 이유

블스뜸 2025. 5. 7. 13:09

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