• 네티 인 액션
  • Netty를 이용한 자바 기반의 고성능 서버 & 클라이언트 개발

  • 노먼 마우러, 마빈 알렌 울프탈 지음
  • 최민석 옮김

  • 시스템 & 네트워크 시리즈_004
  • ISBN: 9791158390327
  • 25,000원 | 2016년 04월 15일 발행 | 336쪽



네티는 복잡한 네트워킹, 멀티스레드, 동시성을 관리하는 자바 기반 네트워킹 프레임워크로서, 반복적인 저수준 코드를 내부로 감춤으로써 비즈니스 논리를 분리하고 쉽게 재사용할 수 있게 해준다. 네티를 도입하면 사용하기 쉬운 API를 활용해 애플리케이션의 고유한 논리를 작성하는 데만 집중할 수 있다.

『네티 인 액션』은 네티 프레임워크를 소개하고 자바 네트워크 애플리케이션에 통합하는 방법을 설명하며, 저수준 API를 직접 다루지 않고도 확장성이 우수한 애플리케이션을 개발하는 방법을 다룬다. 또한 다양한 예제를 통해 비동기식 네트워킹 개발을 위한 사고방식을 소개하고 대규모 네트워크 애플리케이션을 개발하는 최적의 방법을 익힐 수 있게 도와준다. 이 책은 자바와 기본 네트워크 인프라에 대한 경험이 있는 독자에게 적합하다.

 

추천평

“네티에 대한 최초의 책... 고성능, 저지연 네트워크 애플리케이션을 개발하는 방법을 배울 수 있다.”

-- 이희승, 네티 창시자

“기본 개념부터 최상의 방법까지 모든 것을 해결하는 고성능 자바 네트워크 스택”

-- 크리스찬 바하, 그리드 트레이딩 플랫폼

“네티의 모든 것을 활용하는 방법을 설명하는 가장 자세한 내용”

-- 위르겐 호프만, 레드햇

“네티 프레임워크에 대한 탁월한 안내서. 자바로 고성능 네트워크 입출력을 다루는 모든 개발자에게 추천하고 싶은 책”

-- 예스틴 존슨, 임팩트 라디어스

책 속으로

웹 애플리케이션 서버를 이용하면 HTTP나 RPC 서버를 제작하는 방법을 배울 필요가 없는 날이 온다고 생각하던 때가 있었다. 아쉽게도 이런 희망은 오래 지속되지 않았다. 우리가 다뤄야 하는 기능 변경의 양과 속도가 날로 증가하면서 기존의 3계층 아키텍처로 감당할 수 없는 수준이 됨에 따라 이제는 애플리케이션을 여러 조각으로 나눠서 다수의 시스템으로 구성된 대규모 클러스터로 분산해야 하는 상황에 이르렀다.

이러한 대규모 분산 시스템을 운영하려면 운영 비용과 대기 시간이라는 두 가지 흥미로운 문제를 고려해야 한다. 단일 노드의 성능을 30% 또는 100% 이상으로 개선하면 얼마나 많은 시스템을 줄일 수 있을까? 단일 웹 브라우저에서 다수의 시스템을 통해 십여 개의 내부 원격 프로시저 호출을 트리거할 때 최적의 지연 시간을 달성하려면 어떻게 해야 할까?

네티의 핵심 기여자 중 한 명인 노먼 마우러는 네티 프로젝트에 대한 최초의 책 『네티 인 액션』에서 네티로 고성능 저대기 시간 네트워크 애플리케이션을 구축하는 방법으로 이러한 문제의 해결책을 제시한다.

이 책을 마칠 때쯤에는 간소한 HTTP 서버부터 고도의 세부 설정이 가능한 RPC 서버까지 거의 모든 네트워크 애플리케이션을 구축할 수 있게 될 것이다.

무엇보다 『네티 인 액션』의 놀라운 점은 이 책이 네티의 구석구석을 모두 아는 핵심 기여자가 집필했다는 것만이 아니라 트위터, 페이스북, 파이어베이스 등 네티를 실무 시스템에 활용하고 있는 여러 기업의 실제 사례 연구를 담고 있다는 점이다. 이러한 사례 연구를 통해 이들 기업에서 네티 기반 애플리케이션의 역량을 최대한으로 끌어올리는 데 사용한 방법을 이해할 수 있게 될 것이다.

