250x250
syk531
하루
syk531
전체 방문자
오늘
어제
  • 분류 전체보기 (166)
    • 개발 (166)
      • java (11)
      • kotlin (7)
      • spring, spring boot (35)
      • Javascript (4)
      • Tyhmeleaf (2)
      • Kafka (17)
      • Docker (8)
      • Kubernetes (3)
      • Elastic Stack (4)
      • react native (3)
      • Web (4)
      • GIS (3)
      • 리눅스 (16)
      • Windows (2)
      • 네트워크 (2)
      • 안드로이드앱 (5)
      • git (2)
      • Tool (15)
      • 프로젝트 (7)
      • 백준알고리즘 (14)
      • DB (2)

인기 글

최근 글

블로그 메뉴

    공지사항

    태그

    • 오블완
    • 뉴스앱
    • 티스토리챌린지

    최근 댓글

    티스토리

    hELLO · Designed By 정상우.
    syk531

    하루

    개발/spring, spring boot

    [Spring Integration][Spring Boot Test] Socket 통신 테스트 시 빈 데이터 전송 해결

    2024. 2. 5. 10:37
    728x90
    반응형

    [Spring Integration][Spring Boot Test] Socket 통신 테스트 시 빈 데이터 전송 이슈를 해결하기 위해서 주말동안 삽질을 많이 했는데 해결은 간단하게 되었습니다.

     

    [Spring Integration] Multi TCP server 구현에서 AbstractServerConnectionFactory를 만들때 아래와 같이 하나는 TcpNetServerConnectionFactory(동기식)를 사용하고 다른 하나는 TcpNioServerConnectionFactory(비동기식)를 사용해서 만들었습니다.

    @Bean
    public AbstractServerConnectionFactory server1ConnectionFactory(Server1Serializer serializer) {
        TcpNetServerConnectionFactory connectionFactory = new TcpNetServerConnectionFactory(8084);
        connectionFactory.setSerializer(serializer);
        connectionFactory.setDeserializer(serializer);
        return connectionFactory;
    }
    
    @Bean
    public AbstractServerConnectionFactory server2ConnectionFactory(Server2Serializer serializer) {
        TcpNioServerConnectionFactory connectionFactory = new TcpNioServerConnectionFactory(8083);
        connectionFactory.setSerializer(serializer);
        connectionFactory.setDeserializer(serializer);
        connectionFactory.setSingleUse(true);
        return connectionFactory;
    }

    해당 방식의 차이는 [Spring Integration] TcpNioServerConnectionFactory vs TcpNetServerConnectionFactory 에 정리한것처럼 동기식과 비동기식의 차이입니다. 

    TcpNetServerConnectionFactory(동기식)를 사용한 TCP server에서 주기적으로 빈 데이터가 수신 되었는데 TcpNioServerConnectionFactory(비동기식)으로 변경하니 주기적으로 빈 데이터가 수신되지 않았습니다. 차이는 블로킹여부로 인해 발생하였습니다. TcpNetServerConnectionFactory은 스레드를 블록하게 되는데 이 과정에서 빈 데이터 패킷이 수신될 수 있습니다.

     

    TcpNetServerConnectionFactory와 블로킹 I/O

    TcpNetServerConnectionFactory는 Java의 전통적인 소켓 I/O를 사용합니다. 이 방식은 동기적이고 블로킹 모델을 따릅니다. 즉, 서버는 클라이언트로부터 데이터를 수신할 때까지 해당 스레드가 블록됩니다. 이 과정에서 빈 데이터 패킷이나 네트워크의 미세한 지연으로 인해 스트림의 끝을 나타내는 -1이 아닌 0을 반환할 수 있는 상황이 발생할 수 있습니다. 결과적으로, 이러한 블로킹 동작 때문에 빈 데이터 패킷이 수신될 수 있습니다.

    TcpNioServerConnectionFactory와 논블로킹 I/O

    반면, TcpNioServerConnectionFactory는 Java NIO (New I/O)를 사용합니다. NIO는 논블로킹 I/O 모델을 기반으로 하며, 이는 소켓 채널이 데이터를 기다리면서도 다른 작업을 계속할 수 있음을 의미합니다. NIO 모델에서는 채널이 준비되지 않았거나 데이터가 도착하지 않았을 때 스레드가 블록되지 않고, 즉시 반환하여 다른 작업을 처리할 수 있습니다. 따라서, TcpNioServerConnectionFactory를 사용할 때는 블로킹 I/O 모델과 달리 빈 데이터 패킷으로 인한 불필요한 처리가 발생하지 않습니다.

     

    728x90
    반응형
    저작자표시 (새창열림)

    '개발 > spring, spring boot' 카테고리의 다른 글

    [Spring Boot] mariadb-java-client vs mysql-connector-j  (0) 2024.02.07
    [Spring Boot][Mybatis][MariaDB] Bulk Update 방법  (0) 2024.02.07
    [Spring Integration][Spring Boot Test] Socket 통신 테스트 시 빈 데이터 전송 이슈  (0) 2024.02.02
    [Spring Integration] Multi TCP server 테스트 시 Address already in use: bind 에러  (0) 2024.01.31
    [Spring Integration] Multi TCP server 구현  (1) 2024.01.31
      '개발/spring, spring boot' 카테고리의 다른 글
      • [Spring Boot] mariadb-java-client vs mysql-connector-j
      • [Spring Boot][Mybatis][MariaDB] Bulk Update 방법
      • [Spring Integration][Spring Boot Test] Socket 통신 테스트 시 빈 데이터 전송 이슈
      • [Spring Integration] Multi TCP server 테스트 시 Address already in use: bind 에러
      syk531
      syk531
      기억을 위해 기록을.

      티스토리툴바