728x90
Spring WebFlux를 사용할 때 가장 먼저 마주치는 애노테이션 중 하나가 @RestController입니다. 그런데 같은 스프링 빈으로 등록되는 @Component와 무엇이 다른 걸까요?
이 글에서는 @RestController와 @Component의 차이를 기본 개념부터 실무 사용 포인트, 내부 동작까지 정리합니다.
1️⃣ WebFlux란?
Spring WebFlux는 Spring 5부터 도입된 리액티브 논블로킹 웹 프레임워크입니다.
- 서블릿 기반 대신 Netty, Undertow 등 리액티브 서버를 기반으로 동작
- 주요 리턴 타입: Mono<T>, Flux<T> (Project Reactor 기반)
- 비동기 스트림 처리에 최적화
2️⃣ @RestController vs @Component 기본 차이
항목 | @RestController | @Component |
역할 | HTTP 요청 처리 | 일반 스프링 빈 |
요청 매핑 (@GetMapping, 등) | 가능 | 불가능 |
DispatcherHandler 대상 | O | X |
응답 변환 (Mono → JSON) | 자동 처리 | 미적용 |
주요 목적 | 외부 API 제공 | 내부 유틸, 서비스, 설정 등 |
3️⃣ 내부 구조 차이
✅ @RestController는 DispatcherHandler의 흐름에 포함됨
- @RestController는 내부적으로 핸들러 매핑 대상이 됨
- WebFlux는 요청을 DispatcherHandler → HandlerMapping → HandlerAdapter로 전달
- Mono<T>, Flux<T> 리턴 시, 자동으로 응답 본문에 JSON 변환됨
@RestController
class HelloController {
@GetMapping("/hello")
fun hello(): Mono<String> = Mono.just("hello")
}
❌ @Component는 HTTP 요청과 무관
- HTTP 요청과 직접 연결되지 않음
- 단순 유틸, 로직, 설정용 빈으로만 사용됨
@Component
class HelloService {
fun hello(): String = "hello"
}
4️⃣ @RestController = @Controller + @ResponseBody
@Controller
@ResponseBody
class HelloController { ... }
- @Controller: 원래는 View 반환 (ex: Thymeleaf), WebFlux에서는 거의 사용 안 함
- @ResponseBody: 객체를 JSON 등으로 응답 본문으로 변환
5️⃣ 관련 애노테이션과 구조적 팁
@Component는 메타 애노테이션
다음 애노테이션들은 내부적으로 @Component를 포함합니다.
애노테이션 | 용도 |
@Service | 비즈니스 로직 |
@Repository | DB 접근 계층, 예외 변환 |
@Configuration | 설정 클래스 |
→ 따라서 의도에 맞는 애노테이션을 사용하면 가독성과 구조 명확성이 좋아집니다.
6️⃣ WebFlux에서의 함수형 라우팅 (Functional Endpoint)
@RestController 없이도 라우팅이 가능한 WebFlux 전용 방식입니다.
@Bean
fun routes() = router {
GET("/hello") { ok().bodyValue("hello") }
}
- API 구조를 함수형으로 정의
- 선언적이고 명확한 방식 (DSL 스타일)
- 간단한 API 또는 동적 라우팅에 유리
✅ 마무리 정리
구분 | @RestController | @Component |
요청 처리 | 가능 (@GetMapping) | 불가 |
DispatcherHandler 등록 | O | X |
리턴 처리 (Mono → JSON) | 자동 처리 | 해당 없음 |
사용 위치 | API 엔드포인트 | 내부 로직, 서비스, 설정 등 |
상위 애노테이션 | @Controller + @ResponseBody | 없음 (기초 애노테이션) |
🧩 실무 팁
- API를 만들 땐 무조건 @RestController
- 내부 로직은 @Component 대신 @Service, @Repository처럼 의미 있는 애노테이션을 쓰는 것이 유지보수에 유리
- WebFlux에서는 View 렌더링보다 JSON 기반 응답에 집중
728x90
'BackEnd > Spring WebFlux' 카테고리의 다른 글
[WebFlux_2] @RestController vs @Component (0) | 2025.06.20 |
---|---|
Kotlin + Spring WebFlux 테스트 구조 설계기 (0) | 2025.05.28 |
Spring WebFlux에서 MySQL을 사용하는 방법: JDBC vs R2DBC 완전 정리 (0) | 2025.04.28 |
부록 - Spring Boot MVC vs Spring WebFlux 비교 (0) | 2025.04.28 |
Spring WebFlux 심화 시리즈 (4) - WebClient를 활용한 대용량 데이터 처리 (0) | 2025.04.28 |