Skip to content

11. How to route based on Annotation

이진혁 edited this page May 28, 2021 · 3 revisions

웹플럭스에서는 기존 Spring MVC 방식에서 채택한 어노테이션 기반 라우팅 방식을 그대로 사용하기 위해서
어노테이션 기반 라우팅 방식과 RouterFunction 기반 라우팅 방식 모두를 지원합니다.
그 중 이번에는 어노테이션 기반 라우팅 방식을 이용해 서비스를 구성해보겠습니다.

@RestController
@RequiredArgsConstructor
public class AnnotatedTestController {
    private final AnnotatedTestService testService;

    @PostMapping("/hello")
    public Mono<AnnotatedTestResponse> testController(@RequestBody Mono<AnnotatedTestRequest> request) {
        return request
                .flatMap(req -> Mono.just(
                        new AnnotatedTestResponse(
                                testService.combineName(req.getFirstName(), req.getLastName()),
                                req.getAge(),
                                testService.combineGradeClassNumber(req.getGrade(), req.getClassroom(), req.getNumber())
                        )
                ));
    }
}

위 컨트롤러처럼 기존 방식과 다를바 없는 컨트롤러를 구성할 수 있습니다.
기존과 다른 점을 찾아보자면 Request BodyResponse BodyMono로 감쌌다는 것인데,
이는 어떤 Publisher로도 감쌀 수 있으며 Asynchronous하게 처리하기 위함입니다.

당연히 Flux로도 감쌀 수 있지만 Flux로 감싸게 되면 JSON Object가 아니라
JSON Array가 되기 때문에 보통 사용하지 않습니다.

@Service
public class AnnotatedTestService {

    public String combineName(String firstName, String lastName) {
        return lastName + firstName;
    }

    public String combineGradeClassNumber(int grade, int classroom, int number) {
        return String.format("%d%d%d", grade, classroom, number);
    }
}

서비스 컴포넌트는 기존과 다른 점이 없습니다.
하지만 레포지토리 컴포넌트는 주의사항이 있습니다.
평소 사용하던 JDBCBlocking을 기본으로 하는 드라이버이기 때문에
JDBC를 그대로 사용하게 되면 웹플럭스의 이점을 제대로 사용할 수 없습니다.
그래서 자바 진영에서 지원하는 R2DBC에 대해 공부하고 적용시켜야 합니다.

Example

어노테이션 기반으로 라우팅하기