Java 네트워크 프로그래밍 – 지속 통신과 다중 클라이언트 문제
이전 글에서 “Hello”를 한 번 주고받고 종료하는 가장 단순한 네트워크 프로그램을 만들었다. 이번에는 exit를 입력할 때까지 계속 메시지를 주고받는 버전으로 개선하고, 여기서 자연스럽게 드러나는 단일 스레드 서버의 구조적 한계를 분석한다 네트워크 프로그램 V2 – 지속 통신 ServerV2 V1과의 차이는 단…
이전 글에서 “Hello”를 한 번 주고받고 종료하는 가장 단순한 네트워크 프로그램을 만들었다. 이번에는 exit를 입력할 때까지 계속 메시지를 주고받는 버전으로 개선하고, 여기서 자연스럽게 드러나는 단일 스레드 서버의 구조적 한계를 분석한다 네트워크 프로그램 V2 – 지속 통신 ServerV2 V1과의 차이는 단…
TCP/IP 핸드쉐이크, 패킷 처리는 OS와 JVM이 대신 해주기 때문에, 개발자는 소켓을 만들고 스트림으로 데이터를 주고받는 것에만 집중하면 된다 로깅 유틸리티 준비 멀티스레드 환경에서 디버깅할 때 스레드 이름과 시각이 함께 출력되면 흐름을 파악하기 훨씬 쉽다. 네트워크 프로그램도 결국 멀티스레드와 함께 쓰이므로,…
Legacy File vs Modern Files & Path 과거의 방식 – java.io.File File 클래스는 자바의 탄생과 함께했지만, 몇 가지 치명적인 단점이 있다 현대적인 방식 – java.nio.file.Files & Path 자바 1.7(NIO.2)부터 도입된 이 방식은 성능과 편의성을 획기적으로 개선했다 현대적인 Java 환경에서는 Files 사용을 권장한다. 특히…
자바의 다양한 I/O 방식을 활용해 실무에서 가장 기본이 되는 회원 관리 시스템을 단계별로 구축해본다. 단순히 데이터를 저장하는 것을 넘어, 어떻게 하면 더 효율적이고 객체지향적으로 데이터를 관리할 것인가?에 초점을 맞춰본다 도메인 모델 설계 – Member와 Interface 모든 저장소 구현체는 MemberRepository 인터페이스를…
핵심 원칙 Java I/O를 이해하는 데 필요한 단 하나의 대원칙이 있다. 모든 데이터는 반드시 바이트(byte)단위로 저장된다. 문자를 직접 저장할 수 없다. 이 원칙 하나를 확실히 이해하려면 이후 나오는 모든 내용이 자연스럽게 풀린다 문자 다루기 1 – 직접 인코딩/디코딩 스트림은 바이트만…
실험 환경 공통 상수 정의 성능 비교 예제에서 공통으로 사용할 상수를 정의 예제 1 – 1바이트씩 읽고 쓰기 (기준점) 쓰기 읽기 왜 이렇게 느릴까? 예제 2 – 버퍼를 직접 활용한 읽고 쓰기 쓰기 읽기 예제1 대비 약 1,000배 정도 성능…
스트림(Stream)의 개념 자바에서 외부 데이터와의 입출력은 스트림(Stream)을 통해 이루어진다. 스트림은 데이터의 흐름을 나타내는 추상화된 개념으로 파일, 네트워크, 콘솔 등 다양한 입출력 작업을 일관된 방식으로 처리할 수 있게 해준다 스트림의 방향성 스트림은 단뱡향이다 따라서 양방향 통신을 위해서는 입력과 출력 스트림을 각각…
실무에서 스레드 풀이 포화 상태가 되면 어떻게 대응할지 정책을 정해야 한다. ThreadPoolExecutor는 4가지 기본 거절 정책을 제공하며, 커스텀 정책도 구현 가능하다 거절 정책이 필요한 이유 거절 상황 거절 발생 조건 대응 필요성 RejectedExecutionHandler 인터페이스 모든 거절 정책의 기반 동작 방식…
실무에서는 트래픽 패턴에 맞는 적절한 스레드 풀 전략을 선택해야 한다. Java는 Executors를 통해 세 가지 기본 전략을 제공하며, 각각 장단점이 명확하다 기본 전략 개요 단일 스레드 풀 (Single Thread Pool) 특징 고정 풀 전략 (Fixed Thread Pool) 핵심 특징 동작…
실무에서 대량의 요청을 효율적으로 처리하려면 스레드 풀의 동작 원리를 정확히 이해해야 한다. ThreadPoolExecutor 핵심 파라미터 파라미터 설명 초과 스레드 (Excess Thread) 스레드 풀 동작 원리 작업 처리 우선순위 처리 순서 단계별 실행 분석 핵심 메커니즘 스레드 생성 전략 왜 큐가…