서론
Spring에서 클래스에 컨트롤러를 지정해주기 위한 애노테이션은 2가지가 있다.
이 2가지의 주요 차이점은 HTTP ResponseBody가 생성되는 방식, @Controller + @ResponseBody 조합이 @RestController라고 말할 수 있다.
오늘은 Controller에 대해 알아보자
@Controller
@Controller는 Spring MVC의 컨트롤러 애노테이션이며 주로 View(화면)을 반환하기 위해 사용한다.
@Controllerpublic
class TestController {
// @RequestMapping(value = "api/board/update", method = {RequestMethod.GET})
@GetMapping("api/board/update")
public String update() {
return "update";
}
}
- Controller가 View를 반환하는 과정
1. Client는 URL형식으로 요청을 보낸다.
2. DispatcherServlet이 요청을 위임할 Handler Mapping을 찾는다.
3. Handler Mapping을 통해 요청을 Contrller로 위임한다.
4. Controller는 요청을 처리한 후 View Name을 Handler Adapter한테 반환한다.
5. Handler Adpater는 이걸 DispatcherServlet한테 반환한다.
6. DisPatcherServlet은 View Resolver를 통해 View Name에 해당하는 View를 찾아서 Client한테 반환한다.
위의 과정을 거치면서 View를 찾아서 렌더링 하는 과정을 거치게 됩니다.
하지만 Spring MVC의 컨트롤러를 사용할 때 Data를 반환해야 하는 경우도 있다.
이는 @ResponseBody라는 애노테이션을 활용해 JSON 형태의 데이터를 반환할 수 있다.
- Controller가 데이터를 반환하는 과정
1. Client는 URL형식으로 요청을 보낸다.
2. DispatcherServlet이 요청을 위임할 Handler Mapping을 찾는다.
3. Handler Mapping을 통해 요청을 Controller로 위임한다.
4. Controller는 요청을 처리한 후 객체를 반환한다.
5. 반환되는 객체는 JSON으로 직렬화(Serialize)되어서 Client 반환된다.
컨트롤러를 통해 객체(데이터)를 반환할 때 일반적으로 ResponseEntity가 감싸서 반환한다.
그리고 객체를 반환하기 위해서 View를 반환할 때 사용한 View Resolve 말고 HttpMessageConverter가 동작한다.
HttpMessageConverter에는 여러 Converter가 있는데 반환하는 데이터에 따라 사용되는 Converter가 다르다.
단순 문자열인 경우 StringHttpMessageConverter, 객체인 경우 MappingJackson2HttpMessageConverter가 사용된다.
Spring은 클라이언트의 'Http Accept Header'와 '서버의 컨트롤러 반환 타입' 정보 2개를 조합해 적절한 HttpMessageConverter를 선택해 처리한다.
MessageConverter가 동작하는 시점은 HandlerAdapter와 Controller가 요청받는 시점 4번인 시점에서 동작한다.
@Controller
@RequiredArgsConstructor
public class Test {
private final MemberService memberService;
@GetMapping("/api/member/board")
public @ResponseBody ResponseEntity<Member> findMember(@RequestParam("id") Long id){
return ResponseEntity.ok(memberService.findMember(member));
}
}
findMember()는 member라는 객체를 ResponseEntity로 감싸서 반환하고 Member를 JSON으로 반환하기 위해
@ResponseBody 애노테이션을 붙여준다.
'🌠Development > SpringBoot' 카테고리의 다른 글
[Spring Boot] Optional (0) | 2024.07.17 |
---|---|
[Spring Boot] @RestController (0) | 2024.04.10 |
[Spring Security] 10 - csrf enable 설정 방법 (0) | 2024.02.26 |
[Spring Security] 09 - 세션 설정 (0) | 2024.02.26 |
[Spring Securitiy] 08 - 세션 정보 확인 (0) | 2024.02.25 |