Spring Web - Controller와 RestController

Dong·2024년 12월 5일
0

Spring

목록 보기
8/8
post-thumbnail

  • 어노테이션 간단 비교:
    • @Controller = 웹 페이지 반환용 컨트롤러.
    • @RestController = 데이터(JSON/XML) 반환용 컨트롤러 (@Controller + @ResponseBody).

1. @Controller

  • 역할: 웹 애플리케이션에서 뷰(View)를 반환하기 위한 컨트롤러로 사용됨 (MVC 패턴의 뷰를 뜻함)
  • 주요 특징:
    • 메서드의 반환값은 뷰의 이름(String)이 되며, 뷰 리졸버(View Resolver)를 통해 실제 뷰(예: JSP, Thymeleaf 템플릿)가 렌더링된다.
    • 모델(Model) 객체를 사용하여 뷰에 데이터를 전달할 수 있다.
  • 사용 예시:
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.GetMapping;
    
    @Controller
    public class PageController {
    
        @GetMapping("/welcome")
        public String welcomePage(Model model) {
            model.addAttribute("message", "안녕하세요, Spring Boot!");
            return "welcome"; // templates/welcome.html 뷰를 반환
        }
    }
    
    • 이 경우 /welcome 요청이 들어오면 welcome.html 뷰를 렌더링하고, 모델에 담긴 데이터를 뷰에 전달함

2. @RestController

  • 역할: RESTful 웹 서비스를 구축하기 위한 컨트롤러로 사용됨
  • 주요 특징:
    • @Controller@ResponseBody를 합쳐 놓은 어노테이션이다.
    • 메서드의 반환값은 뷰가 아닌 HTTP 응답 본문(body)에 직접 작성한다.
    • 주로 JSON 또는 XML 형태의 데이터를 반환하며, 클라이언트와 데이터 교환을 위해 사용된다.
  • 사용 예시:
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class ApiController {
    
        @GetMapping("/api/greeting")
        public Greeting greeting() {
            return new Greeting("안녕하세요, Spring Boot!");
        }
    }
    
    class Greeting {
        private String message;
    
        public Greeting(String message) {
            this.message = message;
        }
    
        // Getter and Setter
        public String getMessage() {
            return message;
        }
    
        public void setMessage(String message) {
            this.message = message;
        }
    }
    
    • 이 경우 /api/greeting 요청에 대해 Greeting 객체가 JSON 형식으로 변환되어 응답 본문에 포함됨

3. 주요 차이점 정리

특징@Controller@RestController
응답 방식뷰(View) 이름을 반환하여 UI를 렌더링객체를 반환하여 JSON/XML 형태로 응답 본문에 작성
주요 용도웹 페이지 렌더링 (HTML, JSP 등)RESTful API 개발 (데이터 통신)
필요한 추가 어노테이션JSON 등을 반환하려면 메서드에 @ResponseBody 필요@ResponseBody가 포함되어 있어 추가 어노테이션 불필요
예시템플릿 엔진과 함께 사용하는 웹 애플리케이션모바일 앱이나 프론트엔드와 통신하는 백엔드 API 서버

4. 실용적인 사용 팁

  • 웹 페이지를 반환하는 경우:
    • 템플릿 엔진(Thymeleaf, JSP 등)을 사용하여 HTML 페이지를 렌더링해야 한다면 @Controller를 사용
    • 뷰 템플릿 파일의 이름을 반환하고, 모델에 데이터를 담아 전달합
  • JSON 또는 XML 데이터를 반환하는 경우:
    • RESTful API를 개발하거나 클라이언트와 데이터를 주고받아야 한다면 @RestController를 사용해야한다.
    • 객체나 컬렉션을 반환하면 자동으로 JSON 또는 XML로 직렬화되어 응답에 포함됨.

5. 추가 예제

5.1 @Controller로 JSON 데이터 반환하기

@Controller를 사용하면서 JSON 데이터를 반환하려면 메서드에 @ResponseBody 어노테이션을 추가하면 된다.

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class ApiController {

    @GetMapping("/api/data")
    @ResponseBody
    public Data getData() {
        return new Data("데이터입니다.");
    }
}

class Data {
    private String content;

    public Data(String content) {
        this.content = content;
    }

    // Getter and Setter
    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}
  • @ResponseBody를 통해 메서드의 반환값이 뷰가 아닌 응답 본문에 직접 작성됨.
  • 그러나 이럴 경우 @RestController를 사용하는 것이 더 간결하다

5.2 @RestController로 뷰 반환하려는 경우

@RestController는 뷰 이름을 반환하더라도 뷰 리졸버가 동작하지 않는다고 한다. 따라서 뷰를 렌더링하려면 @Controller를 사용해야 한다.


6. 요약

  • @Controller:
    • 뷰 템플릿을 사용하여 웹 페이지를 반환할 때 사용.
    • 메서드의 반환값은 뷰의 이름이며, 모델 데이터를 뷰로 전달 가능.
    • 데이터가 아닌 UI를 렌더링해야 하는 경우 적합.
  • @RestController:
    • RESTful 웹 서비스를 구축할 때 사용.
    • 메서드의 반환값은 JSON 또는 XML 등의 데이터로 직렬화되어 응답 본문에 포함.
    • 별도의 뷰 없이 데이터 자체를 클라이언트에 전달할 때 적합.

7. 선택 가이드

  • 웹 페이지를 제공하는 애플리케이션:
    • 사용자에게 HTML 페이지를 렌더링해야 한다면 @Controller를 사용.
    • 예: 전통적인 MVC 웹 애플리케이션.
  • RESTful API 서버:
    • 프론트엔드 애플리케이션(React, Angular 등)이나 모바일 앱에 데이터를 제공해야 한다면 @RestController를 사용
    • 예: JSON 기반의 API 서버.

8. 추가 참고

profile
소통을 잘하는 백엔드 개발자가 되기 위해, 꾸준히 성장하고 기록중입니다.

0개의 댓글