[Spring] Controller와 RestController

유아 Yooa·2023년 5월 19일
0

Spring

목록 보기
2/18
post-thumbnail

주요한 차이점

HTTP Response Body가 생성되는 방식

@Controller

View 반환하기

  • 주로 View를 반환하기 위해 사용한다.
  • Client의 요청으로부터 View를 반환한다.
  • Controller가 반환한 뷰의 이름으로 View를 랜더링하기 위해서 ViewResolver가 사용되며, View Resolver 설정에 맞게 View를 찾아 랜더링한다.

View 반환 과정 살펴보기👀


1. Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
2. DispatcherServlet이 요청을 위임할 HandlerMapping을 찾는다.
3. HandlerMapping을 통해 요청을 Controller로 위임한다.
4. Controller는 요청을 처리한 후에 ViewName을 반환한다.
5. DispatcherServlet은 ViewResolver를 통해 ViewName에 해당하는 View를 찾아 사용자에게 반환한다.

Data 반환하기

  • 데이터를 반환하기 위해 @ResonseBody 어노테이션을 활용하여 json 형태로 데이터를 반환할 수 있다.

Data 반환 과정 살펴보기👀


1. Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
2. DispatcherServlet이 요청을 위임할 HandlerMapping을 찾는다.
3. HandlerMapping을 통해 요청을 Controller로 위임한다.
4. Controller는 요청을 처리한 후에 객체를 반환한다.
5. 반환되는 객체는 json으로 serialize 되어 사용자에게 반환된다.

  • Controller를 통해 객체를 반환할 때에는 일반적으로 ResponseEntity로 감싸서 반환된다.
  • 객체를 반환하기 위해서는 viewResolver 대신 HttpMessageConverter가 동작한다.
  • HttpMessageConverter에는 여러 Converter가 등록되어 있고, 반환해야 하는 데이터에 따라 사용되는 Converter가 달라진다.
    - 단순 문자열 : StringHttpMessageConverter
    • 객체 : MappingJackson2HttpMessageConverter
  • Spring은 클라이언트의 HTTP Accept 헤더와 서버의 Controller 반환 타입 정보를 조합하여 적합한 HttpMessageConverter를 선택하여 처리한다.
@Controller
@RequiredArgsConstructor
public class UserController {
	private final UserService userService;

	// Data 반환
	@GetMapping(value = "/users")
	public @ResponseBody ResponseEntity<User> findUser(@RequestParam("userName") String userName){
	return ResponseEntity.ok(userService.findUser(user));
	}

	// View 반환
	@GetMapping(value = "/users/detailView")
	public String detailView(Model model, @RequestParam("userName") String userName){
		User user = userService.findUser(userName);
		model.addAttribute("user", user);
		return "/users/detailView";
	}
}

@RestController

  • @Controller에서 리턴값에 자동으로 @ResponseBody가 붙어서 HTTP 응답 데이터에 Java 객체가 Mapping되어 전달된다. json 형태로 객체 데이터를 반환한다.

Data 반환 과정 살펴보기👀


1. Client는 URI 형식으로 웹 서비스에 요청을 보낸다.
2. DispatcherServlet이 요청을 위임할 HandlerMapping을 찾는다.
3. HandlerMapping을 통해 요청을 Controller로 위임한다.
4. Controller는 요청을 처리한 후에 객체를 반환한다.
5. 반환되는 객체는 json으로 serializa 되어 사용자에게 반환된다.

@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {
	private final UserService userService;

	@GetMapping(value = "/users")
	public User findUser(@RequestParam("userName") String userName){
		return userService.findUser(user);
	}
	
	@GetMapping(value = "/users")
	public ResponseEntity<User> findUserWithResponseEntity(@RequestParam("userName") String userName){
	return ResponseEntity.ok(userService.findUser(user));
	}
}
  • findUser 메서드는 User 객체를 그대로 반환한다. 이러한 경우에는 클라이언트가 예상하는 HttpStatus(e.g. 404)를 설정해줄 수 없다.
  • 그렇기에 객체를 상황에 맞게 ResponseEntity로 감싸서 반환해주는 것이 좋다.
profile
기록이 주는 즐거움

0개의 댓글