Rootable의 개발일기
Controller와 RestController 본문
📌 @Controller
Spring 이 처음 로딩될 때, Spring Container 라는 공간이 생긴다. 그리고 이 공간에 @Controller 가 선언된 객체들을
넣어두고 관리한다. 이것을 스프링 컨테이너에서 스프링 빈이 관리된다라고 한다.
- Web Application에서 첫 번째 진입점
- 사용자의 요청이 진입하는 지점
- 사용자 요청을 받아서 파라미터를 검증(요청 스펙을 검증)
- 요청에 따라 어떤 처리를 할지 결정을 서비스에 넘김 (실제 처리는 서비스에서 수행)
- Model 객체를 만들어 데이터를 담고 사용자에게 지정된 View 를 반환하여 응답 결과를 보여준다.
❓ Controller 를 왜 사용할까
특정 비즈니스 목적을 가진 프로젝트에서 수행하는 기능은 다양하다. 이러한 기능을 수행하기 위해서는 기본적으로 MVC 구조로 코드를 작성한다. 여기서 Controller 는 View 를 지정하고 응답 결과를 보여주는 역할이 핵심이므로 목적 또는 기능이 명확하도록 작성해야 코드 가독성이나 유지 보수에 유리하다. 이를 위해서 우리는 원하는 기능 단위 또는 페이지 단위로 Controller 를 작성하여 무엇을 처리할 것인지 어떤 페이지를 렌더링할 것인지 등 지표로서 Controller 를 사용하고, 이에 맞게 API 설계를 하는 것이 명확하다. 또한, 개발 비용이나 유지 보수 비용도 절감할 수 있다.
📌 @RestController(@Controller + @ResponseBody)
@Controller의 경우 반환 값이 String이면 뷰 이름으로 인식하여 뷰 리졸버가 실제 경로를 찾아주고, 최종적으로 해당 뷰를 브라우저에 렌더링한다. 반면, @RestController의 경우 HTTP body에 값을 그대로 적기 때문에 반환 값이 String이면 문자 그대로 출력되고, 객체를 넣으면 JSON으로 출력된다. 이것은 @RestController 애노테이션 안에 @ResponseBody가 적용되어 있기 때문이다.
🔎 사용 예시
1. 업로드할 파일 다운로드
웹에서 특정 페이지에 파일을 내려주기 위해 ResponseEntity라는 객체를 이용할 수 있는데, 리턴 값은 관련 정보를 채운 ResponseEntity가 된다. 즉, 다운로드 완료 후 리다이렉트가 필요없고 단순히 다운로드만 원한다면 @Controller를 통한 렌더링 작업이 아닌 @RestController를 통해 자원을 브라우저로 내려줘야 한다.
2. 리다이렉트를 원하지 않을 때
만약 댓글 등록 후 리다이렉트를 원하지 않는다면 @RestController 사용을 고려할 수 있다. 일반적으로 댓글 등록 후에 현재 화면에 머무는 경우가 많다. 이 경우에는 리턴 값으로 서비스 측을 호출하여 로직 처리만 하고 끝낼 수 있다.
Reference:
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
'Spring' 카테고리의 다른 글
Dependency Injection(DI)과 IoC(Inversion of Control) (0) | 2023.04.27 |
---|---|
Spring Test 관련 정리 (0) | 2023.04.27 |
@RequestBody와 @ResponseBody (0) | 2023.04.27 |
Spring MVC 패턴 (0) | 2023.04.27 |
Spring Boot 동작 (SSR) (0) | 2023.04.26 |