[Spring] Spring의 기본 동작 과정과 @Controller와 @RestController의 차이

정민규·2023년 9월 5일
0

최근 스프링을 공부하기 시작하면서, 간단한 CRUD 페이지를 만들어 보고 있다.
아무래도 스프링의 동작 원리를 제대로 모른 상태에서 만들다보니, 아무래도 궁금한 점이 많이 생기는 것 같다.

@Controller
public class HiController {
    @GetMapping("/hi")
    public String hi() {
        return "hi";
    }
}

위 코드는 /higet 요청이 왔을 때, hi.html이라는 파일을 요청자에게 전달해준다.
이렇게 간단한 코드만으로도 사용자에게 hi.html이라는 화면을 띄워줄 수 있는 것이다.

하지만 아무래도 저 코드 외에 다른 부분은 내가 작성한 코드가 아니다보니, 내부적으로 어떤 과정을 거치게 되는지 이해해야겠다는 생각이 들었다.

@Controller

위 과정(도메인/hi 로 접속을 시도)을 거치는 경우, 스프링의 내부에서는 다음과 같은 과정을 거치게 된다.

이미지 출처 : @Controller와 @RestController 차이 - 망나니개발자

  1. DispatcherServlet이 클라이언트의 요청을 일단 받는다.
  2. DispatcherServlet이 받은 요청을 처리할 적절한 Controller를 찾는다.
    (위 코드에서 @GetMapping("/hi")를 붙여준 이유.)
  3. HandlerAdpater가 요청을 이전에 찾은 Controller에게 넘겨준다.
  4. Controller가 적절한 로직을 처리한다.
  5. Controller가 ViewName을 반환한다.
  6. DispatcherServlet이 ViewResolver에게 ViewName을 넘겨준다.
  7. ViewResolver가 적절한 View를 생성하고, 이를 다시 DispatcherServlet에게 반환한다.

위 과정은 Controller가 View를 반환하는 과정이다.
위 코드에서는 hi.html 파일이 클라이언트에게 전달되어 표시될 것이다.

@Controller 클래스 메소드의 리턴값이 될 수 있는 것은 다음과 같다.

  1. String : (리턴값).html, (리턴값).jsp 등이 View가 된다.
  2. void : 호출하는 URL과 동일한 이름의 html, jsp 등이 View가 된다.
  3. ModelAndView : ModelAndView 클래스의 생성자, setViewName() 메소드로 뷰의 이름을 정하거나, addObject() 메서드로 데이터를 저장하는 등 자유도가 조금 더 높다.

이 외에도 몇개 더 있는데, https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/return-types.html을 참고해보자.

@RestController

하지만 백엔드 개발을 하다보면, 사용자에게 보이는 화면이 아니라 데이터를 반환해 주어야 하는 경우도 생긴다.(api 같은 경우)

이런 경우에는 메소드에 @ResponseBody 어노테이션을 추가하거나, 클래스의 @Controller 어노테이션을 @RestController 어노테이션으로 교체해 주면 가능하다.

@RestController
public class HiController {
    @GetMapping("/hi")
    public String hi() {
        return "hi";
    }
}

이미지 출처 : @Controller와 @RestController 차이 - 망나니개발자

  1. DispatcherServlet이 클라이언트의 요청을 일단 받는다.
  2. DispatcherServlet이 받은 요청을 처리할 적절한 Controller를 찾는다.
    (위 코드에서 @GetMapping("/hi")를 붙여준 이유.)
  3. HandlerAdpater가 요청을 이전에 찾은 Controller에게 넘겨준다.
  4. Controller가 적절한 로직을 처리한다.
  5. Controller가 Response에 필요한 데이터(Response Entity)를 반환한다.

위 과정은 Controller가 단순 데이터를 반환해 주는 과정이다.
위 코드에서는 클라이언트에게 hi라는 단순한 문자열이 전달되고, 클라이언트의 브라우저에는 hi라는 두 글자만 띄워지게 될 것이다.

앞서 살펴본 View를 반환하는 과정과 거의 비슷하지만, View를 반환하는 것이 아닌, 데이터 그 자체를 반환하면 되므로 ViewResolver에게 ViewName을 전달하고, View를 반환받는 과정이 사라져있다.

또한, 여기서 RestController 클래스의 메소드에서 반환하는 리턴타입은 다음과 같다.
1. String : 단순 문자열 데이터로서 반환된다.
2. Object : JSON 또는 XML로 변환되어 반환된다.

참고자료
@Controller와 @RestController 차이 - 망나니개발자

profile
조금이더라도 꾸준하게.

0개의 댓글