일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- template
- 테스트
- 책스터디
- 객체지향의사실과오해
- 조영호
- Kotlin
- GrokkingFunctionalProgramming
- 추상화 설계
- 만들면서배우는클린아키텍처
- 도메인 주도 개발 시작하기
- Boot Legacy 차이점
- DDD
- 이펙티브코틀린
- 클린아키텍처
- 함수형프로그래밍
- Java
- 코틀린
- 개발방법론
- Thymeleaf
- TDD
- web
- Spring
- 유지보수
- FP
- 헥사고날아키텍처
- 아키텍처
- 스터디
- 테스트주도개발
- 개발서적
- 계층형아키텍처
- Today
- Total
김동형수 개발기
[Spring] @RestController, @Controller 차이점 알기 본문
Intro
스프링에서 컨트롤러 작성할 때 API용은 RestController Annotation을 사용하고 Dispatcher Servlet으로 보내야 하는 경우( 페이지 이동 ) 에는 Controller Annotation을 사용합니다.
하지만 왜 사용하는지, 어떤 차이가 있는지는 몰랐습니다.
케이스 바이 케이스로 공식 외우듯 기계처럼 작성을 해왔습니다.
하지만 오늘은 두 Annotation을 소화해보려고 합니다.
Content
@Controller가 있는 Request가 발생하면 어떠한 일이 일어날까?
아주 잘 설명되엉 있는 그림이 첨부된 포스팅을 발견했습니다.
개인적인 생각으로 가장 중요한 내용은 클라이언트에서 Controller로 요청(Request)을 하게되면 Spring의 Dispatcher Servlet을 통한 처리가 이루어집니다.
위에서 언급한 내용에서 흐름을 살펴보면 아래와 같습니다.
Client -> Dispatcher Servlet -> Handler Mapper -> Controller -> View Resolver -> View -> Client
아무생각없이 사용할때는 심플했는데 Spring Framework에서 상당히 많은 일들을 처리해주고 있었습니다.
보통은 뷰(페이지)를 반환하지만 View Resolver 단계에서 MessageConvertor를 통해서 Json 형태의 Response를 반환하는 것 또한 가능합니다. (참조 : 이곳)
기존에 Controller Annotation를 사용해서 RestAPI를 만드는 분들은 모든 메서드에 ResponseBody Annotation을 넣어줘야하는 번거로움이 있습니다.
하나의 Controller에서 View를 이용한 Response와 Json 형태의 Response를 반환하는 형태가 아니라면 @RestController 를 사용해봅시다.
@RestController가 있는 Request가 발생하면 어떠한 일이 일어날까?
대부분의 과정이 @Controller와 비슷하게 처리되고 @Controller에서 ResponseBody Annotation을 사용하는것과 동일한 결과값을 얻을 수 있습니다.
따라서 RestAPI만을 사용하는 컨트롤러라면 @RestController, View와 API가 혼용되어 작성하거나 View만 사용하려면 @Controller를 사용하는 것이 좋을 것 같습니다.
Finish
@RestController와 @Controller 사이에서 고민하고 있다면 앞서 언급한 용도에 대해서 고민하신 뒤 선택하면 될 것 같습니다.
Reference
https://taetaetae.github.io/2017/01/07/spring4-json/
https://codenuclear.com/spring-mvc-flow-with-example/
https://ismydream.tistory.com/140
'이론정리' 카테고리의 다른 글
왜 Spring Framework를 선택할까? (0) | 2020.03.20 |
---|---|
[Spring] Spring Legacy와 Spring Boot 비교 (0) | 2020.02.20 |
[Java] Java 8의 새로운 기능 (0) | 2020.02.19 |