BackEnd/Spring WebFlux

[WebFlux_1] @RestController vs @Component

Raconer 2025. 6. 17. 19:35
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는 요청을 DispatcherHandlerHandlerMappingHandlerAdapter로 전달
  • 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