Back_End/Spring

스프링 @Controller와 @RestController의 차이점

10Biliion 2025. 3. 28. 16:00

 

1. @Controller란?

@Controller는 Spring MVC에서 사용되는 애너테이션으로, 주로 HTML 페이지를 반환하는 경우에 사용됩니다. 뷰(View) 템플릿과 함께 사용되며, ModelAndView 또는 Model 객체를 활용하여 데이터를 전달할 수 있습니다.

@Controller 예제

아래는 @Controller를 사용하여 뷰를 반환하는 예제입니다.

@Controller
public class HomeController {
    
    @GetMapping("/home")
    public String home(Model model) {
        model.addAttribute("message", "Welcome to Spring Boot!");
        return "home"; // templates/home.html 파일을 렌더링함 (Thymeleaf 기준)
    }
}

위 코드에서 /home URL로 요청이 들어오면 home.html 템플릿을 렌더링하며, 모델에 message 데이터를 추가하여 화면에 표시할 수 있습니다.

 

 


 

2. @RestController란?

@RestController@Controller@ResponseBody를 합친 개념으로, JSON 또는 XML 데이터를 반환하는 API를 만들 때 사용됩니다. 즉, 뷰 템플릿을 사용하지 않고, 데이터를 직접 반환합니다.

@RestController 예제

아래는 @RestController를 사용하여 JSON 데이터를 반환하는 예제입니다.

@RestController
public class ApiController {
    
    @GetMapping("/api/message")
    public Map<String, String> getMessage() {
        Map<String, String> response = new HashMap<>();
        response.put("message", "Hello, REST API!");
        return response; // JSON 형식으로 반환됨
    }
}

위 코드에서 /api/message URL로 요청이 들어오면, Map<String, String>을 JSON 형태로 변환하여 클라이언트에 반환합니다. 별도의 @ResponseBody를 사용할 필요 없이 자동으로 JSON 변환이 이루어집니다.


3. @Controller vs @RestController 차이점

구분 @Controller @RestController
주 용도 HTML 페이지 반환 JSON/XML 데이터 반환
뷰 템플릿 사용 O (Thymeleaf, JSP 등과 함께 사용) X (데이터 직접 반환)
기본 반환 타입 String (뷰 이름) 객체(JSON 변환됨)
@ResponseBody 필요 여부 필요 (@ResponseBody 직접 사용) 불필요 (기본적으로 적용됨)

 

4. @ResponseBody를 활용한 차이점

@Controller에서 JSON을 반환하려면 @ResponseBody 애너테이션을 명시적으로 추가해야 합니다.

@Controller에서 @ResponseBody 사용 예제

@Controller
public class UserController {
    
    @GetMapping("/user")
    @ResponseBody
    public User getUser() {
        return new User("John", 30);
    }
}

위 코드에서 @ResponseBody를 사용하지 않으면 getUser()의 반환값은 뷰 이름으로 해석됩니다. 하지만 @ResponseBody를 추가하면 JSON으로 변환되어 응답됩니다.

이와 동일한 기능을 @RestController를 사용하면 @ResponseBody 없이도 자동 변환됩니다.

@RestController
public class UserApiController {
    
    @GetMapping("/api/user")
    public User getUser() {
        return new User("John", 30);
    }
}

이처럼 @RestController@ResponseBody를 생략할 수 있어 RESTful API 개발에 더 적합합니다.


 

  • @Controller는 HTML을 반환하는 전통적인 웹 애플리케이션 개발에 적합합니다.
  • @RestController는 RESTful API 개발에 적합하며, 데이터를 JSON 형태로 쉽게 반환할 수 있습니다.
  • @Controller에서 JSON을 반환하려면 @ResponseBody를 추가해야 하지만, @RestController에서는 자동으로 처리됩니다.

언제 @Controller를 사용해야 할까?

  • 서버에서 동적인 HTML 페이지를 렌더링해야 할 때
  • Thymeleaf, JSP와 같은 템플릿 엔진을 사용할 때

언제 @RestController를 사용해야 할까?

  • JSON 또는 XML 데이터를 반환하는 RESTful API를 개발할 때
  • 모바일 앱, 프론트엔드(Vue.js, React 등)와 통신하는 백엔드를 개발할 때