본문 바로가기

728x90

분류 전체보기

(74)
[Java] 멀티플렉싱 기반의 다중 접속 서버로 가기까지 소켓을 통한 네트워크 I/O 소켓은 네트워크에서 서버와 클라이언트, 두 개의 프로세스가 특정 포트를 통해 양방향 통신이 가능하도록 만들어 주는 추상화된 장치입니다. 메모리의 사용자 공간에 존재하는 프로세스(서버, 클라이언트)는 커널 공간에 생성된 소켓을 통해 데이터를 송수신할 수 있다. 소켓은 지역(로컬) IP 주소와 포트 번호, 상대방의 IP 주소와 포트번호, 그리고 수신버퍼와 송신 버퍼가 존재한다. 서버와 클라이언트 소켓이 서로 연결된 후 데이터가 들어오면 수신 버퍼에 수신 데이터가 쓰이고, 반대로 데이터를 내보낼 때는 송신 버퍼에 데이터가 쓰인다. 고찰 서버와 클라이언트 소켓 생성과 연결 과정은 다음과 같습니다. 서버 클라이언트의 연결 요청도 일종의 데이터 전송입니다. 따라서 연결 요청을 받아들이기..
[Network] TCP/IP와 소켓통신 Send/Recv 동작 원리( + Blocking VS NonBlocking) 테스트 실패 현상 서버(고객사 개발)와 클라이언트(필자가 개발) 프로그램이 있습니다. 서버는 150Hz로 클라이언트 측으로 데이터를 송신합니다. 클라이언트는 해당 데이터를 수신하여 처리합니다. 클라이언트가 1회 송신 요청 데이터만 보내면, 서버는 스트림 형태로 데이터를 계속 송신하고, 클라이언트가 중단 요청을 보내면 그때 정지합니다. 서버에서 정상적으로 데이터를 send하였고, 클라이언트가 정상 수신 받아 처리하는 과정에서 일정 시간 이후( 발생 시점은 불특정) 클라이언트 입장에서 데이터를 정상 수신하지 못함. 서버 입장에서 모니터링을 하면 클라이언트가 데이터를 빠르게 가져가지 못해서 발생하는 것으로 밝혀짐. 이럴 경우 뭐가 문제이고 클라이언트는 무엇을 해야할까? TCP/IP와 소켓통신 Send/Recv..
[Java] 톰켓과 네티 서버의 차이점 OverView 이전 글에선 요청에 대한 Asynchronous한 요청을 받기위한 NIO 의 Tomcat에서의 동작을 알아보았습니다. Tomcat은 New I/O Connector를 통해 사용자의 요청에대해 비동기적으로 동작할 수 있었습니다. 그럼 이번엔 Tomcat과 Netty 두 서버간의 어떤차이점이 있을까를 알아보도록 하겠습니다. Tomcat & Netty 우리가 Asynchronous/Non-Blocking 하면 Netty서버를 떠올리는데는 이유가 있을겁니다. 그렇다면 왜 Spring의 WebFlux는 Netty를 쓸까가 궁금했습니다. WebFlux와 Tomcat을 잘 사용하면 되는거 아닐까란 의문이 들었습니다. 왜 Reactive Programming에서 Tomcat은 잘 이야기 되지 않을까요?..
[Java] Java NIO의 Tomcat에서의 동작 OverView 이전 글에서 Tomcat은 Default로 NIO Connector를 제공하고 이는 클라이언트의 연결을 Non-blocking하게 처리할 수 있음을 의미합니다. Tomcat의 NIO Connector는 내부적으로 Java의 NIO를 사용하기에, 이번시간엔 JAVA의 NIO에 대해 자세히 알아보고 Tomcat은 어떻게 NIO를 통해 동작하는지 알아보려 합니다. Java NIO java.nio의 정식 명칭은 New Input/Output 의 약자로 기존 표준 I/O를 보완하기 위해 Java J2SE 1.4와 함께 동비되었으며, 이후 NIO2가 Java SE 7과 함께 출시되었습니다. 많이들 BIO/NIO를 Blocking IO / Non-blocking IO로 생각하고 쓰고 있지만 실제 I/..
[Java] 동기/비동기 & NonBlocking Blocking과 Spring의 관계 동기식/비동기식 & blocking/non-blocking 두 그룹은 서로 다른 개념입니다. 그러나 사실 그 구분을 명확하게 이해하기란 쉽지 않았고 웹 프로젝트에선 더 더욱 혼동을 야기하는 것 같아 정리가 필요했습니다. 흔히 reactive processing에서 말하는 Asynchronouse non-blocing은 뭐가 Asynchronouse하고 뭐가 non-blocing하다는 건지 내가 개발하는 WebServer에선 어떻게 이해해야 할지 이해가 가지 않아 정리해봤습니다. 용어 정리 Synchronouse & Asynchronouse 동기와 비동기의 관계를 설명하는 가장 대표적인 사례는 특정 작업이 수행중이고 종료되지 않은 상태여도, 대기하지 않고 다른 작업을 실행하느냐 못하느냐의 차이가 있습니다...
[Java] Callable, Future 및 Executors, Executor, ExecutorService, ScheduledExecutorService에 대한 이해 및 사용법 이번에는 자바5 부터 멀티 쓰레드 기반의 동시성 프로그래밍을 위해 추가된 Executor, ExecutorService, ScheduledExecutorService와 Callable, Future를 살펴보도록 하겠습니다. 1. Callable과 Future 인터페이스에 대한 이해 및 사용법 [ Thread와 Runnable의 단점 및 한계 ] Thread와 Runnable을 직접 사용하는 방식은 다음과 같은 한계점이 있습니. 지나치게 저수준의 API(쓰레드의 생성)에 의존함 값의 반환이 불가능 매번 쓰레드 생성과 종료하는 오버헤드가 발생 쓰레드들의 관리가 어려움 먼저 쓰레드를 어떻게 만드는지는 애플리케이션 개발자의 관심과는 거리가 먼데, Thread와 Runnable를 통한 쓰레드의 생성과 실행은 너무..
[Java] Thread와 Runnable에 대한 이해 및 사용법 자바 초기부터 멀티 쓰레드 기반의 동시성 프로그래밍을 위해 만들어졌던 Thread와 Runnable를 살펴보도록 하겠습니다. 1. Thread와 Runnable에 대한 이해 및 사용법 [ 쓰레드와 자바의 멀티 쓰레드] 쓰레드란 프로그램 실행의 가장 작은 단위입니다. 일반적으로 자바 애플리케이션을 만들어 실행하면 1개의 메인(main) 쓰레드에 의해 프로그램이 실행됩니다. 하지만 1개의 쓰레드 만으로는 동시에 여러 작업을 할 수 없습니다. 동시에 여러 작업을 처리하고 싶다면, 별도의 쓰레드를 만들어 실행시켜줘야 하는데, 자바는 멀티 쓰레드 기반으로 동시성 프로그래밍을 지원하기 위한 방법들을 계속해서 발전시켜 왔습니다. 그 중에서 Thread와 Runnable은 자바 초기부터 멀티 쓰레드를 위해 제공되었던 ..
[Java] CompletableFuture에 대한 이해 및 사용법 1. CompletableFuture에 대한 이해 [ Future의 단점 및 한계 ] Java5에 Future가 추가되면서 비동기 작업에 대한 겨로가값을 반환 받을 수 있게 되었습니다. 하지만 Future는 다음과 같은 한계점이 있습니다. 외부에서 완료시킬 수 없고, get의 타임아웃 설정으로만 완료 가능 블로킹 코드(get)을 통해서만 이후의 결과를 처리할 수 있음 여러 Future를 조합할 수 없음 ex> 회원 정보를 가져오고, 알림을 발송하는 등 여러 작업을 조합하거나 ㅖ외 처리할 수 없음 Future는 외부에서 작업을 완료시킬 수 없고, 작업 완료는 오직 get 호출 시에 타임아웃으로만 가능합니다. 또한 비동기 작업의 응답에 추가 작업을 하려면 get을 호출해야 하는데, get은 블로킹 호출이므로..

728x90