2001년 필자의 학부 시절 개인 프로젝트로 세상에 선보인 네티(http://t.motd.kr/ko/archives/1930)는 프로젝트(http://netty.io/community.html)에 참여하는 노먼과 같은 열정적인 기여자들의 값진 노력에 힘입어 지금 이 순간에도 활발한 생명력을 보여주고 있다. 이 책이 '네트워크 프로그래밍의 미래를 향한' 길에 동참하도록 많은 독자에게 동기를 부여하고 프로젝트의 새로운 측면에 활기를 불어넣기를 기대한다.

-- 이희승 네티 창시자

노먼 마우러 (Norman Maurer)

노먼 마우러는 네티의 핵심 개발자 중 한 명으로서, 아파치 소프트웨어 재단의 회원이며, 여러 해 동안 다양한 오픈소스 프로젝트에 기여자로 활약해왔다. 현재 애플에서 선임 소프트웨어 엔지니어로 근무하면서 iCloud 팀의 네티와 여러 네트워크 관련 프로젝트를 담당하고 있다.

마빈 알렌 울프탈 (Marvin Allen Wolfthal)

마빈 울프탈은 여러 해 동안 다양한 소프트웨어 개발 분야에서 개발자, 설계자, 강사, 저자로 활약했다. 초창기부터 자바를 이용해 개발을 해왔고 썬마이크로시스템즈에서 분산 객체 기술을 홍보하기 위해 개발한 최초의 프로그램 개발에도 참여했다. 또한 썬 에듀케이션 센터에서 C++, 자바, CORBA를 이용하는 최초의 크로스 랭귀지 프로그래밍 강좌를 개설하고 운영하기도 했다. 현재는 델 서비스의 컨설턴트로서 자바 업계에서 개발된 방법론을 엔터프라이즈 컴퓨팅의 여러 영역에 도입하는 데 집중하고 있다.

최민석

번역회사에서 언어전문가로 일하다 뜻하는 바를 이루기 위해 프리랜서로 독립해서 현재는 전문 번역가로 일하고 있다. 주로 IT 관련 소프트웨어의 현지화와 개발자 웹 사이트 관련 프로젝트를 진행하고 있으며 앞으로 개발자 서적 분야에서 작은 변화를 일으키고 싶다는 소박한 소망을 하고 있다. 번역가의 고민은 독자의 고민과 반비례한다는 믿음으로 오늘도 기꺼이 고민할 준비가 돼 있다. 번역한 책으로는 『유니티와 C#으로 배우는 게임 개발 교과서』 『게임 디자인 워크숍』 『시작하세요! 스프링 4 프로그래밍』 『자바 웹 개발 완벽 가이드』 『엔터프라이즈 애플리케이션 아키텍처 패턴』이 있다.

  • [01부] 네티 개념과 아키텍처
    • ▣ 01장: 네티 - 비동기식 이벤트 기반 네트워킹 프레임워크
      • 1.1 자바의 네트워킹
        • 1.1.1 자바 NIO
        • 1.1.2 셀렉터
      • 1.2 네티 소개
        • 1.2.1 네티는 누가 사용할까?
        • 1.2.2 비동기식 이벤트 기반 네트워킹
      • 1.3 네티의 핵심 컴포넌트
        • 1.3.1 Channel
        • 1.3.2 콜백
        • 1.3.3 Future
        • 1.3.4 이벤트와 핸들러
        • 1.3.5 내용 정리
      • 1.4 요약
      •  
    • ▣ 02장: 첫 번째 네티 애플리케이션
      • 2.1 개발 환경 설정
        • 2.1.1 JDK 내려받기와 설치
        • 2.1.2 IDE 내려받기와 설치
        • 2.1.3 아파치 메이븐 내려받기와 설치
        • 2.1.4 툴셋 구성
      • 2.2 네티 클라이언트/서버 개요
      • 2.3 Echo 서버 만들기
        • 2.3.1 ChannelHandler와 비즈니스 논리
        • 2.3.2 서버 부트스트랩
      • 2.4 Echo 클라이언트 만들기
        • 2.4.1 ChannelHandler를 이용한 클라이언트 논리 구현
        • 2.4.2 클라이언트 부트스트랩
      • 2.5 Echo 서버와 클라이언트의 빌드와 실행
        • 2.5.1 빌드
        • 2.5.2 Echo 서버와 클라이언트 실행
      • 2.6 요약
      •  
    • ▣ 03장: 네티 컴포넌트와 설계
      • 3.1 Channel, EventLoop, ChannelFuture
        • 3.1.1 Channel 인터페이스
        • 3.1.2 EventLoop 인터페이스
        • 3.1.3 ChannelFuture 인터페이스
      • 3.2 ChannelHandler와 ChannelPipeline
        • 3.2.1 ChannelHandler 인터페이스
        • 3.2.2 ChannelPipeline 인터페이스
        • 3.2.3 ChannelHandler에 대한 고찰
        • 3.2.4 인코더와 디코더
        • 3.2.5 추상 클래스 SimpleChannelInboundHandler
      • 3.3 부트스트랩
      • 3.4 요약
      •  
    • ▣ 04장: 전송
      • 4.1 사례 연구: 전송 마이그레이션
        • 4.1.1 네티 없이 OIO와 NIO 이용
        • 4.1.2 네티와 함께 OIO와 NIO 이용
        • 4.1.3 논블로킹 네티 버전
      • 4.2 전송 API
      • 4.3 포함된 전송
        • 4.3.1 NIO: 논블로킹 입출력
        • 4.3.2 Epoll: 리눅스용 네이티브 논블로킹 전송
        • 4.3.3 OIO: 기존 블로킹 입출력
        • 4.3.4 JVM 내부 통신용 로컬 전송
        • 4.3.5 임베디드 전송
      • 4.4 전송 사용 사례
      • 4.5 요약
      •  
    • ▣ 05장: ByteBuf
      • 5.1 ByteBuf API
      • 5.2 ByteBuf 클래스: 네티의 데이터 컨테이너
        • 5.2.1 작동 방식
        • 5.2.2 ByteBuf 사용 패턴
      • 5.3 바이트 수준 작업
        • 5.3.1 임의 접근 인덱싱
        • 5.3.2 순차 접근 인덱싱
        • 5.3.3 폐기할 수 있는 바이트
        • 5.3.4 읽을 수 있는 바이트
        • 5.3.5 기록할 수 있는 바이트
        • 5.3.6 인덱스 관리
        • 5.3.7 검색 작업
        • 5.3.8 파생 버퍼
        • 5.3.9 읽기/쓰기 작업
      • 5.3.10 추가 작업
      • 5.4 ByteBufHolder 인터페이스
      • 5.5 ByteBuf 할당
        • 5.5.1 주문식 할당을 위한 ByteBufAllocator 인터페이스
        • 5.5.2 풀링되지 않는 버퍼
        • 5.5.3 ByteBufUtil 클래스
      • 5.6 참조 카운팅
      • 5.7 요약
      •  
    • ▣ 06장: ChannelHandler와 ChannelPipeline
      • 6.1 ChannelHandler 계층
        • 6.1.1 Channel 수명주기
        • 6.1.2 ChannelHandler 수명주기
        • 6.1.3 ChannelInboundHandler 인터페이스
        • 6.1.4 ChannelOutboundHandler 인터페이스
        • 6.1.5 ChannelHandler 어댑터
        • 6.1.6 리소스 관리
      • 6.2 ChannelPipeline 인터페이스
        • 6.2.1 ChannelPipeline 수정
        • 6.2.2 이벤트 생성
      • 6.3 ChannelHandlerContext 인터페이스
        • 6.3.1 ChannelHandlerContext 이용
        • 6.3.2 ChannelHandler와 ChannelHandlerContext의 고급 활용
      • 6.4 예외 처리
        • 6.4.1 인바운드 예외 처리
        • 6.4.2 아웃바운드 예외 처리
      • 6.5 요약
      •  
    • ▣ 07장: EventLoop와 스레딩 모델
      • 7.1 스레딩 모델의 개요
      • 7.2 EventLoop 인터페이스
        • 7.2.1 네티 4의 입출력과 이벤트 처리
        • 7.2.2 네티 3의 입출력 작업
      • 7.3 작업 스케줄링
        • 7.3.1 JDK 스케줄링 API
        • 7.3.2 EventLoop를 이용한 작업 스케줄링
      • 7.4 구현 세부 사항
        • 7.4.1 스레드 관리
        • 7.4.2 EventLoop와 스레드 할당
      • 7.5 요약
      •  
    • ▣ 08장: 부트스트랩
      • 8.1 부트스트랩 클래스
      • 8.2 비연결 프로토콜과 클라이언트 부트스트랩
        • 8.2.1 클라이언트 부트스트랩
        • 8.2.2 Channel과 EventLoopGroup 호환성
      • 8.3 서버 부트스트랩
        • 8.3.1 ServerBootstrap 클래스
        • 8.3.2 서버 부트스트랩
      • 8.4 채널에서 클라이언트 부트스트랩
      • 8.5 부트스트랩 중 여러 ChannelHandler 추가
      • 8.6 네티 ChannelOption과 특성 이용
      • 8.7 DatagramChannel 부트스트랩
      • 8.8 종료
      • 8.9 요약
      •  
    • ▣ 09장: 단위 테스트
      • 9.1 EmbeddedChannel 개요
      • 9.2 EmbeddedChannel을
      • ChannelHandler 테스트
        • 9.2.1 인바운드 메시지 테스트
        • 9.2.2 아웃바운드 메시지 테스트
      • 9.3 예외 처리 테스트
      • 9.4 요약
      •  
  • [02부] 코덱
    • ▣ 10장: 코덱 프레임워크
      • 10.1 코덱이란?
      • 10.2 디코더
        • 10.2.1 ByteToMessageDecoder 추상 클래스
        • 10.2.2 ReplayingDecoder 추상 클래스
        • 10.2.3 MessageToMessageDecoder 추상 클래스
        • 10.2.4 TooLongFrameException 클래스
      • 10.3 인코더
        • 10.2.3 MessageToByteEncoder 추상 클래스
        • 10.2.3 MessageToMessageEncoder 추상 클래스
      • 10.4 추상 코덱 클래스
        • 10.4.1 ByteToMessageCodec 추상 클래스
        • 10.2.3 MessageToMessageCodec 추상 클래스
        • 10.4.3 CombinedChannelDuplexHandler 클래스
      • 10.5 요약
      •  
    • ▣ 11장: 네티에서 제공하는 ChannelHandler와 코덱
      • 11.1 SSL/TLS를 이용한 네티 애플리케이션 보안
      • 11.2 네티 HTTP/HTTPS 애플리케이션 개발
        • 11.2.1 HTTP 디코더, 인코더, 코덱
        • 11.2.2 HTTP 메시지 집합체
        • 11.2.3 HTTP 압축
        • 11.2.4 HTTPS 이용
        • 11.2.5 웹소켓
      • 11.3 유휴 연결과 시간 만료
      • 11.4 구분 기호 및 길이 기반 프로토콜의 디코딩
        • 11.4.1 구분 기호 프로토콜
        • 11.4.2 길이 기반 프로토콜
      • 11.5 대용량 데이터 기록
      • 11.6 데이터 직렬화
        • 11.6.1 JDK 직렬화
        • 11.6.2 JBoss 마셜링을 이용한 직렬화
        • 11.6.3 프로토콜 버퍼를 통한 직렬화
      • 11.7 요약
      •  
  • [03부] 네트워크 프로토콜
    • ▣ 12장: 웹소켓
      • 12.1 웹소켓 소개
      • 12.2 예제 웹소켓 애플리케이션
      • 12.3 웹소켓 지원 추가
        • 12.3.1 HTTP 요청 처리
        • 12.3.2 웹소켓 프레임 처리
        • 12.3.3 ChannelPipeline 초기화
        • 12.3.4 부트스트랩
      • 12.4 애플리케이션 테스트
        • 12.4.1 암호화
      • 12.5 요약
      •  
    • ▣ 13장: UDP를 이용한 이벤트 브로드캐스팅
      • 13.1 UDP 기본 사항
      • 13.2 UDP 브로드캐스트
      • 13.3 UDP 예제 애플리케이션
      • 13.4 메시지 POJO: LogEvent
      • 13.5 브로드캐스터 작성
      • 13.6 모니터 작성
      • 13.7 LogEventBroadcaster와 LogEventMonitor 실행
      • 13.8 요약
      •  
  • [04부] 사례 연구
    • ▣ 14장: 사례 연구 1부
      • 14.1 드로플러: 모바일 서비스 구축
        • 14.1.1 초기 상황
        • 14.1.2 드로플러의 작동 방식
        • 14.1.3 빠른 업로드 환경 구축
        • 14.1.4 기술 스택
        • 14.1.5 성능
        • 14.1.6 요약: 든든한 도우미
      • 14.2 파이어베이스: 실시간 데이터 동기화 서비스
        • 14.2.1 파이어베이스 아키텍처
        • 14.2.2 롱 폴링
        • 14.2.3 HTTP 1.1 keep-alive와 파이프라인
        • 14.2.4 SslHandler 제어
        • 14.2.5 파이어베이스 요약
      • 14.3 어번 에어십: 모바일 서비스 구축
        • 14.3.1 모바일 메시징의 기본
        • 14.3.2 타사 푸시 전달
        • 14.3.3 이진 프로토콜
        • 14.3.4 직접 장치 전송
        • 14.3.5 네티의 탁월한 동시 연결 지원 능력
        • 14.3.6 요약: 방화벽의 경계를 넘어
      • 14.4 요약
      •  
    • ▣ 15장: 사례 연구 2부
      • 15.1 페이스북에서의 네티: 니프티와 스위프트
        • 15.1.1 스리프트란?
        • 15.1.2 네티를 이용한 자바 스리프트의 상태 개선
        • 15.1.3 니프티 서버 설계
        • 15.1.4 니프티 비동기 클라이언트 설계
        • 15.1.5 스위프트: 자바 스리프트 서비스를 구축하는 더 빠른 방법
        • 15.1.6 결과
        • 15.1.7 페이스북 요약
      • 15.2 트위터에서의 네티: 피네이글
        • 15.2.1 트위터의 성장통
        • 15.2.2 피네이글의 탄생
        • 15.2.3 피네이글의 작동 방식
        • 15.2.4 피네이글의 추상화
        • 15.2.5 오류 관리
        • 15.2.6 서비스 구성
        • 15.2.7 미래: 네티
        • 15.2.8 트위터 요약
      • 15.3 요약
      •  
  • [부록] 메이븐 소개
    • A.1 메이븐이란?
      • A.1.1 메이븐 설치와 구성
      • A.1.2 메이븐의 기본 개념
    • A.2 POM 예제
      • A.2.1 프로젝트 POM
      • A.2.2 POM 상속과 집계
    • A.3 메이븐 명령줄
    • A.4 요약
  • 6쪽, 본문 8번째 줄

    네이티브 시스템 소켓 라이브리가 제공하는

    ==>

    네이티브 시스템 소켓 라이브러리가 제공하는

  • 25쪽, 두 번째 메서드 선언부

    public void start() throws Exceptio3n

    ==>

    public void start() throws Exception

  • 28쪽, 상단 예제

    cause.printStrackTrace();

    ==>

    cause.printStackTrace();

  • 47쪽, 밑에서 11번째 줄

    클라이언트를 부트스트랩하는 데는 EventLoopGroup 하나가 필요하지만 서버를 부트스트랩할 때는 ServerBootstrap 두 개(동일한 인스턴스일 수 있음)가 필요하다는 것이다.

    ==>

    클라이언트를 부트스트랩하는 데는 EventLoopGroup 하나가 필요하지만 ServerBootstrap은 두 개의 EventLoopGroup(동일한 인스턴스일 수 있음)을 필요로 한다는 것이다.

예제코드 관련 깃허브 페이지

관련 글


엮인 글

엮인 글 주소: http://wikibook.co.kr/netty-in-action/trackback/