Computer Science/프로그래밍 공통

대용량 트래픽 처리를 위한 자바의 핵심 기술

코딩하는 배달이 2023. 4. 24. 08:00

멀티스레딩


한 번에 하나의 작업만 처리하는 단일 스레드보다 여러 작업을 동시에 처리할 수 있어서 성능 향상을 기대할 수 있다.
I/O 작업을 수행할 때, 대기 시간이 발생하므로 스레드를 대기 상태로 만들고 다른 작업을 수행할 수 있어서, I/O 작업을 효율적으로 처리할 수 있다.

 

멀티스레딩을 사용하면, 하나의 스레드에서 여러 작업을 처리하므로 작업을 분산시키고 병렬 처리할 수 있다. 이렇게 분산 처리하면, 전체 작업 시간이 감소하여 성능 향상을 가져올 수 있다. 또한, 시스템이 더 많은 클라이언트 요청을 처리할 수 있어서 서버 확장성을 높일 수 있다.

 

public class MyThread extends Thread {
    @Override
    public void run() {
        // 스레드에서 실행될 코드 작성
        System.out.println("MyThread is running.");
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start(); // 스레드 실행
        System.out.println("Main thread is running.");
    }
}

 

 

NIO(Non-blocking I/O)


NIO는 기존의 블로킹 I/O와 달리 입출력 작업이 끝날 때까지 스레드를 대기시키지 않고, 다른 작업을 처리할 수 있어서 스레드를 효율적으로 사용할 수 있다. 블로킹 I/O에서는 입출력 작업이 완료될 때까지 해당 스레드가 대기 상태에 머무르기 때문에, 스레드를 많이 사용하게 되면 많은 양의 메모리를 사용하는 반면, NIO에서는 입출력 작업이 완료될 때까지 대기하지 않고 해당 작업을 처리할 수 있는 다른 스레드에게 넘기게 된다. 이를 통해 스레드를 효율적으로 사용할 수 있다.

 

public static void copyFile(String source, String target) throws IOException {
    FileChannel sourceChannel = new FileInputStream(source).getChannel();
    FileChannel targetChannel = new FileOutputStream(target).getChannel();
    sourceChannel.transferTo(0, sourceChannel.size(), targetChannel);
    sourceChannel.close();
    targetChannel.close();
}

 

FileChannel을 사용하여 파일의 데이터를 읽고 쓰며, transferTo() 메서드를 사용하여 데이터를 한 채널에서 다른 채널로 전송한다. copyFile()은 FileChannel을 이용하여 파일 복사를 수행한다. FileChannel은 non-blocking IO를 지원하는데, 즉 입출력 작업이 끝날 때까지 스레드를 대기시키지 않고 다른 작업을 처리할 수 있도록 한다.

transferTo() 메서드는 데이터를 한 채널에서 다른 채널로 전송하는데, 이 작업은 비동기적으로 처리된다. 즉, 메서드가 호출된 후 데이터 전송이 완료될 때까지 스레드가 대기하지 않고 다른 작업을 수행할 수 있다. 따라서 copyFile()은 non-blocking IO를 이용하여 파일 복사를 수행하는 것이고, 이 방법은 블로킹 I/O에 비해 더 효율적으로 메모리와 스레드를 관리할 수 있다.

 


소켓 프로그래밍


클라이언트와 서버 간의 통신을 위한 기술로, 네트워크 프로그래밍에서 주로 사용된다. 소켓을 이용하여 클라이언트와 서버 간의 양방향 통신이 가능하며, 이를 통해 HTTP 프로토콜 등을 사용하여 웹 서비스를 구현할 수 있다.

또한, 멀티스레딩과 결합하여 여러 클라이언트와 동시에 통신할 수 있다. 멀티스레딩으로 다수의 클라이언트 요청을 병렬 처리하여 대용량 트래픽 처리를 효율적으로 할 수 있다.  이를 통해 다양한 종류의 네트워크 서비스를 제공할 수 있으며, 서버와 클라이언트 간의 실시간 통신을 구현할 수 있다.

 

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(1234);
        System.out.println("Server is running on port 1234.");
        Socket clientSocket = serverSocket.accept();
        BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
        String message = in.readLine();
        out.println("Received message: " + message);
        clientSocket.close();
        serverSocket.close();
    }
}

public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 1234);
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        out.println("Hello, server!");
        String response = in.readLine();
        System.out.println(response);
        socket.close();
    }
}

 

Server 클래스는 ServerSocket을 생성하여 포트 1234에서 서버를 시작하고, 클라이언트의 연결 요청이 오면 accept() 메소드를 호출하여 연결을 수락한다. 그 후에는 BufferedReader를 사용하여 클라이언트로부터의 입력을 읽고, PrintWriter를 사용하여 클라이언트에 출력한다.

Client 클래스는 Socket 객체를 생성하여 로컬 호스트의 포트 1234에 연결 후 PrintWriter를 사용하여 서버에 메시지를 보내고, BufferedReader를 사용하여 서버로부터의 응답을 읽는다.

 

네트워크 프로그래밍에서는 이와 같은 클라이언트와 서버 간의 통신 예제를 기반으로, HTTP 프로토콜을 사용하여 웹 서비스를 구현하거나, 멀티스레드와 결합하여 여러 클라이언트와 동시에 통신할 수 있는 서버를 구현하는 등 다양한 응용이 가능하다.