1장. 네트워크 기초
항상 어떤 기술을 공부할 때에는 그 배경이 되는 원리 또는 기반 지식에 대해서도 충분한 이해가 반드시 필요하다고 생각한다. 따라서 1장에서는 네트워크와 네트워킹의 기본이 되는 OSI 7계층, 인터넷과 인터넷 관련 프로토콜, 그리고 네트워크 프로그래밍에서 주로 다루게 될 TCP/IP 스택, 소켓과 포트 등에 대해 살펴본다.
2장. 스레드
네트워크 프로그램에서 기초적으로 알고 있어야 할 부분이면서 또한 가장 중요한 부분인 스레드에 대해서 살펴본다. 스레드의 기본적인 개념들로부터 시작해서 재사용성과 확장성을 고려한 바람직한 스레드 구현법, 효과적인 종료기법에 대해 알아본다. 또한 데몬 스레드와 스레드 그룹, 스레드 우선순위에 대해서도 간략하게 알아보고 멀티 스레드를 사용할 때의 동기화 문제점 및 자바에서의 해결책에 대해서도 배운다.
3장. 자바 IO
자바 IO와 관련된 기본적인 클래스들은 java.io 패키지에 존재한다. 따라서 이 장에서는 java.io 패키지에 존재하는 클래스를 사용해서 자바 IO를 사용하는 방법을 살펴본다. 하지만 단순하게 자바 IO만을 가지고 설명하지는 않는다. 자바 IO를 공부하는 방법, 객체지향에서의 상속에 대한 중요 문법에 대한 설명을 함께 얘기한다.
4장. 바이트 스트림: 바이트 단위 IO 클래스
모든 데이터는 바이트 단위로 구성되기 때문에 java.io 패키지에 있는 클래스 중에서 바이트 스트림을 가장 자주 사용한다. 그렇지만 많은 개발자들이 바이트 스트림 클래스의 사용 방법에 대해서 어려워하는 것을 많이 봤다. 바이트 스트림 클래스의 사용 원리를 이해하지 못하기 때문이다. 따라서 이 장에서는 바이트 스트림 클래스의 사용 원리를 예제와 함께 구체적으로 다룬다.
5장. 문자 스트림: 문자 단위 IO 클래스
문자 단위 IO 클래스와 바이트 단위 IO 클래스의 사용법은 비슷하다. 굳이 다른 점을 찾자면바이트 단위로 입출력을 하느냐, 문자 단위로 입출력을 하느냐의 차이가 있을 뿐이다. 따라서 이 장에서는 문자 단위 IO 클래스를 바이트 단위 IO 클래스와 비교하면 설명한다. 참고적으로 바이트 단위의 대표적인 사용 예는 텍스트를 데이터베이스에 저장하고 읽어오고자 할 경우다.
6장. 객체 스트림
객체 안에 저장된 내용을 파일로 저장하거나 네트워크로 전송하려면 많은 노력이 필요한데, 이를 해결하기 위한 기술이 객체 스트림이다. 객체 스트림의 사용 방법은 기능은 엄청나게 강력하다. 객체 스트림을 명확하게 이해할 필요가 있다. 그리고 한 가지 더! 객체 스트림은 자바 RMI의 기반 기술이 되므로 자바 RMI를 이해하려면 객체 기반 스트림에 대한 확실한 이해가 필요하다.
7장. 네트워크 프로그래밍 기초
네트워크 프로그래밍의 기초를 다룬다. 네트워크의 프로그래밍의 기본적인 개념과 IP, 도메인에 대해서 살펴보고 InetAddress 클래스를 이용해서 IP를 도메인으로 변경하는 예제도 작성해본다. 그렇지만 지면 관계로 아주 자세하게는 설명하지 않는다. 따라서 네트워크 프로그래밍을 전혀 모르는 독자는 네트워크 프로그래밍을 전문적으로 다룬 다른 서적을 참고하기 바란다.
8장. TCP 프로그래밍
TCP 프로그래밍을 잘하려면 자바 IO에 대한 확실한 이해가 필요하다. TCP 프로그래밍을 학습해보면 알겠지만, 네트워크로부터 전송받고 전송하는 일들이 마치 파일로부터 읽고 쓰는 것과 같은 방식으로 작성되기 때문이다. 이 장에서는 이처럼 네트워크 프로그래밍 중에서 가장 기본이라고 할 수 있는 TCP 프로그래밍에 대해 배운다.
9장. UDP 프로그래밍
이 장의 주인공은 UDP 프로그래밍이다. UDP 프로그래밍은 보통 근거리 네트워크 프로그래밍에 적합하다. 근거리 네트워크의 경우에는 패킷이 유실될 확률이 거의 없기 때문이다. 패킷이 유실될 확률이 높다는 단점만 제외하면 UDP 프로그래밍에는 속도 면에서 큰 장점이 있다. 그리고 UDP는 다음 장에 배우게 될 멀티캐스팅을 이해하기 위한 선수 조건이다. 멀티캐스팅의 경우, 내부적으로 UDP를 사용하기 때문이다. 멀티캐스팅이 UDP를 사용한다는 것은 멀티캐스팅이 UDP의 장점을 활용한다는 의미와 같다.
10장. URL 관련 클래스
WWW(World Wide Web)은 아마 대부분의 사람들이 알 것이다. 이 장에서는 이 WWW와 관련 있는 몇 개의 클래스에 대해서 알아볼 것인데, 특정 웹 페이지의 정보를 구하거나 웹 페이지의 내용을 읽어 들이는 방법 등을 학습할 것이다. 특히 URLConnection 클래스는 HTTP 프로토콜을 완전히 모르더라도 웹 페이지의 내용을 읽어오는 등의 기능을 할 수 있게 해주므로 더욱 중요하다.
11장. 멀티캐스드
이 장에서는 서버가 필요 없는 채팅 프로그램 등 예제를 통해 멀티캐스트에 대해 알아본다. 그렇지만 채팅 프로그램은 멀티캐스트의 기능에 대해서 알아보기 위한 예제였고, 멀티캐스트가 실제로 적용되고 사용될 부분은 인터넷을 이용한 방송 부문이 될 것이다. 적은 자원으로 많은 사람에게 멀티미디어 자료를 전송할 수 있기 때문이다. 따라서 멀티캐스트를 이용한 멀티미디어 방송의 확산은 매우 빨라질 것이며 이런 의미에서 멀티캐스트 프로그래밍은 매우 중요하다.
12장. NIO 개요
NIO를 공부하기 위해서 필요한 제반 지식이라 할 수 있는 것들에 대해 간단하지만 모두 살펴본다. 간단히 요약하면 IO의 흐름을 살펴보면서 자바 IO가 왜 느렸는지에 대해 배우고 운영체제에서 IO 성능 향상을 위해 사용하는 버퍼, Scatter/Gather, 가상 메모리, 메모리 맵 파일, 파일 락킹에 대해서 공부한다. 또한 앞으로 공부하게 될, 자바에서 새롭게 도입된 NIO의 핵심적인 부분들에 대해서도 간략하게 소개한다.
13장. 버퍼
이 장에서는 다룰 주제는 데이터를 효율적으로 다루기 위해 새롭게 탄생한 버퍼(Buffer)다. 이 버퍼를 공부하면서 버퍼 API가 얼마나 사용하기 쉽고, 다루기 쉽게 설계되었는지도 함께 생각해보기 바란다. 이런 생각을 통해 앞으로 여러분들의 코드가 좀 더 우아해지고 세련되어 질 것이다.
14장. 채널
이 장에서는 채널에 대해 자세히 배운다. 본문에서 자세히 다루겠지만 채널 안의 파일 매핑을 통해서 가상 메모리를 이용하는 것은 엄청난 성능 향상을 가져다 준다. 또한 파일 매핑의 성격상 잦은 업데이트가 발생하는 큰 데이터를 유지하는 경우에도 적합하다. 따라서 채널을 사용하면 다양한 곳에서 사용할 수 있는 훌륭한 캐싱 컴포넌트가 될 수 있을 것이 생각한다.
15장. 셀렉터
우리는 이 장을 통해서 멀티플렉스 모델의 서버를 만들기 위해 필요한 내용인 셀렉터를 중점적으로 살펴본다. 그리고 마지막으로 멀티플렉스 모델의 간단한 채팅서버와 클라이언트를 만들어서 실전에서 응용할 수 있게 했다.
16장. 향상된 서버 만들기
기존의 네트워크 프로그래밍 모델의 한계점을 지적하면서 독자들의 응용력을 키우게 하기 위해서 앞서 15장에서 만들어 본 예제 코드를 업그레이드한 AdvancedChatServer를 만든다. 그렇지만 비즈니스 로직 측면이 아닌 향상된 서버를 만들기 위한 해법을 찾아본다. 이미 채팅에 관련된 소스는 인터넷만 찾아봐도 굉장히 많이 있고 그런 로직은 개발자라면 당연히 스스로 분석해서 작성할 수 있어야 하기 때문이다.
17장. RMI
RMI는 마치 로컬에 있는 객체를 사용하는 것처럼 원격의 객체를 사용할 수 있게 해준다. 원격의 객체를 사용한다는 것은 네트워크 통신이 내부적으로 이뤄진다는 것을 의미하며, 더 이상 프로토콜을 신경 쓰지 않아도 된다는 것이다. RMI는 속도보다는 작업의 편의성을 높이고 싶거나, 프로토콜의 복잡도에서 해방되고 싶은 경우에 사용하는 것이 좋다.