• 네이버를 만든 기술, 읽으면서 배운다 - 자바편

  • 강경태, 강운덕, 구태진, 김민수, 김택수, 박세훈, 송기선, 이상민, 정상혁, 최동순 지음

  • TECH@NAVER 시리즈_010
  • ISBN: 9788998139780
  • 20,000원 | 2015년 03월 5일 발행 | 304쪽



네이버 개발자들이 전하는 실전 자바

이 책은 네이버 기술 블로그인 헬로월드(http://helloworld.naver.com)에 올라왔던 자바와 관련된 글을 엄선해서 엮은 책이다. 헬로월드는 네이버 사내 기술 지식을 외부 개발자에게 공유할 목적으로 2011년 12월에 개설된 블로그다.

국내 소프트웨어 개발 환경에서 자바 개발의 비중이 높고 다양한 언어와 플랫폼을 사용하는 네이버에서도 자바 개발은 개발의 큰 축을 담당하고 있다. 네이버 자바 개발자들이 축적한 개발 지식과 문제 해결 경험, 실험 결과를 담은 이 책은 자바 라이브러리를 설계하거나 사용자가 많은 시스템을 운영하는 등 자바를 더 깊이 이해하고 싶은 독자에게 도움이 될 것이다.

★ 이 책에서 다루는 내용 ★

  • 자바 문법이나 라이브러리의 불편한 점, API와 라이브러리를 사용할 때 조심할 점, JDK에서 개선된 점
  • 애플리케이션에 문제가 생겼을 때 오류 분석에 필요한 지식과 JVM이 남기는 정보를 분석하는 방법, JVM 자체의 오류에 대처한 경험
  • 시스템의 성능과 안정성을 개선하기 위해 깊이 알아야 할 영역인 가비지 컬렉션에 관한 지식
  • 자바에서의 데이터베이스 연결 설정 분석

 

추천의 글

"시중에 자바 입문서는 많이 나와 있지만 자바의 API와 내부 작동 구조를 설명하는 책은 그리 많지 않다. 이 책은 최신 자바 8의 특징부터 이와 관련된 자바 주요 API의 작동 원리, JVM의 구조와 명세, 가비지 컬렉션 작동 원리 등 자바 개발자가 중고급 개발자로 성장하는 데 필수적인 내용으로 구성돼 있다. 무엇보다도 네이버의 현업 개발자들이 실제로 네이버 서비스를 개발하면서 겪은 자바 관련 기술 경험을 모은 책이어서 알기 쉬우면서도 전문성이 깊이 느껴지는 책이다."

-- 옥상훈(okgosu) 네이버 D2 에반젤리스트/제4대 한국자바개발자협의회 회장

 

상세 이미지

상세 이미지

강경태

SK C&C에서 근무했으며 현재는 네이버 스포츠 개발의 리더 역할을 하고 있다. CI(continuous integration)에 대한 지식과 경험이 많으며 ICT 전 분야에 관심이 있다.

강운덕

네이버에서 비동기 네트워크 라이브러리와 전사 자바 프레임워크, 트러블슈팅 업무를 수행했다. 현재는 Naver Labs에서 애플리케이션 성능 관리 플랫폼인 Pinpoint를 개발하고 있다.

구태진

2009년 네이버에 입사해 네트워크 라이브러리, 메시지 큐, 게이트웨이 서버 등을 개발했다. 현재는 Naver Labs에서 애플리케이션 성능 관리 플랫폼인 Pinpoint를 개발하고 있다.

김민수

현대정보기술, 야후!코리아와 벤처 기업에서 보안과 웹 서비스, 모바일 분야의 개발을 했다. 지금은 네이버에서 UGC 서비스를 담당하고 있다.

김택수

NHN에서 모바일 검색, 오픈캐스트, 지식백과, 네이버 캐스트 등의 서비스를 만들었고 지금은 다음카카오에서 카카오톡 서버를 개발하고 있다.

박세훈

자바 가상 머신에 관심이 많은 개발자. 네이버에서 위치 기반 서비스, 메시지 큐 등의 플랫폼 개발자로 근무하고 있다. 최근에는 분산 데이터 저장소, 빅데이터 분석 등으로 관심 분야를 넓히고 있다.

송기선

마법의 성에서 마법의 코드를 작성하는 마법과도 같은 남자(아마도). Naver Labs에서 일하고 있다.

이상민

현재 SK플래닛에서 근무 중이며 삼성SDS와 NHN에서 근무했다. 자바와 성능에 관련된 기술 지원이 주 업무다. 저서로 "자바의 신", "개발자가 반드시 알아야 할 자바 성능 튜닝 이야기", "프로그래머로 산다는 것"(공저) 등이 있다.

정상혁

JVM과 리눅스를 둘러싼 오픈소스 생태계에 관심이 많은 개발자다. 네이버의 여러 조직에서 신규 서비스와 라이브러리 개발, 문제 해결 지원, 교육 업무를 수행했다. 업무 자동화의 일환으로 가끔씩 긴 글을 쓴다.

최동순

새로운 아이디어를 얻을 수 있는 여행을 좋아하고 이것저것 작은 것들을 손으로 직접 만들어 보는 것을 좋아한다. 요즘은 분산 환경에서의 효율적인 협업을 위한 컨센서스 프로토콜(consensus protocol)에 관심이 많다.

  • [1부] 자바의 API 이해하기
    • ▣ 01장: 자바의 날짜와 시간 API
      • 자바 클래스에 담긴 제도의 역사
        • 1582년 10월 4일의 다음 날은?
        • 서울 1988년 5월 7일 23시의 1시간 후는?
        • 서울 1961년 8월 9일 23시 59분의 1분 후는?
        • 협정세계시 2012년 6월 30일 23시 59분 59초의 2초 후는?
      • JDK 기본 날짜 클래스의 문제점
        • 불변 객체가 아니다
        • int 상수 필드의 남용
        • 헷갈리는 월 지정
        • 일관성 없는 요일 상수
        • Date 클래스와 Calendar 클래스의 불편한 역할 분담
        • 오류에 둔감한 시간대 아이디 지정
        • java.util.Date 하위 클래스의 문제
      • 자바의 개선된 날짜, 시간 API, Joda-Time
      • JSR-310, 새로운 자바의 날짜 API
      • 마치며
      •  
    • ▣ 02장: 자바의 HashMap은 어떻게 작동하는가?
      • HashMap과 HashTable
      • 해시 분포와 해시 충돌
      • 자바 8 HashMap에서의 separate chaining
      • 해시 버킷의 동적 확장
      • 보조 해시 함수
      • String 객체에 대한 해시 함수
      • 자바 7에서 String 객체에 대한 별도의 해시 함수
      • 마치며
      •  
    • ▣ 03장: 자바에서 외부 프로세스를 실행할 때
      • java lang Process 클래스를 생성하는 2가지 방법
      • 외부 프로세스가 전달하는 스트림 처리 문제
      • 특정 환경에서 발생하는 메모리 할당 실패 문제
        • fork-exec 호출이 문제가 되는 경우
        • 대처 방안
      • Security Manager 클래스를 이용한 실행 제한
        • 정책 설정 파일 위치와 실행 옵션
        • 정책 설정 방법
      • 마치며
      •  
    • ▣ 04장: 람다가 이끌어 갈 모던 자바
      • 컬렉션 처리
      • 클래식 자바
        • 기본 컬렉션 처리 API
        • 자바의 기본 컬렉션을 개선한 라이브러리
      • JVM에서 실행되는 다른 언어의 익명 함수
      • 모던 자바
        • 클로저와 람다 표현식을 둘러싼 논란
        • 람다 표현식과 Stream 인터페이스의 도입
        • 람다 표현식의 내부 구현
        • 애플리케이션 코드의 개선
        • 람다 표현식을 활용한 프레임워크
      • 마치며
      •  
  • [2부] 문제 분석과 사례
    • ▣ 05장: JVM 이해하기
      • 가상 머신
      • 자바 바이트코드
        • 현상
        • 원인
      • 클래스 파일 포맷
      • JVM 구조
        • 클래스 로더
        • 런타임 데이터 영역
        • 실행 엔진
      • 자바 SE 7의 JVM 명세
        • String in switch Statements
      • 자바 SE 8의 JVM 명세
      • 마치며
      •  
    • ▣ 06장: 스레드 덤프 분석하기
      • 자바 그리고 스레드
      • 자바 스레드 배경 지식
        • 스레드 동기화
        • 스레드 상태
        • 스레드의 종류
      • 스레드 덤프 생성
        • jstack을 이용하는 방법
        • 자바 VisualVM을 이용하는 방법
        • kill을 이용하는 방법
      • 스레드 덤프의 정보
      • 스레드 덤프 유형별 패턴
        • 잠금을 소유하지 못하는 경우(BLOCKED)
        • 교착 상태인 경우
        • 원격 서버로부터 메시지를 수신받기 위해 계속 대기하는 경우
        • WAIT 상태에 있는 경우
        • 스레드 리소스를 정상적으로 정리하지 못하는 경우
      • 스레드 덤프를 이용한 문제 해결 사례
        • 상황1: CPU 사용률이 비정상적으로 높을 때
        • 상황2: 실행 성능이 비정상적으로 느릴 때
      • 스레드 덤프 분석을 쉽게 만드는 코딩
        • 스레드에 이름 부여하기
        • MBean으로 더 자세한 정보 얻기
      • 마치며
      •  
    • ▣ 07장: 자바 애플리케이션 분석을 위한 BTrace
      • BTrace란?
      • 특정 메서드 호출 시의 스택 트레이스 확인
      • 실행 시간과 횟수 측정
      • 객체의 필드값 확인
      • BTrace의 제약사항
      • 마치며
      •  
    • ▣ 08장: 하나의 메모리 누수를 잡기까지
      • 장애 징조 - 상반기의 장애 처리 일지
      • 모니터링 개선
        • 나 혼자 죽을 수 없다
        • 문자 메시지 스트레스
      • 문제 원인 찾기
      • 문제 해결
        • 히스토그램 비교
        • 힙 덤프 분석
      • 마치며
      •  
    • ▣ 09장: 고맙다 JVM, 사과해라 JVM 크래시
      • JVM 오류 현상
      • JVM의 명백한 버그
      • 버그 리포트와 릴리스 노트
      • 마치며
      •  
  • [3부] 가비지 컬렉션
    • ▣ 10장: 자바 가비지 컬렉션의 작동 과정
      • 가비지 컬렉션 과정 - Generational Garbage Collection
      • Young 영역의 구성
      • Old 영역에 대한 가비지 컬렉션
        • Serial GC(-XX:+UseSerialGC)
        • Parallel GC(-XX:+UseParallelGC)
        • Parallel Old GC(-XX:+UseParallelOldGC)
        • CMS GC(-XX:+UseConcMarkSweepGC)
        • G1 GC
      • 마치며
      •  
    • ▣ 11장: 가비지 컬렉션 모니터링 방법
      • 가비지 컬렉션 모니터링이란?
      • 가비지 컬렉션을 모니터링하는 방법은?
      • jstat
      • -verbosegc 옵션
      • VisualVM과 Visual GC
      • HPjmeter
      • 마치며
      •  
    • ▣ 12장 가비지 컬렉션 튜닝
      • 가비지 컬렉션 튜닝을 꼭 해야 할까?
        • Old 영역으로 넘어가는 객체의 수 최소화
        • Major GC 시간 줄이기
      • 가비지 컬렉션의 성능을 결정하는 옵션
      • 가비지 컬렉션 튜닝의 절차
        • 1.가비지 컬렉션 상황 모니터링
        • 2.모니터링 결과 분석 후 가비지 컬렉션 튜닝 여부 결정
        • 3.가비지 컬렉션 방식과 메모리 크기 지정
        • 4.결과 분석
        • 5.결과가 만족스러울 경우 전체 서버에 반영 및 종료
      • 가비지 컬렉션 상황 모니터링 및 결과 분석하기
      • 가비지 컬렉션 방식 지정과 메모리 크기 지정
        • 가비지 컬렉션 방식 지정
        • 메모리 크기 지정
      • 가비지 컬렉션 튜닝 결과 분석
      • 튜닝 사례
        • 튜닝 사례 1
        • 튜닝 사례 2
      • 마치며
      •  
    • ▣ 13장 자바의 Reference 클래스와 가비지 컬렉션
      • 가비지 컬렉션과 접근 가능성
      • soft reference, weak reference, phantom reference
      • Reference 클래스와 접근 가능성
      • 접근 가능성의 세기
      • softly reachable과 SoftReference
      • weakly reachable과 WeakReference
      • ReferenceQueue
      • phantomly reachable과 PhantomReference
      • 마치며
      •  
    • ▣ 14장 가비지 컬렉션과 Statement Pool
      • HTTP 요청에서 응답까지 가비지 컬렉션 발생 과정
      • Statement 객체의 크기
      • Statement Pool의 캐시 적중률이 Major GC에 미치는 영향
      • 마치며
      •  
    • ▣ 15장 아파치 MaxClients와 톰캣의 Major GC
      • 서비스 운영 환경
      • stop the world와 503 오류
      • MaxClients와 backlog
      • MaxClients 설정 계산 방법
      • 마치며
      •  
  • [4부] 데이터베이스 연결 설정
    • ▣ 16장 JDBC의 타임아웃 이해하기
      • 어느 날 발생한 DDoS 공격, 그 뒤로 먹통이 된 WAS
      • 왜 JDBC 드라이버에 대해 알아야 하는가?
      • WAS와 DBMS의 통신 시 타임아웃 계층
        • 트랜잭션 타임아웃이란?
        • Statement 타임아웃이란?
      • JDBC 드라이버의 Statement 타임아웃 작동 방식
      • JDBC 드라이버의 소켓 타임아웃이란?
      • 운영체제 수준의 소켓 타임아웃 설정
      • 마치며
      •  
    • ▣ 17장 Commons DBCP 이해하기
      • 버전 선택과 속성 설정 방법
        • JDK 버전과 Commons DBCP 버전
        • Commons DBCP 속성 설정
      • 커넥션의 개수
        • 커넥션 풀의 저장 구조
        • 커넥션 개수 관련 속성
      • 커넥션을 얻기 전 대기 시간
        • TPS(transaction per seconds)
        • TPS와 커넥션 개수와의 관계
        • 적절한 maxWait 값은?
      • 커넥션의 검사와 정리
        • 유효성 검사 쿼리 설정
        • Evictor 스레드와 관련된 속성
      • statement pooling 관련 옵션
      • 기본값을 그대로 쓰기를 권장하는 옵션
        • removeAbandoned 옵션
        • defaultAutoCommit 속성
      • 마치며

 

  • 163쪽, ps 실행 결과 단락

    LWP가 10039인 행의 %CPU를 0.1에서 95.5로 수정, 그 아래의 LWP가 10040인 행의 %CPU를 95.5에서 0.1로 수정

    하단 그림 참고

    163쪽 오류

 

  • 170쪽, 두 번째 단락

    스프링(Spring) AOP(aspect oriented programming) 같은 AOP 프레임워크도 근본적으로는 BCI를 사용한다. ==> AspectJ 같은 AOP(aspect oriented programming) 프레임워크도 BCI를 사용한다.

 

  • 110쪽, 본문 첫 번째 단락

    AOP(aspect oriented progmramming)를 구현하는 ==> AOP (aspect oriented programming)를 구현하는

1부 자바의 API 이해하기

01 자바의 날짜와 시간 API

예제 코드 관련 GitHub 페이지

예제별 GitHub 페이지

03 자바에서 외부 프로세스를 실행할 때

Jetty와 Commons Exec로 만든 전용 데몬

04 람다가 이끌어 갈 모던 자바

예제 코드 관련 GitHub 페이지

예제별 GitHub 페이지

1부 자바의 API 이해하기

01 자바의 날짜와 시간 API

02 자바의 HashMap은 어떻게 작동하는가?

03 자바에서 외부 프로세스를 실행할 때

04 람다가 이끌어 갈 모던 자바

2부 문제 분석과 사례

05 JVM 이해하기

07 자바 애플리케이션 분석을 위한 BTrace

08 하나의 메모리 누수를 잡기까지

09 고맙다 JVM, 사과해라 JVM 크래시

3부 가비지 컬렉션

10 자바 가비지 컬렉션의 작동 과정

11 가비지 컬렉션 모니터링 방법

12 가비지 컬렉션 튜닝

4부 데이터베이스 연결 설정

16 JDBC의 타임아웃 이해하기

17 Commons DBCP 이해하기