스프링의 기본과 MVC에 대해 요즘 집중적으로 공부하고 있다.
공부를 하다가 쉽긴 하지만 Controller와 RestController에 대해 더 확실하게 이해하고 넘어가고 싶어서 포스팅을 하게 되었다.
@Controller와 @RestController
이 두 어노테이션은 Spring에서 컨트롤러를 지정해주기 위한 어노테이션이다.
@Controller는 전통적인 Spring MVC 컨트롤러이고
@RestController는 RESTful 웹 서비스의 컨트롤러이다.
근데 이게 무슨 차이일까?
@Controller
@Controller는 Spring MVC에서 View(HTML)를 반환할 때 사용하는 어노테이션이다.
이 말은 브라우저에서 요청이 들어오면 Thymeleaf 같은 템플릿 엔진을 사용해서 HTML을 응답할 때 주로 사용한다는 뜻이다.
Controller가 View를 반환하기 위해서는 View Resolver가 사용되며, ViewResolver 설정에 맞게 View를 찾아 렌더링한다.
무슨 말이냐면
- 사용자가 웹사이트에서 요청(ex: "/home")을 보낸다.
- Controller가 요청을 받아서 "home" 이라는 화면 이름을 반환한다.
- ViewResolver라는 안내자가 등장해서 설정된 경로에서 home.html 같은 파일을 찾아낸다.
- 찾은 View 파일을 브라우저에 보여준다.
(1) 사용자가 /hello 요청을 했을 때 (2) message 값을 모델에 담아서 반환하여 (3) hello.html에서 message 값을 출력하는 예시 코드를 짜보겠다.
@Controller
public class PageController {
@GetMapping("/hello")
public String helloPage(Model model) {
model.addAttribute("message", "안녕하세요! Spring MVC입니다.");
return "hello"; // templates/hello.html 반환
}
}
@RestController
@RestController는 RESTful API를 만들 때 사용하는 어노테이션이다.
기본적으로 JSON 형식의 데이터를 반환한다.
클라이언트는 URI 형식으로 웹 서비스에 요청을 보내고 Mapping 되는 핸들러와 그 타입을 찾는 DispatcherServlet이 요청을 인터셉트 한다.
무슨 말이냐면
- 웹 사이트에서 특정 주소로 요청을 보내면 DispatcherServlet이라는 안내 데스크가 먼저 요청을 받는다.
- 요청을 보고 이 요청을 처리할 담당자(핸들러)를 찾는다.
- 담당자를 찾아서 요청을 전달하고 결과를 받아온다.
- 클라이언트에게 응답을 돌려준다.
이번엔 (1) 사용자가 /api/hello를 요청했을 때 (2) 컨트롤러가 문자열을 JSON 응답으로 반환하고 (3) 브라우저에서 요청하면 {"message":"하이! JSON 응답을 해볼게 ."} 가 출력되는 코드를 짜보겠다.
@RestController
public class ApiController {
@GetMapping("/api/hello")
public String helloApi() {
return "하이! JSON 응답을 해볼게.";
}
}
중요 차이
@controller는 View를 반환
@RestController는 데이터(JSON)을 반환.
@RestController는 @Controller + @Response와 같다.
@RestController를 표시하면 모든 메소드가 뷰가 아닌 객체로 작성된다는 특징이 있다.
@Controller
public class ExampleController {
@GetMapping("/greeting")
public String greetingPage(Model model) {
model.addAttribute("name", "홍성민");
return "greeting"; // greeting.html 페이지를 반환
}
}
이 @Controller를 사용하는 예제와
@RestController
public class ExampleRestController {
@GetMapping("/api/greeting")
public Map<String, String> greetingApi() {
Map<String, String> response = new HashMap<>();
response.put("message", "안녕하세요! JSON 응답입니다.");
return response; // JSON 데이터 반환
}
}
이 @RestController를 사용하는 예제를 비교하면
각각
<!-- greeting.html -->
<html>
<body>
<h1>안녕하세요! {{name}} 님</h1>
</body>
</html>
화면에서 "안녕하세요 홍성민 님" 표시.
JSON 데이터 반환.
@Controller에서 JSON을 반환하려면 @ResponseBody를 사용하면 된다.
응답이 가능하긴 하나 이럴거면 @RestController를 사용하는 것이 더 깔끔하다.
최종 정리
✅ @Controller → 웹페이지(HTML)를 반환할 때 사용
- 화면을 직접 보여줘야 할 때
- Thymeleaf, JSP, HTML 같은 템플릿 엔진과 함께 사용
- 예: 블로그, 쇼핑몰 웹사이트
✅ @RestController → JSON 데이터를 반환할 때 사용
- 모바일 앱이나 프론트엔드(React, Vue)와 데이터 주고받을 때
- REST API 개발할 때 사용
- 예: 회원 정보 제공, 상품 목록 조회 API
📄 HTML이 필요하면 @Controller,
📡 데이터(API)를 주고받아야 하면 @RestController 🚀
'Backend > Spring Boot' 카테고리의 다른 글
@Autowired 필드 명, @Qualifier, @Primary 정리 (0) | 2025.02.11 |
---|---|
@Configuration 없이 @Bean만 사용하면? (0) | 2025.02.09 |
싱글톤 패턴 (0) | 2024.10.14 |
스프링 컨테이너와 스프링 빈 (1) | 2024.10.13 |
JUnit5를 활용한 스프링 빈 조회 Test (0) | 2024.10.06 |