Java 네트워크 예외 — 타임아웃 정리

실무에서 발생하는 장애 중 상당수가 타임아웃 설정 누락에서 비롯된다. 연결은 됐는데 응답이 없어 스레드가 무한 대기하고, 결국 서버 전체가 응답 불가 상태에 빠지는 패턴이다. 이번 글에서는 두 종류의 타임아웃을 명확히 이해하고, 어떻게 적용해야 하는지 정리한다 연결 타임아웃 (Connect Timeout) OS…

Java 네트워크 예외 — 연결 예외 정리

네트워크 프로그래밍에서 예외는 크게 두 범주로 나뉜다. 연결 자체가 불가능한 경우와, 연결은 시도됐지만 실패하는 경우다. 이번 글에서는 소켓 연결 시 발생하는 대표적인 예외 세 가지를 코드와 함께 정리한다 예제 코드 UnknownHostException 호스트 자체를 알 수 없을 때 발생한다. TCP연결 시도…

Java 네트워크 프로그래밍 – 서버 종료와 셧다운 훅

지금까지 클라이언트가 비정상 종료할 때 서버 자원이 누수되는 문제를 해결했다. 이번에는 한 단계 더 나아가 서버 자체를 종료할 때 연결된 모든 소켓과 스트림을 깔끔하게 반납하는 방법을 다룬다. 핵심은 자바가 제공하는 셧다운 훅(Shutdown Hook)과, 세션을 중앙에서 관리하는 SessionManager다 셧다운 훅(Shutdown Hook)이란…

Java 네트워크 프로그래밍 – 자원 정리 적용

이전 글에서 try-with-resources가 자원 정리 문제를 어떻게 해결하는지 확인했다. 이번에는 그 이론을 실제 네트워크 프로그램에 직접 적용한다. 먼저 finally로 자원을 직접 정리하는 방식(V4)을 적용하고, 이후 try-with-resources로 더 개선한다(V5). 두 방식 모두 다루는 이유는, 실무에서는 상황에 따라 try-with-resources를 적용할 수 없는…

Java 자원 정리 — finally의 함정과 try-with-resources

서버 애플리케이션은 클라이언트와 달리 프로세스가 계속 살아있어야 한다. 소켓, 스트림, DB 커넥션 같은 외부 자원을 제때 닫지 않으면 자원이 고갈되고 결국 서버가 죽는다. 자원 정리는 네트워크 서버 개발자에게 선택이 아닌 필수다. 이번 글에서는 자원 정리 코드를 단계적으로 개선하면서, 그 과정에서…

Java 네트워크 프로그래밍 – 멀티스레드 서버와 자원 정리 문제

이전 글에서 단일 스레드 서버의 한계를 확인했다. accept()와 readUTF() 두 블로킹 작업이 하나의 스레드를 공유하면, 두 번째 클라이언트는 영원히 응답을 받을 수 없다. 이번에는 역할을 분리하여 여러 클라이언트를 동시에 처리하는 서버로 개선한다 설계 – 역할 분리 핵심은 두 블로킹 작업을…

Java 네트워크 프로그래밍 – 지속 통신과 다중 클라이언트 문제

이전 글에서 “Hello”를 한 번 주고받고 종료하는 가장 단순한 네트워크 프로그램을 만들었다. 이번에는 exit를 입력할 때까지 계속 메시지를 주고받는 버전으로 개선하고, 여기서 자연스럽게 드러나는 단일 스레드 서버의 구조적 한계를 분석한다 네트워크 프로그램 V2 – 지속 통신 ServerV2 V1과의 차이는 단…

Java 네트워크 프로그래밍 – TCP-IP 소켓 통신 기초

TCP/IP 핸드쉐이크, 패킷 처리는 OS와 JVM이 대신 해주기 때문에, 개발자는 소켓을 만들고 스트림으로 데이터를 주고받는 것에만 집중하면 된다 로깅 유틸리티 준비 멀티스레드 환경에서 디버깅할 때 스레드 이름과 시각이 함께 출력되면 흐름을 파악하기 훨씬 쉽다. 네트워크 프로그램도 결국 멀티스레드와 함께 쓰이므로,…

File과 Files – 파일 관리 성능 최적화

Legacy File vs Modern Files & Path 과거의 방식 – java.io.File File 클래스는 자바의 탄생과 함께했지만, 몇 가지 치명적인 단점이 있다 현대적인 방식 – java.nio.file.Files & Path 자바 1.7(NIO.2)부터 도입된 이 방식은 성능과 편의성을 획기적으로 개선했다 현대적인 Java 환경에서는 Files 사용을 권장한다. 특히…

I/O 활용 – 회원 관리 시스템

자바의 다양한 I/O 방식을 활용해 실무에서 가장 기본이 되는 회원 관리 시스템을 단계별로 구축해본다. 단순히 데이터를 저장하는 것을 넘어, 어떻게 하면 더 효율적이고 객체지향적으로 데이터를 관리할 것인가?에 초점을 맞춰본다 도메인 모델 설계 – Member와 Interface 모든 저장소 구현체는 MemberRepository 인터페이스를…