저번 과제에서는 레이어드 아키텍처상에서 Controller의 역할에 대해 정리하였는데 이번엔 직접 구현하면서 Controller가 어떻게 사용되는지 알아보도록 하자.
스프링 부트에서는 Controller를 선언하는 어노테이션은 두 가지이다.
- @Controller
- @RestController
@Controller
public class TestController {
@GetMapping("/test")
public String getTest(){
return "TEST";
}
}
@RestController
public class TestController {
@GetMapping("/test")
public String getTest(){
return "TEST";
}
}
위 코드를 실행시켜 보면 @Controller는 404 오류가 발생하고 @RestController는 화면이 정상적으로 표기된 것을 알 수 있다.
최근에는 스프링을 백엔드개발용으로 많이 사용되지만 스프링은 기본적으로 풀스택을 지원한다. 그렇기 때문에 @Controller가 에러가 나는 이유는 연결된 뷰화면이 없기 때문이다. 반면에 @RestController는 리턴값인 TEST가 반환되어 클라이언트에 전달된 것을 확인할 수 있다. (자세한 동작 방식 아래 링크 확인)
2023.10.05 - [Framework/Spring] - [Spring] 스프링 부트의 동작 방식
그럼 도대체 두 어노테이션은 무슨 차이가 있는 걸까?
@RestController의 어노테이션의 내부설정을 보면 @Controller + @ResponseBody형태로 선언된 것을 확인할 수 있다.
@Controller와의 차이점은 @ResponseBody 어노테이션 선언 여부인 것이다.
@ResponseBody 어노테이션은 컨트롤러 메서드가 HTTP응답의 본문(Body) 부분에 직접 데이터를 쓰도록 지정하는 역할을 한다. 이 어노테이션을 사용하면 메서드의 반환값을 HTTP응답으로 전송될 때 직렬화하여 클라이언트한테 반환된다.
동작의 관점에서 본다면 @Controller가 사용하던 ViewResover 대신에 HttpMessageConverter가 동작하게 되어 HTTP응답을 처리할 수 있게 된다.
즉, @RestController는 뷰를 랜더링 하는 것 아니라 HTTP요청에 따른 응답값을 보내주는 API(여기선 Rest API)용 컨트롤러를 위한 설정인 것을 알 수 있다.
컨트롤러는 클라이언트의 요청을 서버 측에 전달될 때 가장 먼저 접촉하는 영역이라고 하였는데 HTTP기반으로 통신하니 URL로 호출함으로 동작을 인지한다.
그럼 URL은 컨트롤러 어디다가 지정하는 것을 알아야 하는데 초기 예제 코드를 보면 @GetMapping이 사용하여 지정한 것을 확인할 수 있다. @GetMapping은 이름에서 알 수 있는 듯이 HTTP 메서드 중 하나인 GET(조회)를 위한 어노테이션이다. 해당 어노테이션의 URL를 명시하여 선언해 주면 클라이언트가 해당 URL를 요청하였을 때 매핑된 메서드가 호출된다. 이렇게 호출된 메서드를 핸들러라고 명시한다.
정리하자면, 스프링에서 컨트롤러는 @Controller라는 어노테이션으로 컨트롤러임을 나타내고, 해당 클래스에 정의된 메서드, 핸들러가 요청을 캐치해 동작을 수행하게 된다.
'Framework > Spring' 카테고리의 다른 글
[스진초5기/Spring] DTO, VO, Entity (0) | 2023.11.08 |
---|---|
[스진초5기/Spring] 스프링 3계층과 DI의 관계 (0) | 2023.11.05 |
[스진초5기/Spring] Controller, Service, Repository (3계층) (0) | 2023.10.31 |
[스진초5기/Spring] IoC, DI 정리 (0) | 2023.10.30 |
[Spring] 로그를 남겨주는 라이브러리 - Logback (0) | 2023.10.13 |