코딩 이래요래
@Controller vs @RestController 본문
@Controller?? @RestController??
Spring MVC에서 클라이언트의 요청을 처리하는 흐름을 @Controller와 @RestController를 이용해 처리할 수 있음
두 어노테이션의 특징과 차이점을 알아보자
📦 @RequestBody, @ResponseBody
클라이언트와 서버 간의 소통을 위해 body(본문)에 데이터를 담아 보내야 하는데, 이때 클라이언트가 서버로 요청할 때 본문에 담은 데이터를 Request Body, 서버가 클라이언트로 응답할 때 본문에 담은 데이터를 Response Body라고 부름
요즘은 거의 표준처럼 JSON(JavaScript Object Notation) 형식을 사용함
📌 @RequestBody
클라이언트가 보낸 JSON 데이터를 자바 객체로 변환해주는 역할
📌 @ResponseBody
자바 객체를 JSON 데이터로 바꿔서 클라이언트로 응답해주는 역할
🎯 @Controller vs @RestController
둘 다 Spring MVC에서 컨트롤러로 인식되도록 해주는 어노테이션임. 가장 큰 차이점은 View를 반환하느냐, JSON 데이터를 반환하느냐에 있음
- @Controller는 기본적으로 View를 반환하는 데 쓰이고
- @RestController는 데이터를 반환하는 데 쓰임 (내부적으로 @ResponseBody 포함)
📎 참고로 두 어노테이션 다 @Component를 포함하고 있어서 Spring Bean으로 등록됨
✅ @Controller 예제 (View 반환)
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("message", "안녕하세요");
return "hello"; // hello.html이라는 View 파일을 찾아서 렌더링함
}
}
- /hello로 접속하면 resources/templates/hello.html 뷰를 렌더링함 (Thymeleaf 기준)
- Model을 통해 데이터를 View에 전달함
💡 @Controller는 보통 View를 반환하지만 메소드 레벨의 @ResponseBody 어노테이션을 사용하면 JSON으로 반환할 수 있음
✅ @RestController 예제 (JSON 반환)
@RestController
public class HelloRestController {
@GetMapping("/hello")
public String hello() {
return "안녕하세요"; // 클라이언트에게 JSON 응답으로 "안녕하세요" 전달됨
}
}
- /hello로 접속하면 화면 없이 응답 본문에 문자열이 JSON처럼 직접 출력됨 (text/plain 또는 application/json)
- 프론트엔드나 외부 API 클라이언트가 데이터를 받아가기에 적합함
🌐 Spring 요청 처리 구조 흐름도 (요약)
- 클라이언트의 요청은 DispatcherServlet을 거침
- HandlerMapping을 통해 알맞은 Controller를 찾아 요청을 수행함
- Controller는 받은 요청을 처리하고 (Service > Repository > DB) 결과를 반환함
- 반환 값이
- View를 반환할 때
- 논리 View 이름(String)을 반환함
- DispatcherServlet은 ViewResolver를 통해 논리 View 이름에 해당하는 View를 찾아 클라이언트에 반환함
- 자바 객체를 반환할 때
- DispatcherServlet은 HttpMessageConverter를 호출함
- HttpMessageConverter는 자바 객체를 HTTP 응답 메시지의 Body에 넣을 수 있도록 JSON 등으로 변환해줌
- View를 반환할 때
'위클리 페이퍼' 카테고리의 다른 글
위클리 페이퍼 8주차 (3) | 2025.05.30 |
---|---|
위클리 페이퍼 - 7주차 (3) | 2025.05.25 |
AOP (Aspect Oriented Programming) (0) | 2025.05.18 |
Spring Boot에서 사용되는 다양한 Bean 등록 방법 (0) | 2025.04.29 |
Web Server ?? Web Application Server?? (0) | 2025.04.29 |