ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Netty & Spring boot ( ft.Webflux)
    Java/No Blocking 2019. 7. 5. 10:34
    반응형

    Netty 를 겉핥기를 해놓고 이제와서 사용해 보는것 같다. 다행이 내 만든 API 서버중 하나를 고가용성의 서버로 만들 니즈가 생겼고 이참에 한번 해보자 ! 라는 생각으로 시작했다. 

     

     기존 프로젝트를 고치기로 했다. 기존 프로젝트는 아주 평범한 spring boot 2 기반의 spring mvc 프로젝트이다. 다행이란건 기록하면서 추가하겠지만 mysql 이나 기타 RDMS 와 연결하는 로직은 없고 , 카프카 나 couchbase 에게 데이터를 전송하는 부분만 존재한다. 프로젝트 자체를 maven 기반으로 만들었기 때문에 시작은 pom.xml 에 내용을 추가하는것부터 했다. 

     

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-webflux</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <dependency>
                <groupId>io.projectreactor</groupId>
                <artifactId>reactor-test</artifactId>
     </dependency>

    이 세가지를 추가한 이유는 webflux 를 사용하기 위해서이다. webflux 는 스프링프레임워크 5에서 도입된 모듈로 웹요청을 reactive 하게 다루는데 초점이 맞춰진 모듈이다. 

     Webflux 는 서블릿 컨테이너 뿐만 아니라 netty , undertow 같은 네트워크 어플리케이션도 지원 하기때문에 netty 를 사용하기 위해선 아주 매력적인 녀석이다. 그리고 spring 에서 공식지원을 지원을해주고 있고 당연하게 spring boot 에도 webflux 를 쓰는데 큰어려움없도록 지원을 해주고 있다. ( spring boot 2 버전 부터 spring framework 5 가 적용 되기 때문에 버전을 잘 보고 사용해야함 ) 

     

    일단 위에 pom.xml 에 세가지를 설정해주고 main class 에 해당하는곳에 @EnableWebFlux 를 선언해주면 모든 준비가 끝난다. ( 굉장히 쉽다;; ) pom.xml 에 denpengency 를 추가해주고 어노테이션만 해준다면 그 뒷일은 spring boot가 알아서 진행 해주기때문에 굉장히 적용이 쉽다. 

     

    10:16:39.763-INFO -o.s.b.a.e.web.EndpointLinksResolver - Exposing 2 endpoint(s) beneath base path '/actuator'
    10:16:40.396-INFO -o.s.b.w.e.netty.NettyWebServer - Netty started on port(s): 8899

    spring boot 를 실행했을때 위와 같은 메세지가 발견된다면 netty 구동은 완료 된것이다. 만일 tomcat 이 보인다면 제대로 적용이 안된것이다. 

     

    설정은 간단하게 완료했다면 netty 기반의 논블럭킹 어플리케이션을 위한 소스구현이 필요 하다. 앞서 말했지만 기본적으로 원래 spring mvc 기반의 소스( 블럭킹 기반 ) 를 가지고 변경하기로 했기 때문에 기존소스는 어떻게 바꿀것인가에 대한 고민이 생긴다. 

    @RestController
    public class InfraController {
    
        @RequestMapping(value = "/test", method = RequestMethod.POST)
        public Mono<Result> testApi(@RequestBody String msg) {
            String result = "OK";
            Result rslt = new Result();
            rslt.setResult(result);
            return Mono.just(gpu);
        }

    위에 코드는 기존 코드에서 webflux 사용을 위해서 변경된 코드이다. 잘보면 응답을 리턴하는 부분이 다르다. 그리고 그외 RestController , RequestMapping 같은 어노테이션들은 그대로 사용하고 있다. 용도에 따라 get, post 를 나누고 싶다면 @GetMapping, @PostMapping 도 사용이 가능하다. 

     결론부터 말하면 기존의 소스는 모드 그대로 재활이 가능하되 리턴만 Mono 나 Flux 로 전달 하도록만 변경해주면되는데 mono 경우 1개의 단일 정보를 전달할경우, Flux 는 복수의 정보를 전달할때 사용한다고 한다. Webflux 의 가장 중요한 핵심이며 충분히 이해를 하고 사용해야한다. 

     

     기존 구글링을 해보면 webflux 에 대해서 많은 글들이 나오고 잘 살펴보면 람다를 이용한 구현 방식이 대다수 이다. java config 를 사용한 환경설정과 bean 객체로 생성된 route 정보를 코드 레벨에서 별도로 람다로 구현하고 실제 리턴해주는 레파지토리를 사용하는 부분의 API 구현도 대다수 람다를 사용 하고 있다. 

     개인적으로는 람다에 대해서 가독성에 대한 의구심이 들어 잘 사용 하고 있지 않아 이해도가 많이 낮다. 그래서 그런지 구현할때 정보 검색에 나름 애로사항이 좀 있었다. 

     지금 이곳에 기록해놓은 방식이 나에겐 당장 가장 접근하기 쉬운 방식이고 상황에 맞는 방식이 지만 아마 앞으로도 별다른 이슈가 없다면 이런구성으로 webflux와 netty 를 사용하지 않을까 싶다. 

     netty 를 사용하기 위해서 시작했지만 결론은 webflux 를 공부 해야겠다라고 끝난거 같다. spring boot가 제공하는 강력한 편의성에 다시한번 고마움을 느끼며  Webflux 에 대한 공부를 해서 정리 해야겠다는 필요성을 느꼈고 , 추후 계속 webflux 에대한 내용들을 정리해서 기록해 놔야겠다. ( 람다는... 정말 정이 가지 않는다... ㅠㅠ ) 

     

    반응형

    'Java > No Blocking' 카테고리의 다른 글

    Netty 훑어보기  (0) 2019.05.09
Designed by Tistory.