[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 모델과 달리 빈 데이터 패킷으로 인한 불필요한 처리가 발생하지 않습니다.
'개발 > 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 |