Category language

Java로 HTTP 서버 만들기 — 소켓 위에 HTTP 올리기

HTTP는 결국 TCP 위에서 동작하는 텍스트 프로토콜이다. 즉 다음과 같은 흐름이다 소켓을 열고, 텍스트를 읽고, HTTP 규약에 맞춰 응답을 쓰면 된다 HTTPServerV1 서버를 실행한 후 브라우저에서 http://localhost:12345에 접속하면 된다 설계 포인트 BufferedReader와 PrintWriter를 선택한 이유 HTTP는 텍스트 기반 프로토콜이다. 바이트…

Java 채팅 프로그램 서버 구현 — Null Object 패턴

3편에서 커맨드 패턴을 도입해 명령어마다 독립적인 클래스를 만들었다. 그런데 CommandManagerV3의 execute()를 보면 아직 한 가지 거슬리는 부분이 남아 있다 명령어를 찾고, null이면 처리하고, 아니면 실행한다. 로직 자체는 맞지만 null 체크가 흐름을 끊는다. 이상적인 코드는 이렇다 명령어를 찾고, 바로 실행한다. 이…

Java 채팅 프로그램 서버 구현 — 커맨드 패턴 리팩토링

2편에서 채팅 서버의 기능을 완성했다. 그런데 CommandManagerV2의 execute()메서드를 다시 보면 마음이 불편하다. if-else가 5개 들어서 있고, 새 명령어가 생길 때마다 이 덩어리 안에 코드를 끼워 넣어야 한다. 이번에는 커맨드 패턴(Command Pattern)을 도입해 이 문제를 깔끔하게 해결한다 문제 정의 문제는 두…

Java 채팅 프로그램 서버 구현 — 기능 완성

1편에서 뼈대를 완성했다. 클라이언트끼리 메시지를 주고 받는 핵심 흐름은 동작하지만, 사용자 이름도 없고 명령어 체계도 없었다. 2편에서는 실제로 쓸 수 있는 채팅 서버를 완성한다. 목표는 단순하다. CommandManager 인터페이스의 구현체만 새로 작성하면 된다. 서버 코드는 손대지 않는다. 인터페이스로 추상화해둔 덕분이다 구현할…

Java 채팅 프로그램 서버 구현 — 뼈대 설계와 핵심 구조

네트워크 소켓 프로그래밍의 기초를 익혔다면, 이제 실전 프로젝트를 통해 그 지식을 단단히 굳혀볼 차례다. Java로 멀티클라이언트를 단계적으로 구현해본다. 먼저 핵심 뼈대 구조를 완성하는 데 집중한다 전체 구조 한눈에 보기 클라이언트가 메시지를 보내면 해당 Session이 수신하고, CommandManager에게 처리를 위임한다. CommandManager는 SessionManager를…

Java 네트워크 예외 — TCP 종료와 예외 정리

TCP 연결을 종료하는 방법은 두 가지다. 서로 합의하며 마무리하는 정상 종료와 문제가 생겨 즉시 끊어버리는 강제 종료. 각 상황에서 어떤 예외가 발생하고 어떻게 처리해야 하는지 코드와 함께 정리한다 정상 종료 (FIN) socket.close()를 호출하면 TCP는 종료를 알리는 FIN 패킷을 상대방에게 전송한다.…

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를 적용할 수 없는…