Spring의 Controller 반환 방식

민준·2025년 3월 4일
post-thumbnail

Spring에서 Controller가 요청을 처리한 후 반환하는 데이터는 DispatcherServlet(Front Controller)에 의해 처리되며, 반환 타입에 따라 다르게 동작한다.


1. 웹 페이지(HTML) 반환 - View 반환 (ViewResolver 사용)

DispatcherServlet이 ViewResolver를 사용하여 HTML을 반환
웹 페이지를 반환할 때는 ViewResolver가 사용되며, Controller에서 다음과 같은 방식으로 반환할 수 있다.

1.1. 문자열(String) 반환 → 정적 페이지

개념

  • Controller가 String을 반환하면, Spring은 이를 View 이름으로 간주하여 해당 HTML을 찾아 렌더링한다.

  • 예시 코드

    @Controller
    public class PageController {
       @RequestMapping("/home")
       public String home() {
           return "home";  // home.html 또는 home.jsp를 찾아 렌더링
       }
    }

동작 원리

  1. DispatcherServlethome이라는 View 이름을 받음
  2. ViewResolverhome.html을 찾아서 렌더링
  3. 사용자에게 해당 HTML을 응답

1.2. ModelAndView 반환 → 동적 페이지

개념

  • Controller가 ModelAndView를 반환하면, View뿐만 아니라 데이터를 함께 전달할 수 있다.

  • 예시 코드

    @Controller
    public class PageController {
       @RequestMapping("/user")
       public ModelAndView user() {
           ModelAndView mav = new ModelAndView("user"); // user.html을 View로 설정
           mav.addObject("name", "John Doe"); // Model 데이터 추가
           return mav;
       }
    }

동작 원리

  1. ModelAndView 객체를 반환 (View 이름: user.html, Model 데이터: name)
  2. ViewResolveruser.html을 찾아서 name 데이터를 적용
  3. 사용자에게 렌더링된 HTML 반환

2. JSON 반환 - 데이터 반환 (MessageConverter 사용)

개념

DispatcherServlet이 HttpMessageConverter를 사용하여 JSON 반환
웹 API에서는 JSON 데이터를 반환해야 하는 경우가 많으며, @ResponseBody를 사용하면 ViewResolver를 거치지 않고 JSON 데이터를 반환한다.

2.1. @Controller vs @RestController

1). @Controller

  • 기본적으로 View(HTML, JSP 등) 를 반환하는 컨트롤러를 만들 때 사용
  • 메서드에서 반환하는 값이 ViewResolver 를 통해 특정 HTML 파일로 매핑됨
  • JSON 데이터를 반환하려면 @ResponseBody 를 메서드마다 추가해야 함
// 기존 방식 (매 메서드마다 @ResponseBody 추가해야 함)
@Controller
public class IndexController {

    @ResponseBody // JSON 응답을 위해 필요
    @RequestMapping(method = RequestMethod.GET, value = "/")
    public String index() {
        return "index.html";
    }
}

2). @RestController

  • REST API 를 개발할 때 사용
  • 메서드가 반환하는 값이 자동으로 JSON 변환되어 응답
  • 클래스에 @RestController 를 붙이면 내부 모든 메서드에 @ResponseBody 를 붙인 것과 동일
// @RestController 사용 (모든 메서드가 자동으로 JSON 반환)
@RestController
public class IndexController {
    
    @RequestMapping(method = RequestMethod.GET, value = "/")
    public String index() {
        return "index.html";
    }
}

@Controller vs @RestController 동작원리

http://localhost:8080/ 에 접근
(1). @Controller + @ResponseBody 사용 시 → "index.html"(문자열) 반환
(2). @RestController 사용 시 → 동일하게 "index.html"(문자열) 반환

즉, @RestController 는 @Controller + @ResponseBody 를 합친 개념이며, JSON 데이터를 반환하는 API 를 만들 때 유용함


2.2. JSON 데이터 반환 예제

@RestController // @Controller + @ResponseBody (자동 JSON 변환)
public class ApiController {
  @GetMapping("/api/user")
  public User getUser() {
      return new User("John", 25);
  }
}
class User {
  private String name;
  private int age;
  
  public User(String name, int age) {
      this.name = name;
      this.age = age;
  }
  
  // Getter & Setter 필수 (JSON 변환을 위해)
}

동작 원리

  1. @RestController 또는 @ResponseBody를 사용하여 JSON 응답을 명시
  2. DispatcherServletHttpMessageConverter를 사용하여 객체를 JSON으로 변환
  3. 응답 본문으로 JSON을 반환

출력 예시 (JSON 응답)

{
  "name": "John",
  "age": 25
}

3. HttpMessageConverter 사용 원리 (직렬화/역직렬화)

JSON ↔ Java 객체 변환을 담당하는 HttpMessageConverter
Spring에서는 HttpMessageConverter를 이용하여 요청 및 응답 데이터를 변환한다.

3.1. 직렬화 (Serialization) - Java 객체 → JSON

@ResponseBody
@RequestMapping("/json")
public User returnJson() {
    return new User("Alice", 30);
}

동작 원리

  1. Java 객체 User("Alice", 30) 반환
  2. HttpMessageConverter가 JSON으로 변환
  3. HTTP 응답 본문에 JSON으로 반환

3.2. 역직렬화 (Deserialization) - JSON → Java 객체

@PostMapping("/json")
public String receiveJson(@RequestBody User user) {
    return "Received user: " + user.getName();
}

동작 원리

  1. 클라이언트가 JSON 데이터를 요청 본문으로 전송
  2. HttpMessageConverter가 이를 Java 객체(User)로 변환
  3. Controller에서 변환된 객체 사용 가능

4. 다양한 HttpMessageConverter 구현체

Spring에서는 다양한 HttpMessageConverter를 제공하며, 요청의 Content-Type에 따라 자동으로 적용된다.

Converter미디어 타입 (Content-Type)설명
StringHttpMessageConvertertext/plain 또는 text/html문자열 반환 시
MappingJackson2HttpMessageConverterapplication/jsonJSON 데이터 변환
ByteArrayHttpMessageConverterapplication/octet-stream바이너리 데이터 전송 (파일 다운로드)
ResourceHttpMessageConverterimage/png, image/jpeg이미지 및 파일 반환

JSON 응답을 위한 기본 설정

@Bean
public MappingJackson2HttpMessageConverter jsonConverter() {
    MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
    converter.setSupportedMediaTypes(List.of(MediaType.APPLICATION_JSON));
    return converter;
}

5. 정리

Controller 반환 타입설명DispatcherServlet 처리 방식
String 반환정적 HTML 페이지ViewResolver 사용
ModelAndView 반환동적 HTML + 데이터ViewResolver 사용
@ResponseBody + 객체 반환JSON 데이터 반환MessageConverter 사용
  • 웹 페이지(HTML) 반환

    • String 또는 ModelAndView 반환 시, ViewResolver 사용하여 HTML 렌더링
  • JSON 데이터 반환

    • @ResponseBody 또는 @RestController 사용 시, MessageConverter가 JSON 변환
  • HttpMessageConverter 적용 원리

    • HttpMessageConverter요청과 응답 데이터 변환 (직렬화/역직렬화) 담당
    • 요청의 Content-Type에 따라 적절한 변환기 자동 적용

0개의 댓글