📌 @Controller와 @RestController의 역할
스프링 환경에서 Controller를 구현해보자.
Controller를 구현하기 위해서는 클래스에 @Controller와 @RestController을 붙여 줘야 한다.
두 컨트롤러는 요청이 들어오면 URL, HTTP Method에 맞게 메서들를 실행시켜 주는 역할을 수행한다.
두 어노테이션의 차이점을 보기 위해 어노테이션을 뜯어(?) 보았다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
@AliasFor(annotation = Component.class)
String value() default "";
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
@AliasFor(annotation = Controller.class)
String value() default "";
}
사실 친절하게 영어로 주석이 달려있었고 해석해 보면 아래와 같다.
@RestController은 자체적으로 @Controller와 @ResponseBody 어노테이션을 포함한 간편한 어노테이션입니다. 이 어노테이션을 사용한 클래스는 기본적으로 @ResponseBody의 의미를 가지며, @RequestMapping 메서드들은 응답으로 JSON 또는 XML과 같은 데이터 형식을 반환할 것으로 가정합니다.
코드에서도 볼 수 있듯이 @RestController는 내부에 @Controller와 @ResponseBody를 포함하고 있다.
간단히 "@RestController는 @Controller + @ResponseBody 의 기능을 가지고 있다" 라고 생각할 수 있다.
각각은 아래와 같은 기능을 담당한다.
- @Controller
- "해당 클래스는 컨트롤러의 역할을 수행하는 클래스입니다."라고 지정한다.
- 요청받은 URL, Method 정보를 메서드와 매칭한다.
- 응답값으로는 '웹 페이지'를 렌더링 하기 위한 HTML 뷰를 반환한다.
- "해당 클래스는 컨트롤러의 역할을 수행하는 클래스입니다."라고 지정한다.
- @ResponseBody
- 컨트롤러 역할을 수행 + "해당 메서드가 반환하는 값은 HTTP 응답의 본문(body)으로 사용되어야 합니다."라고 지정한다.
- json/xml 형태의 데이터를 반환하고, 이 데이터가 HTTP응답 메시지의 body 부분에 포함된다.
@Controller와 @ResponseBody 사용 예시
@Controller
public class DemoController {
@GetMapping(path = "/test")
@ResponseBody
public String test() {
return "test";
}
}
"test"라는 데이터가 응답 본문에 실리고, 검색창에 localhost:8080/test라고 요청하면 GET요청이 보내지고 화면에 응답결과가 출력된다.
@RestController 사용예시
@RestController
public class DemoController {
@GetMapping(path = "/test")
public String test() {
return "hello - RestController";
}
}
📌 @RequestMapping과 @GetMapping의 역할
위의 예시에서 @GetMapping을 사용하였는데, @GetMapping을 뜯어(?) 보면 아래처럼 @RequestMapping에서 Method는 GET을 사용한다고 지정해주고 있다.
즉, @GetMapping은 @RequestMapping에서 "GET HTTP Method와 매칭되는 요청만 받겠다"라는 의미이다.
// @GetMapping은 GET방식인 @RequestMapping 이다.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = RequestMethod.GET)
public @interface GetMapping {
...
}
아래의 3가지 예시는 URL과 HTTP Method에 맞게 요청이 들어오면 각각 "test1", "test2", "test3"를 응답하도록 하는 코드이다.
추가로 2번의 예시는 HTTP Method를 지정해주지 않았기 때문에 어떤 HTTP Method에도 매칭된다.
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
// 1번
@GetMapping(path = "/test1")
public String test1() {
return "test1";
}
// 2번 -> HTTP Method를 지정해주지 않았으므로 어떤 HTTP Method도 매칭된다.
@RequestMapping(path = "/test2")
public String test2() {
return "test2";
}
// 3번
@RequestMapping(method = RequestMethod.GET, path = "/test3")
public String test3() {
return "test3";
}
}
@GetMapping 이외에도 @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping을 통해 요청 Method에 맞게 매칭해 줄 수 있다.
'Spring' 카테고리의 다른 글
[Spring] HTTP method (0) | 2023.11.06 |
---|---|
[Spring] 스프링 빈과 의존성 주입 해보기 (0) | 2023.11.03 |
[Spring] Controller, Service, Repository 3계층의 역할 (0) | 2023.10.31 |
[Spring] 의존성 주입과 제어의 역전 (0) | 2023.10.30 |
[네트워크] API와 REST API (0) | 2023.10.27 |