스프링에서 컨트롤러를 지정해 주기 위한 어노테이션은 @Controller, @RestController가 있다.
둘을 쉽게 생각하면 @RestController == @Controller + @ResponseBody이다.
@Controller
전통적인 Spring MVC의 컨트롤러 어노테이션인 @Controller는 주로 View를 반환하기 위해 사용된다.
1. 클라이언트는 URL형식으로 요청을 보낸다.
2. DispatcherServlet이 요청을 위임할 Handler Mapping을 찾는다.
3. Handler Mapping을 통해 요청을 Controller로 위임한다.
4. Controller는 요청을 처리한 후 View Name을 Handler Adapter한테 반환한다.
5. Handler Adapter는 이걸 DispatcherServlet한테 반환한다.
6. DispatcherServlet는 View Resolver를 통해 View Name에 해당하는 View를 찾아서 클라이언트한테 반환한다.
@Controller
public class BoardController {
@PostMapping("api/board/create")
public String create() {
return "create";
}
}
Controller로 Data를 반환해야 하는 경우도 있다.
이 경우에는 @ResponseBody를 활용하여 Json 형태로 데이터를 반환할 수 있다.
- 클라이언트는 URI 형식으로 웹 서비스에 요청을 보낸다.
- DispatcherServlet이 요청을 처리할 대상을 찾는다.
- HandlerAdapter을 통해 요청을 Controller로 위임한다.
- Controller는 요청을 처리한 후에 객체를 반환한다.
- 반환되는 객체는 Json으로 직렬화(Serialize)되어 사용자에게 반환된다.
- 컨트롤러를 통해 객체를 반환할 때 일반적으로 ResponseEntity로 감 써서 반환한다.
- 객체를 반환하기 위해서 View를 반환할 때 사용된 View Resolver 대신 HttpMessageConverter가 동작한다.
- HttpMessageConverter에는 여러 Converter가 등록되어 있고, 반환하는 데이터에 따라 사용되는 Converter가 달라짐
- 단순 문자열은 StringHttpMessageConverter
- 객체인 경우는 MappingJackson2HttpMessageConverter
- 데이터의 종류에 따라 서로 다른 MessageConverter가 작동하게 됨
- 스프링은 클라이언트의 Http Accept Header와 서버의 컨트롤러 반환타입 정보 2개를 조합해서 적절한
- MessageConverter를 선택하여 처리함
- HttpMessageConverter가 동작하는 시점은 HandlerAdapter와 Controller가 요청을 주고받는 시점이다.
- 위 그림의 4번에서는 메서지 -> 객체
- 위 그림 6번에서는 객체 -> 메시지
@Controller
@RequiredArgsConstructor
public class MemberController {
private final MemberService memberService;
@GetMapping("api/board/member")
public @ResponseBody ResponseEntity<Member> findMember(@RequestParam("id") String id) {
return ResponseEntity.ok(memberService.findMember(member));
}
}
findMember()는 Member라는 이름을 가진 객체를 ResponseEntity로 감 써서 반환
Member를 Json으로 반환하기 위해 @ResponseBody가 추가됨
하지만 데이터를 반환하는 Controller와 View를 반환하는 Controller를 분리해서 작성하는 것이 좋은 방법이다.
@RestController
Restful Web Service에서 사용되는 컨트롤러 어노테이션
@Controller + @ResponseBody가 합쳐진 형태로 Json형태의 객체 데이터를 반환
- 클라이언트는 URI 형식으로 웹 서비스에 요청을 보낸다.
- DispatcherServlet이 요청을 처리할 대상을 찾는다.
- HandlerAdapter을 통해 요청을 Controller로 위임한다.
- Controller는 요청을 처리한 후에 객체를 반환한다.
- 반환되는 객체는 Json으로 직렬화(Serialize)되어 사용자에게 반환된다.
@RestController
@RequiredArgsConstructor
public class MemberController {
private final MemberService memberService;
@GetMapping("api/board/member")
public Member findMember(@RequestParam("id") String id) {
return memberService.findMember(member);
}
@GetMapping("api/board/member")
public ResponseEntity<Member> findMemberResponseEntity(@RequestParam("id") String id) {
return ResponseEntity.ok(memberService.findMember(member));
}
}
findMember는 Member 객체를 그대로 반환
이러한 경우의 문제는 클라이언트가 예상하는 HttpStatus를 설정해 줄 수 없다.
그래서 객체를 상황에 맞는 ResponseEntity로 감싸서 반환해주어야 합니다.
정리
- @Controller와 @RestController의 차이점은 용도이다.
- @Controller는 Spring 2.5에 추가
- @RestController는 Spring 4.0에 추가
- 과거에는 JSP, HTML과 같은 View를 전달해 주었기에 주로 @Controller를 사용
- 최근에는 Frontend/Backen가 나뉘기에 Backend에서 Rest Api를 통해 Json으로 데이터를 전달 -> @RestController
'Spring' 카테고리의 다른 글
@Bean,@Configuration,@Component 차이점 (0) | 2023.05.05 |
---|---|
@RequestBody, @ModelAttribute, @RequestParam의 차이 (0) | 2023.05.04 |
Servlet, Spring MVC 정리 (0) | 2023.01.30 |
Spring Security + JWT 회원가입, 로그인 기능 구현 (7) | 2023.01.17 |
빈의 생명주기 (1) | 2023.01.03 |