[java] 자바 비동기 IO를 활용한 실시간 알림 기능 구현

이번 포스트에서는 자바 비동기 IO를 활용하여 실시간 알림 기능을 구현하는 방법에 대해 알아보겠습니다.

1. 비동기 IO 이란?

비동기 IO(Asynchronous IO)는 입출력 작업을 처리할 때, 블로킹하지 않고 별도의 스레드에서 작업을 처리하는 방식을 말합니다. 이를 통해 여러 작업을 동시에 처리할 수 있으며, 사용자에게 더 빠른 응답 속도를 제공할 수 있습니다.

2. 자바에서 비동기 IO를 사용하는 방법

자바에서 비동기 IO를 사용하기 위해서는 java.nio 패키지의 AsynchronousSocketChannelAsynchronousServerSocketChannel 클래스를 사용합니다.

2.1 클라이언트 측 코드

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;

public class Client {
    private AsynchronousSocketChannel client;

    public Client() throws IOException {
        client = AsynchronousSocketChannel.open();
    }

    public void start() {
        InetSocketAddress serverAddress = new InetSocketAddress("서버 주소", 포트 번호);
        client.connect(serverAddress, null, new CompletionHandler<Void, Object>() {
            @Override
            public void completed(Void result, Object attachment) {
                // 연결 성공 시 동작할 코드 작성
            }
            
            @Override
            public void failed(Throwable exc, Object attachment) {
                // 연결 실패 시 동작할 코드 작성
            }
        });
    }
}

2.2 서버 측 코드

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;

public class Server {
    private AsynchronousServerSocketChannel server;

    public Server() throws IOException {
        server = AsynchronousServerSocketChannel.open();
    }

    public void start() {
        InetSocketAddress localAddress = new InetSocketAddress(포트 번호);
        server.bind(localAddress);
        server.accept(null, new CompletionHandler<AsynchronousSocketChannel, Object>() {
            @Override
            public void completed(AsynchronousSocketChannel client, Object attachment) {
                // 클라이언트 접속 처리 코드 작성
            }
            
            @Override
            public void failed(Throwable exc, Object attachment) {
                // 클라이언트 접속 실패 처리 코드 작성
            }
        });
    }
}

3. 실시간 알림 기능 구현 예시

위에서 작성한 클라이언트와 서버 코드를 기반으로 실시간 알림 기능을 구현해보겠습니다.

클라이언트는 서버에 연결 후, 알림을 받기 위한 메시지를 전송합니다. 서버는 클라이언트로부터 메시지를 받은 후, 연결된 모든 클라이언트에게 알림 메시지를 전송합니다.

클라이언트 측 코드에 아래 코드를 추가합니다.

public void sendMessage(String message) {
    ByteBuffer buffer = ByteBuffer.wrap(message.getBytes());
    client.write(buffer, null, new CompletionHandler<Integer, Object>() {
        @Override
        public void completed(Integer result, Object attachment) {
            // 메시지 전송 완료 시 동작할 코드 작성
        }
        
        @Override
        public void failed(Throwable exc, Object attachment) {
            // 메시지 전송 실패 시 동작할 코드 작성
        }
    });
}

서버 측 코드에 아래 코드를 추가합니다.

private List<AsynchronousSocketChannel> clients = new ArrayList<>();

public void broadcastMessage(String message) {
    ByteBuffer buffer = ByteBuffer.wrap(message.getBytes());
    
    for (AsynchronousSocketChannel client : clients) {
        client.write(buffer, null, new CompletionHandler<Integer, Object>() {
            @Override
            public void completed(Integer result, Object attachment) {
                // 메시지 전송 완료 시 동작할 코드 작성
            }
            
            @Override
            public void failed(Throwable exc, Object attachment) {
                // 메시지 전송 실패 시 동작할 코드 작성
            }
        });
        
        buffer.rewind();
        // 버퍼 초기화
    }
}

@Override
public void completed(AsynchronousSocketChannel client, Object attachment) {
    clients.add(client);
    // 클라이언트 목록에 추가
}

4. 마무리

이번 포스트에서는 자바 비동기 IO를 활용하여 실시간 알림 기능을 구현하는 방법에 대해 알아보았습니다. 비동기 IO를 사용하면 다수의 클라이언트와 실시간 통신 기능을 구현할 수 있으며, 성능과 응답 속도도 개선할 수 있습니다. 자바 비동기 IO를 활용하여 다양한 실시간 기능을 구현해보세요.

참고자료: