Netty 동기/비동기, 블로킹/논블로킹 이벤트 기반 프로그래밍

천승주·2022년 10월 4일
0

동기/비동기

  • 멀티스레드 프로그래밍에서 동기화는 하나의 데이터에 대한 동시 접근을 하나의 스레드로 한정한다는 의미
  • 비동기 호출을 지원하는 디자인 패턴은 다양함(Future, Observer, Callback, Reactor)
  • netty는 비동기 호출을 위한 API들을 프레임워크 레벨에서 제공하므로 개발자가 스레드 동기화 이슈를 신경쓰는 대신 구현할 기능에 집중할 수 있다.

블로킹/논블로킹 소켓

  • 블로킹은 요청한 작업이 성공하거나 에러가 발생하기 전까지 응답을 돌려주지 않는 것
  • 논블로킹은 요청한 작업의 성공 여부와 상관없이 바로 결과를 돌려주는 것
  • 블로킹 소켓과 논블로킹 소켓은 데이터 송수신을 위한 함수의 동작 방식에 따른 분류

블로킹 소켓

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
public class BlockingServer {
    
    public void run() throws IOException {
        ServerSocket server = new ServerSocket(8888);
        System.out.println("접속 대기중");

        while(true) {
            Socket socket = server.accept();
            System.out.println("클라이언트 연결됨");

            OutputStream out = socket.getOutputStream();
            InputStream in = socket.getInputStream();

            while(true) {
                try {
                    int request = in.read();
                    out.write(request);
                } catch (IOException e) {
                    break;
                }
            }
        }
    }
}
  • 디버그 모드로 실행하면 server.accept()에서 멈춘다.
  • 연결되는 클라이언트가 없으면 프로그램은 아무런 동작도 하지 않으며 스레드는 해당 함수의 완료를 기다리며 대기한다.
telnet localhost 8888

  • 서버에 접속하면 accept() 실행이 완료되고 클라이언트와 연결된 소켓을 생성한다.
  • 데이터를 읽기 위한 read 명령에서 다시 멈추게 되고 클라이언트로부터 데이터가 수신되기를 기다리면서 스레드가 블로킹된다.

이벤트 기반 프로그래밍

0개의 댓글