@Controller
Controller는 주로 View를 반환하기 위해 사용합니다.
아래의 과정으로 Spring MVC Container는 Client의 요청으로부터 View를 반환합니다.
1. Client는 URI 형식으로 웹 서비스에 요청을 보냅니다.
2. DispatcherServlet이 요청을 처리할 대상을 찾습니다.
3. HandlerAdapter을 통해 요청을 Controller로 위임합니다.
4. Controller는 요청을 처리한 후에 ViewName을 반환합니다.
5. DispatcherServlet은 ViewResolver를 통해 ViewName에 해당하는 View를 찾아 사용자에게 반환합니다.
Controller가 반환하는 뷰의 이름으로부터 View를 렌더링하기 위해서 ViewResolver가 사용됩니다.
ViewResolver 설정에 맞게 View를 찾아 렌더링 합니다.
Controller로 Data 반환하기
Spring MVC 컨트롤러를 사용하면서 Data를 반환해야 하는 경우가 있습니다.
컨트롤러에서는 데이터를 반환하기 위해 @ResponseBody 어노테이션을 활용해야 합니다.
이를 통해서 Controller도 Json 형태로 데이터를 반환할 수 있습니다.
1. Client는 URI 형식으로 웹 서비스에 요청을 보냅니다.
2. DispatcherServlet이 요청을 처리할 대상을 찾습니다.
3. HandlerAdapter를 통해 요청을 Controller로 위임합니다.
4. Controller는 요청을 처리한 후에 객체를 반환합니다.
5. 반환되는 객체는 Json으로 Serialize되어 사용자에게 반환됩니다.
컨트롤러를 통해 객체를 반환할 때는 일반적으로 ResponseEntity로 감싸서 반환합니다.
그리고 객체를 반환하기 위해서는 ViewResolver 대신에 HttpMessageConverter가 동작합니다.
HttpMessageConverter에는 여러 Converter가 등록되어 있고,
반환해야 하는 데이터에 따라 사용되는 Converter가 달라집니다.
단순 문자열인 경우에는 StringHttpMessageConverter가 사용되고,
객체인 경우에는 MappingJackson2HttpMessageConverter가 사용됩니다.
데이터 종류에 따라 서로 다른 MessageConverter가 작동하게 됩니다.
Spring은 클라이언트의 HTTP Accept 헤더와
서버의 컨트롤러 반환 타입 정보 둘을 조합해
적합한 HttpMessageConverter를 선택하여 이를 처리합니다.
MessageConverter가 동작하는 시점은 HandlerAdapter와 Controller가 요청을 주고 받는 시점입니다.
그림의 4번에서는 메시지를 객체로, 6번에서는 객체를 메시지로 변환하는데 메세지 컨버터가 사용됩니다.
@Controller 예제 코드
@Controller
@RequiredArgsConstructor
public class UserController {
@Autowired
private final UserService userService;
// view 불러오기 방식 1
@GetMapping(value = "/view")
public String detailView(){
return "/view";
}
// view 불러오기 방식 2
@GetMapping("view")
public String View(){
return "/view";
}
// RequestParam을 통해서 쿼리 파라미터로 전달된 userName 값을 메소드 파라미터로 받습니다.
@GetMapping(value = "/users")
@ResponseBody // 메소드가 반환하는 객체를 HTTP 응답 본문에 그대로 담아 반환
public ResponseEntity<User> findUser(@RequestParam String userName){
// HTTP 응답 상태 200(OK)과 함께 사용자가 조회된 User 객체를 반환합니다.
return ResponseEntity.ok(userService.findUser(userName));
}
}
@RestController
@RestController는 @Controller에 @ResponseBody가 추가된 것입니다.
RestController의 주용도는 View를 반환하는 것이 아닌 Json 형태로 객체 데이터를 반환하는 것입니다.
최근에 데이터를 응답으로 제공하는 REST API를 개발할 때 주로 사용합니다.
객체를 ResponseEntity로 감싸서 반환합니다.
이러한 이유로 동작 과정 역시 @Controller에 @ResponseBody를 붙인 것과 동일합니다.
1. Client는 URI 형식으로 웹 서비으세 요청을 보냅니다.
2. DispatcherServlet이 요청을 처리할 대상을 찾습니다.
3. HandlerAdapter을 통해 요청을 Controller로 위임합니다.
4. Controller는 요청을 처리한 후에 객체를 반환합니다.
5. 반환되는 객체는 Json으로 Serialize되어 사용자에게 반환됩니다.
@RestController 예제 코드
@RestController
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
/**
* 사용자 이름을 기반으로 사용자 정보를 조회하여 반환하는 API 엔드포인트.
* <p>
* 클라이언트에서 전달한 사용자 이름(userName)을 사용하여
* 해당 사용자의 정보를 조회하고, 조회된 사용자 정보를 직접 반환합니다.
* </p>
*
* @param userName 조회할 사용자의 이름
* @return 조회된 사용자 정보
*/
@GetMapping(value = "/users")
public User findUser(@RequestParam String userName){
return userService.findUser(userName);
}
/**
* 사용자 이름을 기반으로 사용자 정보를 조회하여 ResponseEntity로 반환하는 API 엔드포인트.
* <p>
* 클라이언트에서 전달한 사용자 이름(userName)을 사용하여
* 해당 사용자의 정보를 조회한 후, HTTP 응답 상태 코드 200(OK)과 함께
* 사용자 정보를 ResponseEntity로 래핑하여 반환합니다.
* </p>
*
* @param userName 조회할 사용자의 이름
* @return 200 OK 상태 코드와 함께 반환된 사용자 정보가 포함된 ResponseEntity
*/
@GetMapping(value = "/users")
public ResponseEntity<User> findUserWithResponseEntity(@RequestParam String userName){
return ResponseEntity.ok(userService.findUser(userName));
}
}
'Devlopment > Spring' 카테고리의 다른 글
[Spring/JPA] JPA Entity 연관 관계 (0) | 2024.11.17 |
---|---|
[SpringBoot] sts4 프로젝트 생성 및 환경설정 (0) | 2024.04.04 |
[Springboot] 스프링 입문 - 스프링 빈과 의존 관계 (1) | 2024.04.01 |
[SpringBoot] 스프링 입문 - 회원 관리 예제 백엔드 개발 (0) | 2024.03.31 |
[SpringBoot] 스프링 입문 - 스프링 웹 개발 기초 (0) | 2024.03.31 |