개발환경

netty로 전문통신 서버를 구현할 때

toogari 2023. 10. 11. 16:55

anylink 같은 솔류션이 없이 전문통신서버를 구현하는게 쉽지 않습니다. 여러 프로젝트에서 netty로 전문 관련 프로젝트를 수행했는데 여러가지 노하우가 있지만 아래 세가지를 잘 처리하면 크게 문제는 없어 보입니다.

전문의 처음과 끝

  • 전문은 단순한 문자열이든 복잡한 전문의 형태이든 처음과 끝을 정확히 파악하는게 중요합니다.
  • 전문은 한번에 들어오지 않고 여러 번에 걸쳐 들어올 수 있으므로 전문의 끝이 올 때까지 잘 모아 두어야 합니다. ByteToMessageDecoder 나 ReplayingDecoder 같은 클래스를 상속하여 하나의 전문을 온전히 받고 자바클래스로 decoding 해야 합니다.

netty의 비동기 통신

  • netty는 기본적으로 비동기로 데이터를 처리합니다.
  • 여러번 요청이 가고 여러번 응답이 오면 요청에 대한 응답의 매핑이 중요할 때가 있습니다.
  • netty와 주변 서비스가 비동기라고 하면 딱히 문제가 없는데.. 동기 서비스와 netty를 함께 구성하면 netty의 비동기 통신을 동기적인 형태로 변환하는 작업이 필요합니다. ( correlationId로 응답에 대한 요청을 찾아야 할 수도 있음. ) 
  • CompletableFuture 클래스를 사용하여 이 문제를 해결할 수 있습니다.

복잡한 비즈니스로직

  • 다양한 기능을 가진 전문이 있습니다.
  • 몇몇 개의 메소드로 전문의 기능을 모두 구현하기가 쉽지 않고 구현한다 해도 너무 복잡합니다. 구현한 개발자만이 유지보수를 할 수 있는 상황이 발생할 수 있습니다.
  • Finite-state machine 디자인패턴을 이용하면 깔끔하게 구현이 가능합니다.
  • https://github.com/stateless4j/stateless4j 이 구현체가 깔끔하네요. spring-statemachine-core 을 이용하는 것도 좋아 보입니다.