@Controller vs @RestController (+ ResponseEntity 사용하기)

박영준·2023년 1월 22일
0

Spring

목록 보기
5/58

ResponseEntity 에 대해 정리한 내용을 보고 싶다면 아래 링크로 이동
참고: ResponseEntity

@Controller & @RestController 공통점 / 차이점

공통점

  • Spring 에서 Controller 를 지정

  • 해당 클래스를 Bean 으로 등록

차이점


@Controller

전통적인 Spring MVC 의 Controller

1. 작동 방식

1) Controller 로 'View' 를 반환할 경우

@Controller는 주로 View를 반환하기 위해 사용한다.

① ~ ⑤ : Client에서 보낸 요청은 DispatcherServlet을 거쳐 HandlerMapping을 통해 Controller를 찾고 요청을 수행하게 된다.

⑥ ~ ⑦ : Controller는 받은 요청을 처리하고 난 뒤 ViewName을 반환한다.

⑧ ~ ⑩ : DispatcherServlet은 ViewResolver를 통해 ViewName에 해당하는 View를 찾아 사용자에게 반환한다.

2) Controller 로 'Data' 를 반환할 경우

ResponseEntity 를 사용하면 View 와 함께 Data(또는 객체)를 반환할 수도 있다.

  • @ResponseBody 어노테이션을 사용하면 View 와 함께 JSON 형태의 데이터도 반환할 수 있다.

2. 예시

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

    // 회원 가입
    @PostMapping("/signup")
    public ResponseEntity<MsgResponseDto> signup(@RequestBody @Valid SignupRequestDto signupRequestDto) {
        userService.signup(signupRequestDto);
        return ResponseEntity.ok(new MsgResponseDto("회원가입 완료", HttpStatus.OK.value()));
    }

    // 로그인
    @PostMapping("/login")
    public ResponseEntity<MsgResponseDto> login(@RequestBody LoginRequestDto loginRequestDto, HttpServletResponse response) {
        userService.login(loginRequestDto, response);
        return ResponseEntity.ok(new MsgResponseDto("로그인 완료",HttpStatus.OK.value()));
    }
}

@RestController

RESTful 웹 서비스의 Controller

참고: 웹 동작방식 이해하기 - RESTful API란?

1. 작동 방식

  • @RestController = @Controller + @ResponseBody

  • @Controller와 달리, 반환하려는 주류는 JSON 형태의 객체 데이터

  • REST API를 개발할 때 주로 사용

  • Header(HTTP 규격 구성 요소 中 하나)에 대해서 유연하게 설정을 할 수 없다

    • 이 문제들을 해결해주는 것이 ResponseEntity
      • 따라서, ResponseEntity 로 감싸서 주로 반환해주는 방식을 사용

2. 예시

@Controller
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;

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

참고: [Spring] @Controller와 @RestController 차이
참고: RestController 사용하기
참고: RESTful 하다?

profile
개발자로 거듭나기!

0개의 댓글