메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

자바 코드의 품질을 높이는 100가지 방법

자바 베테랑이 전하는 실전 오류 패턴과 해법

한빛미디어

번역서

판매중

  • 저자 : 타기르 발레예프
  • 번역 : 정병열
  • 출간 : 2025-03-04
  • 페이지 : 424 쪽
  • ISBN : 9791169213486
  • eISBN : 9791169219143
  • 물류코드 :11348
  • 초급 초중급 중급 중고급 고급
4.9점 (11명)
좋아요 : 38

자바 코드 작성의 함정, 정적 분석 도구로 해결하라


이 책은 자바 개발에서 반복적으로 발생하는 100가지 실수를 모아 더 나은 코드를 작성할 수 있도록 돕는 실전 가이드다. 단순한 코드 리뷰를 넘어, 실제 사례와 코드 예제를 통해 표현식, 프로그램 구조, 숫자 처리, 예외 처리, 유닛 테스트 등에서 발생할 수 있는 다양한 문제의 원인과 해결책을 깊이 있게 탐구한다. 각 장은 독립적으로 구성되어 있어 관심 있는 주제별로 자유롭게 학습할 수 있으며, 초보자부터 숙련자까지 모든 수준의 자바 개발자에게 유용하다.


이 책을 통해 자주 발생하는 오류를 피하고 더 견고하고 높은 품질의 코드를 작성하며 성장할 수 있을 것이다. 이 책이 여러분의 개발 여정에 든든한 길잡이가 되길 바란다.

 

타기르 발레예프 저자

타기르 발레예프

뮌헨 지사에 있는 젯브레인의 테크니컬 리더이며 IntelliJ IDEA의 자바 언어 지원 팀에 소속되어 있다. 그의 주요 관심사는 정적 분석과 코드 리팩터링이다. IntelliJ IDEA에 내장된 정적 코드 분석기를 설계하고 개발했으며 자바 바이트코드 정적 분석 도구인 FindBugs에도 기여한 바 있다. 15년간 자바로 상업용 소프트웨어를 개발해왔고 정적 분석 분야에서만 10년 이상의 경험을 보유하고 있다. 또한 2006년에 컴퓨터 과학 박사 학위를 취득했으며, 2020년에 자바 챔피언 칭호를 획득했다.

정병열 역자

정병열

어린 시절 BASIC 언어를 계기로 프로그래밍을 접했다. 연세대학교 공과대학을 졸업한 이후 서버 엔지니어와 개발자로 일하며 다양한 업무를 담당했다. 현재는 시니어 개발자로 경력을 이어가는 한편 양질의 개발 서적 출간에 일조하고자 노력하는 중이다. 옮긴 책으로는 『자바 개발자를 위한 데브옵스 툴』, 『자바 마이크로서비스를 활용한 SRE』,『진화적 아키텍처』 (이상 한빛미디어) 등이 있다.

CHAPTER 1 코드 품질 관리
코드 리뷰와 페어 프로그래밍
코드 스타일
정적 분석
자동화된 테스트
뮤테이션 커버리지
동적 분석
코드 어설션
정리                                             

                                                                     

CHAPTER 2 표현식
실수 001 숫자 연산자 우선순위 오해
실수 002 조건식의 괄호 누락
실수 003 덧셈이 아닌 결합으로 작동
실수 004 멀티라인 문자열 리터럴
실수 005 단항 덧셈 연산자
실수 006 조건 표현식의 묵시적 타입 변환
실수 007 비단락 논리 연산자 사용
실수 008 &&와 || 혼동
실수 009 잘못된 가변 인수 호출
실수 010 조건 연산자와 가변 인수 호출
실수 011 반환값 무시
실수 012 새롭게 생성된 객체를 사용하지 않음
실수 013 잘못된 메서드를 참조하는 바인딩
실수 014 메서드 참조 시 잘못된 메서드 지정
정리

 

CHAPTER 3 프로그램 구조
실수 015 잘못된 if-else 연쇄
실수 016 이전 조건의 다음 조건 지배
실수 017 switch 문 통과 실수
실수 018 구형 for 루프 오류
실수 019 루프 변수 미사용
실수 020 잘못된 루프 방향
실수 021 루프 오버플로
실수 022 멱등 루프 본문
실수 023 잘못된 초기화 순서
실수 024 누락된 슈퍼클래스 메서드 호출
실수 025 우발적인 정적 필드 선언
정리

 

CHAPTER 4 숫자
실수 026 우발적인 8진수 리터럴 사용
실수 027 수치 오버플로
실수 028 정수 나눗셈 중 반올림
실수 029 Integer.MIN_VALUE의 절댓값
실수 030 홀수 검사와 음수
실수 031 확장으로 인한 정밀도 손실
실수 032 무조건적인 축소 변환
실수 033 16진수 음수
실수 034 복합 할당의 묵시적 타입 변환
실수 035 나눗셈과 복합 할당
실수 036 short 타입
실수 037 비트 조작 알고리즘
실수 038 음수 바이트
실수 039 잘못된 클램핑 순서
실수 040 특수한 부동소수점 수
정리

 

CHAPTER 5 일반적인 예외
실수 041 NullPointerException
실수 042 IndexOutOfBoundsException
실수 043 ClassCastException
실수 044 StackOverflowError
정리

 

CHAPTER 6 문자열
실수 045 char 값을 문자로 간주
실수 046 대소문자 변환
실수 047 기본 로케일에서 String.format 사용
실수 048 포맷 인수 불일치
실수 049 정규 표현식 대신 일반 문자열 사용
실수 050 replaceAll 오용
실수 051 이스케이프 시퀀스 오용
실수 052 문자열의 대소문자 비교
실수 053 indexOf 메서드 결과 미확인
실수 054 indexOf 인수 오용
정리

 

CHAPTER 7 객체 비교
실수 055 equals 메서드 대신 참조 동등성 비교
실수 056 equals()가 내용을 비교한다고 간주함
실수 057 URL.equals() 사용 
실수 058 스케일이 다른 BigDecimal 비교
실수 059 관련 없는 타입에 equals() 사용
실수 060 잘못된 equals() 구현
실수 061 배열 필드 hashCode()
실수 062 equals()와 hashCode() 불일치
실수 063 특정 반환값에 의존하는 compare()
실수 064 동일한 객체를 비교할 때 0을 반환하지 않음
실수 065 뺄셈을 이용한 숫자 비교
실수 066 비교 메서드가 반환하는 NaN 값 무시
실수 067 비교 메서드에서 객체를 키 시퀀스로 표현하지 못함
실수 068 비교자의 난수 반환
정리

 

CHAPTER 8 컬렉션과 맵
실수 069 관련 없는 객체 타입 검색
실수 070 단일 객체와 컬렉션 혼합
실수 071 null을 허용하지 않는 컬렉션에서 null을 검색함
실수 072 맵에서 null 값 사용
실수 073 수정 불가 컬렉션의 수정 시도
실수 074 가변 객체를 키로 사용
실수 075 HashMap 및 HashSet의 등장 순서 의존
실수 076 순회 도중 수정하기
실수 077 List.remove() 오버로드 오용
실수 078 List.remove() 직후 원소 생략
실수 079 Collection.removeIf() 내부의 컬렉션 조회
실수 080 Map.computeIfAbsent()의 동시 수정
실수 081 이터레이터 계약 위반
정리                                                                                                                                                                                                                                                                                                                                                

 

CHAPTER 9 라이브러리 메서드
실수 082 StringBuilder 생성자에 char 전달
실수 083 스트림 API 체인에서 부수 효과를 일으킴
실수 084 스트림을 두 번 소비
실수 085 null 사용 불가 스트림에서 null 값 사용
실수 086 스트림 API 연산 계약 위반
실수 087 instanceof 대신 getClass()를 사용
실수 088 열거형, 어노테이션, 클래스에서 getClass()를 사용
실수 089 문자열을 불리언으로 잘못 변환
실수 090 잘못된 날짜 포맷
실수 091 약한 참조, 부드러운 참조의 우발적 무효화
실수 092 세상이 안정적이라는 가정
실수 093 동시 업데이트 데이터 구조에 대한 비원자적 접근
정리

 

CHAPTER 10 유닛 테스트
실수 094 assert 문의 부수 효과
실수 095 잘못된 assertion 메서드 호출
실수 096 잘못된 예외 테스트
실수 097 테스트 메서드 조기 종료
실수 098 유닛 테스트에서 AssertionError 무시하기
실수 099 assertNotEquals()로 동등성 비교하기
실수 100 양식이 잘못된 테스트 메서드
정리

 

APPENDIX A 정적 분석 어노테이션
어노테이션 패키지
어노테이션 종류

 

APPENDIX B 정적 분석 툴 확장
Error Prone 플러그인
SpotBugs 플러그인
IntelliJ IDEA 플러그인 
IntelliJ IDEA의 구조적 검색 및 교체 기능

단순한 실수가 큰 버그로 이어진다!
실무에서 바로 적용하는 100가지 자바 기술


대부분의 개발자는 작은 실수 하나가 예상치 못한 버그로 이어지는 경험을 종종 한다. 특히 객체를 비교할 때 equals()와 hashCode()를 올바르게 구현하지 않아 발생하는 문제는 흔히 간과되지만, 실제로는 심각한 오류를 초래한다. 또한 Stream API를 활용한 코드가 우아해 보이지만, 내부 동작을 깊이 이해하지 않으면 성능 저하나 유지보수의 어려움을 겪게 된다.
 

이 책은 실무에서 마주할 수 있는 다양한 문제를 깊이 있게 탐구하며, 단순한 개념 설명이 아니라 실전에서 발생하는 버그와 그 해결 방법을 중심으로 구성되었다. 예를 들어, 많은 개발자가 NullPointerException을 피하기 위해 습관적으로 null 체크를 하지만, 보다 안전하고 효과적인 방법이 존재한다. 또한 멀티스레드 환경에서 동시성 문제를 간과하면 의도하지 않은 동작이 발생할 수 있으며, 이러한 문제를 방지하기 위한 실질적인 패턴과 기법도 함께 다룬다. 이 책을 통해 단순히 실수를 줄이는 것을 넘어, 보다 안전하고 견고한 코드를 작성하는 법을 배울 수 있다. 실무에서 발생할 수 있는 문제를 미리 예측하고 대응하는 능력을 키워 자바 개발자로서 한 단계 더 나아가길 바란다.

 

누구를 위한 책인가요? 
-    초급부터 고급까지 자바 개발 경험이 있는 모든 프로그래머

 

이 책에서 다루는 주요 내용은 무엇인가요? 
-    견고하고 안전한 자바 코드 작성법 
-    실무에서 흔히 발생하는 실수를 예측하고 줄이는 법
-    디버깅과 테스트 시간을 절약하는 방법
-    정적 분석 도구 활용과 오탐(false reports) 수 줄이기
-    사용자 정의 플러그인으로 정적 분석 도구 확장하기

※ 한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬 받아 작성된 서평입니다.


이번 도서 후기는 책의 제목과 같이 자바 코드의 품질을 높이는 100가지 방법에 관한 이야기로,
대다수의 개발자들이 자주 일으킬 수 있는 100가지 실수들에 대한 내용을 담았다.

이 책의 출간 정보를 알고 부터 꼭 한번 읽어보려 했던 책이다.
늘 개발을 하면서 어떻게 하면 더 나은 코드를 작성할 수 있는지 고민한다.
현재는 로직 상에 문제가 없지만 시간이 점차 흐르면서 발생할 수 있는 실수들도 있다.
이런 내용들에 대해서도 이 책에서 다룬다.

자바 코드를 작성할 때마다 발생할 수 있는 실수의 범주를 총 10가지로 나누어 다루는데, 각 실수에 대한 예시 코드와 설명 그리고 이로 인해 예상되는 파급 효과들도 다루며 정적 분석 도구를 통해서 이러한 실수를 감지하는 방법도 배울 수 있다.

1장에서는 코드 품질에 대한 관리 방법에 대한 개요를 다룬다.
코드 스타일과 정적 분석, 그리고 자동화된 테스트와 코드 어설션 등을 다루는 방법을 다루며 이로 인해 코드의 품질을 관리하는 방법을 익힐 수 있다.
2장에서는 표현식에서 발생할 수 있는 실수를 다루는데 숫자의 연산 순위에 대한 잘못된 이해로 발생할 수 있는 오류 사항들과 연산자들을 혼용하고 잘못된 가변 인수를 호출하는 방법과 잘못된 메소들르 참조하는 바인딩 등의 대한 잘못된 사용법으로 인한 여러 문제점을 다루며 이를 정확히 알도록 설명한다.
3장에서는 자바의 프로그램 구조에서 조건문과 반복문, 그리고 잘못된 초기화 순서와 정적 필드의 잘못된 선언들을 통해 프로그램 구조에서 잘못된 코드 사용법으로 인한 발생할 수 있는 문제점들을 다룬다.
4장에서는 숫자를 잘못 사용하는 방식을 다루는데, 개발자라면 한번쯤 접해보았을 수치에 대한 오버플로우와 타입변환과 확장으로 인한 정밀도 손실의 예를 통해서 숫자와 관련한 올바른 코드 작성법과 함께 정확한 이해를 돕고자 개념을 다룬다.
5장에서는 자바에서 흔히 일어날 수 있는 예외에 대한 내용을 다루고, 6장에서는 문자열 처리 과정에서 발생할 수 있는 문제를 다룬다.
char 값을 문자로 간주하거나 대소문자로 변환하고 로케일을 설정한 것과 아닌 것에 대한 차이 및 replaceAll와 indexOf() 메소드의 잘못 사용하는 여러 실수들로 인해 예상과 다른 결과를 얻을 수 있다는 점을 예시 코드를 통해서 알 수 있었다.
7장은 객체를 비교하는 방법을 다룬다. equals()와 hashCode(), 그리고 스케일이 다른 BigDecimal 간의 비교 방법과 동일한 객체를 비교할 때와 비교 메소드가 반환하는 NaN값에 대한 설명, compareTo() 메소드 사용 방식과 구현된 문제를 통해 올바른 객체 비교에 대한 코드 작성법을 익힐 수 있다.
8장은 컬렉션과 맵을 사용하면서 발생하는 13가지의 실수들을 다루는데 특히 8장은 자주 발생하는 실수들이라고 생각한다. 따라서 8장은 컬렉션과 맵에 대한 정확한 이해를 토대로 올바른 코드를 작성할 수 있도록 해야 함을 다시한번 생각했다.
9장은 일부 라이브러리의 메소드를 잘못 이해하고 사용하는 예와 10장은 유닛 테스트 코드를 작성할 때 발생하는 여러 실수들에 대해서 설명한다.

1장부터 10장의 총 100가지의 실수 사례에서 나도 잘못된 코드를 사용하고 있었던 점들을 발견하게 되었고, 이를 주의해서 작성해야 함을 생각해보았다.
이러한 여러 실수에 대한 사례를 통해서 발생할 수 있는 결과 뿐만 아니라 이러한 실수를 경험하고 해결하는 과정들이 얼마나 중요한지 다시한번 느꼈다.
특히 작성한 코드에 대해 정적 분석 도구를 통해 잘못된 코드들을 사전에 찾아서 개선하여 정확한 결과 뿐만 아니라 가독성과 유지보수가 좋은 코드를 작성할 수 있도록 해야 함을 느꼈다.

이 책은 특히 내용을 정리하면서 읽었는데, 특히나 더 머릿 속에 남았고 여러번 리마인드해볼 수 있었던 점이 좋았다.
개발자라면 자신이 작성한 코드가 올바른 결과를 도출하고 또한 내 코드를 보는 다른 개발자들이 코드를 읽기에 가독성이 좋고 코드의 의도를 이해하고 유지보수가 좋은 코드를 작성하고자 노력할 것이다.
이러한 개발자분들에게 특히나 이 책을 추천한다.
어려울 수 있는 내용들도 있겠지만 이해하기에 쉽게 설명해주고 예시 코드도 포함되어 있기 때문에 자바 개발자 모든 분들에게 도움이 될 것이라고 생각한다.

이번에 읽은 책은 《자바 코드의 품질을 높이는 100가지 방법》입니다. 
(타기르 발라예프 지음, 정병열 옮김, 한빛미디어, 2025)

 

"한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬받아 작성된 서평입니다."

 

 

살다 보면 실수를 피할 수 없습니다. 어쩔 때에는 하루에 여러 번 할 때도 있고, 본의 아니게 남에게 피해를 주는 일도 발생합니다. 개발도 마찬가지라고 생각합니다. 사소한 실수부터 치명적인 실수까지 다양한 실수를 경험하게 됩니다.

《자바 코드의 품질을 높이는 100가지 방법》은 자바 개발자라면 한 번쯤 경험했을 실수와 그 해결책을 총망라한 책입니다. 저자인 타기르 발레예프는 젯브레인(JetBrains)의 기술 리더이자 자바 챔피언으로, IDE로 많이 사용하는 IntelliJ IDEA의 정적 분석 도구에 많은 코드 검사 기능을 설계하고 개발했습니다.

 

소개
이 책은 10개의 장과 2개의 부록으로 구성되어 있습니다. 
1장에서는 코드 품질 관리와 버그 예방 기법을 다루고, 이후 각 장에서는 특정 카테고리별로 실수를 분류해 설명합니다. 2장에서는 연산자 우선순위나 가변 인자 메서드 호출과 같은 표현식 관련 실수를, 3장에서는 for 루프나 클래스 구조에 관련된 프로그램 구조 문제를 다룹니다. 4장은 숫자 처리 시 발생하는 오버플로 같은 문제를, 5장은 NullPointerException이나 ClassCastException과 같은 흔한 예외 상황을 다룹니다. 6장부터는 문자열 처리, 객체 비교, 컬렉션과 맵, 라이브러리 메서드 사용, 단위 테스트까지 폭넓게 자바를 코딩하면서 생길 수 있는 실수를 소개합니다.

 

 

장점
✅ 코드로 실수를 알아보고 발생 원인과 해결 방법을 명확하게 제시합니다.
✅ 짜임새 있고 이해하기 쉬운 구성입니다.
✅ 정적 분석 도구 활용으로 코드 품질을 체계적으로 개선할 수 있습니다.
✅ 다양한 환경과 경로에서 발생할 수 있는 문제를 미리 대비할 수 있습니다.

 

 

 

대상 독자
책은 난이도가 다소 높으며, 자바를 기초 문법과 활용에 대해 중급 개발자에게 유용해 보입니다. 자바 언어 기초를 안다는 전제하에는 학생이나 초급 개발자도 미리 실수를 예방하는 방법을 배울 수 있어 도움이 될 것 같습니다.

✔️ 실무에서 자주 마주치는 문제들의 해결책을 찾고자 개발자
✔️ 미리 실수를 예방하는 방법을 배우고자 하는 학생이나 개발자
✔️ 코드 품질과 버그 없는 프로그램 작성에 관심 있는 모든 자바 개발자

 

모든 소프트웨어 개발자는 코드에 버그를 남긴다.
버그로부터 완전히 벗어나는 방법은 없다.
《자바 코드의 품질을 높이는 100가지 방법》, p.30

 

개발하다 보면 사소한 오타부터 시작하여 괄호를 빼먹거나, 잘못된 변수 사용, 널 참조 오류(Null Pointer Exception)와 같은 다양한 실수를 만나게 됩니다. 자바는 최근의 24 버전까지 지속적인 개선으로 편하게 많은 기능을 포용할 수 있게 되었지만, 덕분에 많은 함정이 개발자들을 기다리고 있습니다. 책을 통해 IDE에서 지원하는 정적 분석 도구를 적극 활용하는 방법을 배움으로써, 버그를 예방하는 습관을 들이는 데 유용할 것이라 생각합니다.

 

책에서 좋았던 점을 뽑는다면, 실수를 방지할 수 있는 가이드를 알려준 부분입니다. 그 밖에도 책의 내용을 다양하게 실무에 적용할 수 있는 부분이었습니다. 정적 분석 도구 설정 방법, 원치 않는 경고를 줄이는 방법, 코드를 분석기가 재구성하는 방법 등은 당장 프로젝트에 적용할 수 있는 팁들로 가득했습니다.

 

책은 순서대로 한 번에 읽어도 좋고, 필요한 부분만 발췌해서 읽을 수 있도록 구성되어 있습니다. 아쉬웠던 점은 100가지 실수를 400페이지 내외의 분량으로 다루기 때문에 어떤 실수에 대해서는 나열하는 듯한 느낌이 들었습니다. 50가지 정도로 실수를 줄여 좀 더 밀도 있게 다뤘으면 좋겠다는 생각이 들었습니다.

 

이 책과 함께라면 저자의 말대로 '앞길에 존재하는 함정을 미리 아는 것만으로도 함정을 피할 준비가 되었다'라고 생각합니다. 자바를 사용하는 모든 개발자, 특히 코드 품질과 버그 없는 프로그램 작성에 관심 있는 분들에게 추천하고 싶습니다.
 

? “왜 또 이런 버그가?”

코드를 수십 번 리뷰하고 테스트도 통과했는데, 운영에선 또다시 문제가 발생한다.

이유를 찾아보면 대부분 사소한 실수가 원인이다. 연산자 우선순위를 잘못 이해했거나, equals()를 오용했거나, 스트림을 중복 소비했거나… 경험이 쌓일수록 내가 했던 실수가 남의 코드에서도 반복된다는 걸 느낀다.

자바 코드 작성의 함정, 정적 분석 도구로 해결하라』는 이런 실수들을 정면으로 다룬다. 이 책은 단순한 자바 문법 설명서가 아니라, 실무에서 반복되는 100가지 실수를 모아, 그 배경과 해결책을 정리한 실전 매뉴얼이다. 특히 정적 분석 도구를 활용해 실수를 줄이는 방법까지 제시해, 단순한 코드 개선을 넘어 시스템 안정성과 품질을 끌어올리는 방향까지 안내한다.


자바 실수 100가지, 어떻게 정리되어 있나?

책은 총 10장과 2개의 부록으로 구성되어 있으며, 각 장은 자바에서 흔히 발생하는 문제를 주제별로 분류해 다룬다.

예를 들면 이런 실수들이다:

표현식: 조건식에서 괄호 누락, 연산자 우선순위 착각, 덧셈과 문자열 결합 혼동

숫자: 정수 나눗셈 중 반올림, Integer.MIN_VALUE의 절댓값, 8진수 리터럴 오용

예외 처리: NullPointerException, IndexOutOfBoundsException, ClassCastException

객체 비교: equals()와 hashCode() 불일치, BigDecimal 비교 오류, == 오용

컬렉션: HashMap에서 가변 객체 키 사용, remove() 호출 시 인덱스 누락, 이터레이터 계약 위반

테스트: assert의 부수효과, 예외 테스트 누락, 잘못된 assertion 메서드 사용

각 항목은 실제 코드 예시와 함께 설명되며, 단순한 증상이 아니라 왜 이런 문제가 발생하는지, 정적 분석 도구가 어떻게 포착하는지, 더 나은 해결책은 무엇인지까지 구체적으로 다룬다.

핵심은 ‘정적 분석’의 올바른 활용

이 책이 단순한 실수 모음과 차별화되는 지점은 바로 정적 분석 도구의 활용을 중심에 두고 있다는 점이다. 저자인 타기르 발레예프는 IntelliJ IDEA의 자바 언어 지원팀 리더로, 정적 분석기 설계와 리팩터링 도구 개발에 깊이 관여해온 인물이다.

그는 단순히 “이런 도구를 쓰세요”라고 권장하지 않는다.

정적 분석 도구의 동작 원리, 오탐(false positive)을 줄이기 위한 설정, 사용자 정의 규칙 추가 방법, IDE 내 구조적 검색/치환 활용법까지 다룬다.

예를 들어, equals() 메서드 구현 시 흔히 빠지는 패턴을 탐지하거나, Stream API 사용 시 잘못된 체이닝을 감지하는 등 현대 자바 개발의 특성과 흐름에 맞춘 분석 관점을 제공한다.

이 책이 특히 유용한 사람들

다음과 같은 개발자라면 이 책이 단순한 참고서를 넘어 개발의 기준점이 되어줄 것이다:

1. 실무에서 자바를 쓰는 모든 개발자

특히 자바 8 이상을 사용하며 스트림, 람다, Optional 등을 사용하는 프로젝트에 있다면, 이 책은 "코드 리뷰 체크리스트"처럼 사용할 수 있다.

2. 정적 분석 도구를 도입했지만 잘 활용하지 못한 팀

도구만 설치해놓고 쓰지 않거나, 오탐 문제 때문에 무력화된 경험이 있다면 반드시 읽어볼 것. 실전에서 정적 분석을 실용적으로 도입하고 유지하는 팁이 상세히 소개되어 있다.

3. 주니어를 가르치는 시니어 개발자

동료 개발자에게 반복해서 설명하게 되는 실수들이 있다면, 이 책을 팀 내 개발 가이드로 삼아도 좋다. 교육, 코드 리뷰, 문서화 등에 바로 활용할 수 있다.


이 책의 가장 좋은 점

✅ 실수 중심의 구성으로 바로바로 찾아보며 문제 해결 가능

✅ 코드 예제와 함께 구체적인 설명이 있어 이해가 빠름

✅ 정적 분석 도구 활용법이 실전 수준으로 정리되어 있음

✅ 초급~고급 개발자 모두에게 필요한 코드 퀄리티의 감각을 익힐 수 있음


결론: 실수를 줄이는 게 아니라, 실수를 설계단계에서 없애는 법

자바 개발에서 반복되는 문제는 대부분 새롭지 않다.

이미 수없이 겪어본 문제들이며, 이미 많은 이들이 실수해본 길이다. 이 책은 그런 반복되는 실수를 체계적으로 정리하고, 정적 분석 도구라는 무기로 사전에 방지할 수 있도록 돕는다.

단순히 코드 한 줄을 고치는 법이 아니라, 어떻게 하면 코드가 처음부터 안전하게 작성될 수 있는지를 알려주는 책.

개발 경력이 쌓일수록, 이런 책이 오히려 더 절실해진다.

한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬 받아 작성된 서평입니다.

단순 이론서가 아닌, 실제 개발 현장에서 겪을 수 있는 문제점을 지적하고, 해결책을 가이드하는 책입니다.

오랜 경럼을 가진 선배가 옆에서 조언해주는 듯한 깊은 통찰이 책에 담겨져 있습니다.

간단하게는 연산자 우선순위에서 오는 오류부터 개발자가 불변 객체로 오해하거나, 자바 API의 실수에 가까운 점들까지 폭 넓게 다루고 있습니다.

SimpleDateFormat을 정적변수로 설정했다가 오류를 발생시켰는데, 이게 저만 했던 실수가 아닌 것도 이 책을 통해서 알 수 있었고,

상식적으로 절대값은 절대 음수가 나올 수 없다고 생각했지만, 이 책을 통해서 자바에서는 발생할 수 있다는 점도 알계 되었습니다.

실수 하나 하나를 읽으면서, 내가 짠 코드에 얼마나 많은 오류가 있을지 걱정만 늘었습니다.

지금까지 얼마나 알지도 못하면서 우연에 맞긴 프로그래민을 했는지 반성하게 되었습니다.

자신의 소스에 자신을 갖기 위해, 또는 알 수 없는 버그에 두통에 시달리고 있다면,

이 책의 실수 목록을 한 번 보고 자신의 코드를 다시 한번 돌아보는 시간을 가졌으면 좋겠습니다.

왜 이런 일이 발생했는가? 처음부터 실수를 예방할 수는 없는가? 앞으로도 비슷한 문제가 발생할 수 있는가? 팀원들이 똑같은 실수를 반복하지 않게 하려면 무엇을 해야 하는가? 결국 필자는 모든 실수에 통용되는 만병통치약은 없다는 것을 깨달았다. ⋯ 그럼에도 실수란 모름지기 반복되는 법이다. 따라서 실수는 분류할 수 있으며 각각의 유형마다 일반화된 대응책도 있다. 앞길에 존재하는 함정을 미리 아는 것만으로도 함정을 피할 준비는 이미 갖춰진 셈이다.

 

10년 정수가 담긴 자바 챔피언의 오류 해결 특강 

세상 그 어떤 유능한 개발자도 실수할 수 있다. 그리고 그로 인해 발생한 서비스 오류는 엄청난 손실을 야기한다. 저자 타기르 발레예프는 약 15 여년간 상업용 소프트웨어 개발자로서 근무하며, 여느 때처럼 오작동을 바로잡기 위해 일하고 있었다. 그러다 FindBugs(현 SpotBugs)라는 자바 정적 분석 도구를 접하게 되었고, 몇 분만에 수십 개의 실수를 지적해주는 정적 분석의 열렬한 팬이 되어버렸다. 그러나 이 도구를 적극적으로 활용하려 할 수록, 오탐지와 심각하지 않은 문제를 마주하게 되었고, 결국 은탄환은 없음을 깨닫게 되었다. (No Silver Bullet)

 

IntelliJ IDEA의 정적 분석팀으로 10년 동안 근무하며, 그는 한계가 있음을 깨닫는 데 그치지 않았고, 그럼에도 문제를 줄이기 위한 방법을 고민했다. 이 책은 그의 고민이 오롯이 담긴, 살아 숨 쉬는 100종의 정수(精髓; essence)이다. 책에서는 컴파일 시점에는 알 수 없었던 '진짜' 문제만을 대상으로 이를 유형화하고, 떄로는 실제 프로덕션 코드로 이를 설명한다. 개발자의 의도는 무엇이었고, 문제의 원인은 무엇이고, 어떻게 문제를 해결하는지 또 실수를 예방할 수 있는지, 각 문제의 유형에 최적화된 해결책을 제시한다.

개발자의 의도와 달리, 컴파일러가 실제로 어떻게 동작하는지 설명한다.

O 런타임 오류 패턴: 기본부터 심화까지

Java 프로그램을 작성할 때, 컴파일 오류를 해결하기 위해 그렇게 많은 시간을 쏟는 개발자는 없을 것이다. Java 컴파일러는 꽤나 엄격한 편이고, 빌드 시 발생한 예외와 그 위치, 심지어는 코드 작성 시점에 IDE에 그어진 빨간 줄만 보더라도 '아차, 이걸 놓쳤었네' 하고 뚝딱 해결할 것이다. 그러니 실질적으로 개발자들을 열받게 만드는 것은 런타임 오류라는 데에는 모두 이견이 없으리라 생각한다. 

기본은 자세히

비교적 우리가 익숙하게 인지하고 있는 기본적인 유형은 좀 더 자세히 다루고 있다는 느낌을 받았다, 예를 들어, 표현식을 다루는 2장에서는 연산자에 대한 내용이 많다. 우선순위의 경우, 1 + 1 * 4 != 8 라는 자명한 사례 대신,  1 + 1 << 2 == 8 처럼 비트 시프트 등의 다소 이색적인 사례를 소개한다. 논리 연산의 경우라면? 논리 합 또는 곱에 &&, || 연산자를 사용하는 것은 자명한데, 이러한 단락 연산자(short-circuit operator)는 비단락 연산자 &, |와 어떻게 다른고, 어떻게 문제가 생길 수 있는지, 또 복합 할당 연산으로 활용될 때는 어떤 점을 조심해야 하는지 보다 심도있는 내용을 다룬다. 이 책에서 기본이란 이런 느낌이다. 

실수 2-7 비단락 논리 연산자 사용 

한 가지 예시를 살펴보자. 나는 다음 코드를 보며 고개를 갸우뚱했다.
"음.. 여기에 문제가 있다고?"

2.7.2 - using non-short-circuit operator / before, after

 

일단 개발자의 의도는 세 종류의 검사 모두 통과하는 경우에만 true를 반환하는 것이다. 그리고 이 과정을 복합 할당 연산자로서의 비단락 연산 &=으로 구현했다. 비단락 연산은 논리곱 &&과는 달리, 피연산자(operand) 내 false가 있더라도 연산을 수행한다. 따라서, 검사 로직이 복잡하다면 불필요하게 프로그램의 복잡도를 높이는 안티 패턴이기에 저자는 이를 지적한 것이다. 다음 두 코드를 통해 실행되는 횟수에 차이가 있음을 확인할 수 있다.

2.7.2 - using non-short-circuit operator / class impl, test count

심화: 이걸 문제로 보는 게 맞을까?

물론 복잡하게 중첩되어 로직에 오류를 만드는 사례도 소개한다. 해당 사례에서는 정적 분석기에서 이를 어떻게 탐지하는지 소개하고, 실수 방지 가이드에 비단락 논리 연산자를 사용하지 않도록 권고한다. 위 코드는 분명 성능 최적화의 관점에서 잘못되었고, 단락 논리 연산자를 사용해서 해결하는 것이 합리적으로 보인다. 그러나 내가 처음 가졌던 의문은 '오류(error)를 만드는 것이 아니라면, && 대신 &를 사용했다고 이를 잘못되었다 판단하는 것이 과연 적절한가?' 그러니까 '&를 의도적으로 사용한 로직에 대해서는 false positive 아닌가?' 이었다.

 

저자는 '양쪽 피연산자 평가'라는 제목으로 절의 마지막에서 이러한 내용을 다루고 있다. check라는 피연산자가 모두 의도적으로 부수 효과(side effect)를 가지고 있다면, 단락 논리 연산자 &&를 사용했을 때 첫 번째의 결과에 의해 나머지가 실행되지 않을 수 있다. 이런 경우에는 & 사용이 합당한데, 심지어 이런 경우에도 &&를 사용하도록 리팩터링하거나, 명시적으로 정적 분석 억제 주석을 추가하도록 권고하고 있다. 

 

그러니까 일반화하자면, 이 책에서 나오는 '의도하지 않았던 동작의 원리'는 사실 언제든 '의도적으로' 활용될 수 있다. 그리고 그 때, 비록 결과가 의도한대로 정상적으로 출력되더라도, 동일한 동작을 더 분명하게 표현할 수 있는 방법이 있다면 그렇게 바꾸어 나가야 한다. 그것이 리팩터링이고, 이 책에서 소개하는 자바 코드의 '품질을 높이는' 길이다. 이처럼 2장 7절 비단락 연산자 예제는 이 책에서 저자가 코드로부터 개발자의 의도를 파악하기 위해 노력하고, 깊이 있게 고민했던 것을 느낄 수 있는 대목 중 하나였다.

다양한 요약 및 정리

책을 읽다보면 군더더기 없이 깔끔하게 잘 정돈되어 있다는 느낌이 든다. 각 절마다 다양한 하위 주제로 유형을 상세히 구분하고, 문제 및 대응 방안을 요약 정리한다. 가령, 2장 표현식 마지막에서는 내용을 총 정리한다. 내용은 다음과 같다. 

  • 수학적 연산자의 우선순위는 마냥 직관적이지 않다. 특히 비트 연산자와 논리 연산자는 더욱 까다롭다. 우선순위가 한 눈에 보이지 않을 때는 항상 괄호를 사용하라.
  • 덧셈 기호는 숫자와 문자열에 적용되는 방식이 다르며, 간혹 두 방식이 한 표현식에서 혼용되기도 한다. 단일 표현식에서는 덧셈과 문자열 연결 기능을 혼합하지 않는 것이 좋다. 단항 덧셈 연산자는 프로젝트 전체적으로 금지하라.
  • 문자열을 연달아 길게 이어 붙일 때, 전체 문자열이 아닌 마지막 조각에 최종 메서드를 호출할 위험이 있다. 긴 문자열을 다룰 때는 최근 자바 버전에 도입된 텍스트 블록 구문을 사용하는 것이 좋다.
  • 조건 표현식에서 각 분기의 표현식 타입이 서로 다를 경우, 복잡하며 비직관적인 규칙에 따라 타입이 변환된다. 결과 타입이 확실치 않을 때는 if 문을 사용하라.
  • Integer, Double, Boolean 등의 박싱된 타입은 가능한 한 지양하라. 묵시적 변환이 발생하며 성능 오버헤드를 일으킬 우려가 있다. 또한 실수로 null을 넣으면 NullPointerException이 발생한다.
  • 가변 인수 메서드는 사용하기 편리하다. 그러나 가변 인수 메서드에 정확히 하나의 인수를 전달하면 모호성이 발생한다. 배열이나 컬렉션을 또 다른 배열로 래핑할 위험이 있다.
  • 자바는 메서드 호출이나 표현식의 결과를 무시할 수 있다. 일부러 그렇게 할 때도 있지만 실수의 원인이 되는 경우도 많다. 불변 클래스는 자신을 고치지 못하므로 새로운 객체를 생성한다는 점을 기억하라. 또한 이들이 만일 예외 클래스라면 객체 생성 시 throw를 추가하라.
  • 메서드 참조 구문을 통해 깔끔하고 간결한 함수 표현식을 만들 수 있다. 그러나 메서드나 생성자 오버로드가 있으면 컴파일러가 바인딩할 메서드를 오해할 수 있으므로 주의하라. 확실치 않을 때는 람다 구문을 사용하라.

X Java 표준에만 집중한다 

[서드 파티는 다루지 않는다] 간혹 어노테이션 패키지, 테스트 프레임워크에 대한 내용이 나오긴 하지만, 그 외 대부분 Java 표준 라이브러리에 대한 내용을 중심으로 다룬다. 따라서, Spring 프레임워크의 활용에 관심이 많다면 이 책은 적절하지 않다. 가령, 3장 프로그램 구조에서의 문제 중 일부는 프레임워크 기능을 활용하여 해결할 수도 있을 것이다.

 

[코드 전문이 제공되지 않는다] 직접 실행해보며 내용을 검증하려는 이들이 있다면 유감이다. 이 책에는 잘못된 코드의 패턴만을 간략히 소개하기 때문에, 실행 가능한 형태의 코드 전문을 항상 제공하지는 않는다. 이러한 이유로 나 또한 새롭게 레포를 생성하여 2장의 14개 절에 대해서는 나름대로 실습을 진행해보았다. 필요하다면 다음 레포와 사이트를 참고하자


마치며

의심할 여지가 없는 수작이다. Java 프로그래밍에 관심 있는 그 누가 보더라도 도움이 될만한 책이라고 감히 단언할 수 있다

...라고 생각하지만, 소수의 의견도 항상 존재하는 법 ? 해외 책 리뷰 사이트에서 4.29/5의 평점이었는데, 그 중 낮은 평점을 제시한 한 의견을 찾아보았고, 이렇게도 생각할 수 있겠구나 흥미로워 가져왔다.

goodreads.com: 그리고 chatGPT 번역

책을 쓰는 것은 대담한 도전이라고 생각한다. 원고를 제출하는 순간, 저자는 낯선 사람들이 몇 시간 동안 읽을 가치가 있는 글을 썼다고 주장하는 셈이니까. 하지만 이 책에서는 내가 기대했던 우아함과 '아하!' 하는 깨달음이 부족하다고 느꼈다. 마치 전형적인 "고전적인 엔지니어링 서적"에서 예상할 수 있는 것처럼, 다소 인공적이고 야심(또는 열정)이 부족한 느낌이었다.

...(중략)

내가 느낀 가장 큰 문제는, 저자가 단순히 소나(Sonar) 이슈 목록을 펼쳐놓고 하나씩 예제를 설명하는 것처럼 보였다는 점이다. 몇 가지 메모를 남기기는 했지만, 350페이지를 읽고 난 후에도 내가 자바나 프로그래밍 기법에 대한 사고가 기대했던 만큼 발전했다고 느끼지는 않았다.

 

아마 이 리뷰어는 로버트 마틴의 [클린 코드], 켄트 벡의 [테스트 주도 개발] 같은 느낌의 책을 기대하지 않았을까 싶다. 내 기억으로는 두 책 모두 일정한 형식을 가지고 잘 정돈된 느낌보다는, 서사에 맞춰 저자가 자연스럽게 자신의 이야기를 하는 느낌이었다. 두 책과 비교하자면, 이 책은 다소 실무 메뉴얼 같은 느낌이다. 나름의 정해진 템플렛이 있고, 주제에 따라 그 내용만 다르다. 개인적으로는 이렇게 잘 정돈된 책이야말로, 나중에 다시 폈을 때도 읽기 쉬워 좋은 책이라 생각하긴 한다. 사고력 증진에 대한 의견은, 아마 리뷰를 작성한 사람이 이 이슈들에 이미 충분히 익숙하기 때문이라 생각한다. 하지만 적어도 저자가 의도했던 이 책의 대상 독자 - 실무 경험이 충분하지 않은 중급 개발자에 해당된다면 큰 도움을 얻을 수 있을 것이라 생각한다.

[링크]
I believe that this book is most useful for middle-level software developers who already know the Java language but may have not enough practical programming experience. It is likely that some bug patterns described in the book may be unknown to senior software developers as well. Less experienced developers or even advanced students might also find this book interesting.

 

"한빛미디어 서평단 <나는 리뷰어다> 활동을 위해 책을 협찬 받아 작성된 서평입니다."

 

한빛미디어의 서평단으로 두 번째 책을 받게 되었습니다. 개인적으로 자바 실무를 하며 코드 품질과 관련된 책을 늘 탐색해왔는데, 이번에 받은 책은 바로 『자바 개발자가 반드시 피해가야 할 100가지 실수』입니다. 두 권 중 랜덤으로 선정된다고 해서 긴장했지만, 기대했던 이 책이 당첨되어 정말 기뻤습니다!

 

이 책은 단순히 자바 문법을 설명하거나 기능을 나열하는 책이 아닙니다. 자바로 개발을 하다 보면, 분명히 컴파일도 잘 되고 테스트도 통과했는데, 시간이 지나면 이상한 버그가 터지는 경우가 많습니다. 동료가 짠 코드를 리뷰하다 보면 "어? 이거 왜 이렇게 짰지?" 싶은 코드가 나오기도 하고, 내 코드도 누군가에게 그런 반응을 불러일으킨 적이 있을지도 모릅니다.

자바는 강력한 언어이지만, 그만큼 방대한 API와 다양한 기능들 속에서 놓치기 쉬운 디테일이 숨어 있습니다. equals(), hashCode() 구현 실수, Stream API 체인 사용 시의 부수 효과, Optional 남용, 멀티스레드 환경에서의 동기화 누락 등은 모두 '지나고 나면 아차 싶은' 실수들입니다. 그리고 그 실수들은 단순한 실수로 끝나지 않고, 종종 심각한 퍼포먼스 저하나 협업의 문제로까지 번지게 됩니다.

 

이 책은 그런 실수를 ‘예방하는 법’뿐만 아니라, ‘실수를 통해 배우는 법’을 알려주는 실전형 책입니다. 단순히 하지 말라는 식이 아니라, 왜 그 실수가 생기는지, 어떤 상황에서 자주 나타나는지, 그리고 어떻게 고쳐야 하는지를 차근차근 설명해줍니다. 그래서 실무에서 ‘어제 나도 했던 실수’와 직결되기 때문에, 읽는 내내 공감하면서 정리해갈 수 있습니다.

 

이 책의 가장 큰 강점 중 하나는 100가지 실수를 주제별로 정리했다는 점입니다. 각 장은 실수를 카테고리별로 묶어 설명하는데, 예를 들어 ‘표현식’, ‘숫자’, ‘예외’, ‘문자열’, ‘컬렉션’, ‘객체 비교’, ‘유닛 테스트’ 등 우리가 실무에서 자주 다루는 주제들로 구성되어 있어요. 단순히 이론적인 설명만 나열하는 것이 아니라, 각 실수마다 코드 예제와 잘못된 예 vs 개선된 예를 비교해주기 때문에 훨씬 이해하기 쉽고 기억에도 잘 남습니다.

각 장에서 특히 인상 깊었던 부분을 몇 가지 소개하자면,

첫째, 코드를 읽는 사람을 배려한 설명 방식이 인상적이었습니다. "맞추어 코드를 수정하라"는 조언이나 "의미 있는 값은 두 번 계산하지 말고 변수로 빼라"는 팁은 단순한 코드 품질의 문제를 넘어, 함께 일하는 동료를 배려하는 마음가짐까지 담겨 있었습니다. 이 책은 '좋은 코드'란 단순히 동작하는 코드가 아니라, '다른 사람이 쉽게 읽고 이해할 수 있는 코드'라고 말합니다.

둘째, 테스트 커버리지, 정적 분석 도구 등 실무에서 꼭 필요한 툴을 함께 소개합니다. 단순히 "null 체크를 하세요" 같은 이야기에 그치지 않고, JaCoCo나 SpotBugs 같은 도구를 통해 어떻게 커버리지를 확인하고, 정적 분석을 통해 어떤 실수를 미리 잡아낼 수 있는지를 알려줍니다. 또한 이러한 도구들이 왜 100% 커버리지를 보장하지 못하는지도 현실적으로 설명해 주며, 도구에 대한 맹신보다 정확한 이해를 중요시합니다.

셋째, 실제 오픈소스에서 발생했던 버그 사례들을 활용해 설명하고 있다는 점도 매우 실용적이었습니다. Apache Avro에서 발생했던 해시 충돌 문제를 예시로 들어, 연산자 우선순위에 대한 오해가 얼마나 심각한 문제를 초래할 수 있는지를 보여줍니다. 컴파일러는 오류를 내지 않지만, 실행 결과는 의도한 바와 전혀 다르게 나올 수 있고, 이런 문제를 방치하면 성능 이슈로 이어질 수 있음을 경고합니다.

 

넷째, **디버깅 팁과 예외 처리, 유닛 테스트에서의 실수까지 꼼꼼하게 다룬다는 점**도 좋았습니다. assert 문이 갖는 부수 효과, 테스트 메서드가 중간에 조기 종료될 수 있는 구조, 예외 테스트에서 자주 발생하는 실수 등은 유닛 테스트 경험이 있는 사람이라면 누구나 고개를 끄덕일 수밖에 없는 내용이었습니다.

 

다섯째, 각 장마다 간단한 정리와 요약이 들어 있어 학습 흐름을 이어가기 좋습니다. 단번에 100가지 실수를 모두 기억하긴 어렵지만, 정리 파트를 통해 핵심 포인트만 체크하면 복습도 수월하고 실전에 바로 응용할 수 있겠다는 생각이 들었습니다.

책을 읽으며 느낀 점을 한 문장으로 요약하자면,

 

“이 책은 실수를 피하는 법을 넘어서, 좋은 코드란 무엇인지에 대한 기준을 심어주는 책이다.”

 

이 책은 특히 팀 프로젝트를 하거나 코드 리뷰를 주고받는 환경에 있는 개발자에게 매우 유익할 것입니다. 단순히 혼자 코드를 짤 때보다, 팀원과 함께 유지보수 가능한 코드를 만들어가는 상황에서 '좋은 코드'에 대한 합의는 굉장히 중요하니까요. 이 책은 그러한 기준점을 함께 세워주는 역할을 할 수 있습니다.

 

총평하자면, 『자바 개발자가 반드시 피해가야 할 100가지 실수』는 자바 개발자라면 꼭 한 번은 정독해봐야 할 필독서라고 생각합니다. 실무 감각을 키우고 싶은 주니어 개발자부터, 후배에게 실수를 줄여주고 싶은 리드 개발자까지 모두에게 도움이 될 책입니다. 

 

처음부터 끝까지 깊은 공감과 배움을 주는 책이었고, 저도 앞으로 계속 책상에 꽂아두고 참고하게 될 것 같습니다.
 

책에서 굉장히 여러 상황에 대해 발생하는 문제점들의 예시를 상세하게 설명하며 풀어나가고 있습니다. 또한 실수 상황과 함께 |실수 방지 가이드|도 상세하게 표시되어 있어 평소에 놓칠만한 부분도 다시 확인하고 넘어갈 수 있는 부분이 많이 존재합니다.

다만, 책에 서술되어 있는 모든 예시들이 일반적으로는 겪기 힘들만한 상황의 실수 예제들도 몇몇 있어서 필요한 부분만 보는 것을 저자분도 추천하고 있습니다.

- 한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬 받아 작성된 서평입니다

 

이 책은 자바 개발자가 흔히 저지르는 실수 100가지를 분석하고, 구체적인 사례와 함께 해결 방법을 제시한다는 점에서 인상깊었습니다. 

 

챕터1에서는 코드 품질을 높이고 실수를 방지하기 위해 개발 문화와 도구를 어떻게 활용해야 하는지 설명합니다. 코드를 작성하는 것은 결국 사람이기 때문에 모든 실수를 사전에 방지하는 것은 현실적으로 불가능합니다. 하지만 코드 리뷰, 페어 프로그래밍, 코드 스타일, 정적 분석 도구, 테스트 자동화 등을 활용하면 실수를 줄이고 코드 품질을 유지하는데 도움이 된다고 설명합니다.

 

개인적으로 책을 읽으며 뮤테이션 커버리지, 동적 분석 등 접해보지 않았던 새로운 도구를 알게 된 점이 유익했습니다. 또한, 도구라는게 모든 문제를 해결해주지 않기 때문에 이를 간과해서는 안된다는 점을 저자는 강조합니다. 이를 통해 기술과 도구는 비즈니스 문제 해결을 위한 수단이어야 하며, 그 자체가 목적이 되어서는 안 된다는 점을 다시 생각해 볼 수 있었습니다.

 

챕터2. 표현식부터 각 주제별로 "실수 설명 → 해결 방법 → 사례 → 정리" 구조로 설명합니다. 이때 연산자 우선순위, 음수, 언더플로, 오버플로, 비트연산, 유니코드 등과 관련된 실수를 다룹니다. 경험이 부족한 개발자라면 이해하기 어려울 수도 있지만, 컴퓨터 공학 지식과 함께 실수를 찾아낼 수 있는 능력을 갖춘다면 개발자로서의 경쟁력을 강화할 수 있을 거라는 배움을 얻을 수 있었습니다. 챕터3. 프로그램 구조는 가벼운 Java 문법적인 내용이 많았는데 코딩 테스트 연습을 할 때 한번씩 했던 실수라서 쉽게 공감할 수 있었습니다.

 

챕터5. 일반적인 예외 ~ 챕터 10. 유닛 테스트에서는 구현 경험이 있다면 한번씩 접해 볼 수 있는 실수라 공감하기 쉬웠고 새로운 내용도 알 수 있어 유익했습니다. 쉽게 접할 수 있는 NullPointException을 줄이기 위한 주요 원칙으로 null 자체를 사용하지 않거나, Optional 사용, 어노테이션 명시, 정적 도구 분석 도구 활용 등 실무에서 적용할 수 있는 유용한 가이드를 제시했습니다. 또한 잠재적으로 ClassCastException 야기할 수 있는 메서드에 대해 리팩터링 하기 위해 자바 9부터 추가된 @Deprecated(forRemoval = true) 활용해 클라이언트 코드가 마이그레이션 할 수 있도록 유도하는 예시가 인상 깊었습니다.

 

“자바 코드의 품질을 높이는 100가지 방법”을 읽으면서 모르는 내용도 많았지만 앞으로 개발자로서 나아가야 할 방향을 또하나 찾을 수 있었던 거 같습니다. OOP, 테스트 자동화, 자료구조와 알고리즘을 모르는 초보자에게 부담되는 내용일지도 모르지만, 자바 언어를 사용하는 이에게 실수 방지 가이드로 충분히 추천할 만한 도서였습니다.

 

 

 

한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬 받아 작성된 서평입니다.

 

Java는 명실상부 OOP를 대표하는 프로그래밍 언어다. 특히 이 언어를 사용하여 만들어진 Spring framework 는 대규모 백엔드 어플리케이션을 이야기 할 때 빠짐없이 등장한다. 타이트한 규칙의 프레임워크의 도움을 받아 프레임워크를 알고있으면 모두가 이해할수있는 아키텍처를 구성한다. 그런데 문제는 구현이다.

비즈니스 로직은 여전히 Java 를 사용하여 구현해야 한다. 문자열, 컬렉션, 숫자, 비트와 같은 자료구조와 더불어 이제는 빼놓을 수 없는 ‘대용량 처리’ 유행에 동시성 프로그래밍까지. Java 를 사용한다면 날이 갈수록 Java 언어에 대해 더 깊은 이해를 요구한다.

21세기 2025년. 이제는 notepad 나 vi 에디터를 열고 프로젝트 단위의 개발을 하지는 않는다. 우리는 IDE 를 사용하여 개발한다. 이에 따라오는 정적 분석기를 통해 컴파일 오류를 컴파일 하지 않고도 알아낸다. 나아가 자동완성, 타입추론, 참조검사 등 더이상 정적 분석기의 도움 없이는 지금과 같은 속도로 개발할 수 없는 시대가 되었다.

책의 저자는 Java IDE로 유명한 JetBrains의 IntelliJ 정적 분석기를 개발했다. 우리는 정적 분석기의 도움을 여전히 받고 있지만, 정적 분석기가 만능은 아니다. 그래서 정적 분석기가 잡아내지 못하지만 발생하면 적지 않은 파급효과를 일으키는 코드 실수에 대해 분석-원리-해결 순으로 상세하게 알려준다.

NPE를 다룰때 조심해야 하는 부분의 실제에 대해 알려준다. Nullable 하다면 가능한 Optional 을 사용하고, 그마저 어렵다면 @Nullable 어노테이션이라도 활용하라고 한다. Java 10부터 제공되는 Collection.copyOf() 을 사용해 immutable 한 복사본을 사용하면 nullable 을 허용하지 않는다는 것도 알려준다. 그래도 Null을 꼭 다뤄야 한다면 차라리 열거형을 사용하라고 한다. 특히 박스타입인 Boolean 의 경우 null 을 허용하기 때문에 차라리 참, 거짓, null 을 표현하는 열거형을 만들어서 사용하라고 한다.

Stream API 는 중간 연산을 가지고 있다. 그러나 Stream 은 최종 연산이 호출되기 전에는 아무일도 일어나지 않는다. 만약 중간 연산이 인자를 동반하는 함수의 입력이 발생한다면 부수효과를 일으키게 된다. 이 상황은 parallelStream() 을 사용할때도 예외가 발생할 수 있기 때문에 부수효과를 발생시켜야 한다면partitioningBy()와 같은 컬렉션 함수로 분리하여 멱등성을 유지할 필요가 있다고 한다.

여러 스레드 사이에서 공유 데이터를 다룰때에 대한 팁도 알려준다. Queue에서 작업을 꺼내 수행하기 위해 isEmpty()로 검사하고 remove()를 호출한다면 두번의 호출이 이뤄지기 때문에 원자적인 상호작용이 아니라고 한다. 이같은 작업에서 원자성을 유지하기 위해서 poll()로 대상을 꺼내오면 된다고 한다. 만약 큐가 비었다면 poll()은 null을 반환 하기 때문에 스레드에서 영향을 받지 않는 로컬 변수로 null 검사가 가능해지는 것이다. 요는 동시성 컬렉션 메서드를 연쇄 호출했을때 원자적 처리에 대해서 보장하지 않기 때문에 고민을 하고 연산 선택을 하라는 것이다. Atomic 레퍼런스 역시 set()같은 메서드는 스레드 세이프 하지 않기 때문에 updateAndGet() 메서드를 사용해 구현하라고 알려준다.

이 외에도 유닛 테스트, 객체간 비교, 문자열, 비트 연산 등에서 실수 할 수 있는 문제들에 대해 앞서 소개한 내용처럼 심도있는 고찰을 밀도있게 전달하고 있다. 아마도 이펙티브 자바와 많이 비교가 될 것 같은데, 그 책은 OOP나 리팩토링에 중점을 둔 내용이라면 이번에 소개한 ‘자바 코드의 품질을 높이는 100가지 방법’은 실무에서 자바를 사용했을때 발생할 수 있는 오류의 파훼와 언어 스팩에 포함되어있는 내부 구현에 대해서 많은 인사이트를 얻을 수 있었다.

 



 

 

어떤 언어로 개발하든 개발자라면 다양한 실수를 하게 된다. 의도하든 의도하지 않든 그 실수를 제때 수정하지 않는다면 나중에 비싼 비용을 치뤄야하는 것은 널리 알려진 사실이다. 그렇다면 반복되는 실수를 어떻게 사전에 알 수 있을까? 경험이 많은 개발자라면 다양한 케이스에 대한 노하우가 있기 때문에 적당한 수준으로 실수를 보완해 가겠지만 경력이 얼마되지 않는 개발자라면 명백한 실수도 잘 알아채지 못하는 경우가 종종 있는 것 같다. 특히 컴파일러나 런타임시에 에러가 나온다면 다행이지만 그렇지 않은 경우도 상당히 많다는 것이 문제이다. 테스트 케이스를 통해 문제가 있는 코드가 커버되지 않는다거나 특정한 경우에만 문제가 발생한다거나 또는 시간이 지나야 문제가 나타나는 등 바로 알아채릴 수 없는 다양한 경우가 존재한다.

 

이 책은 Java 개발에서 반복적으로 발생하는 100가지 실수를 모아 더 나은 코드를 작성할 수 있도록 돕는 실전가이드이다. 다양한 예제를 통해 예외 처리, 변수 처리, 유닛 테스트에서 발생할 수 있는 다양한 문제의 원인과 해결책을 알려준다. 1장에서는 코드 품질 관리를 위한 기본적인 개념에 대한 소개를 통해 기본 개념을 익힐 수 있도록 한다. 이후 표현식에 관련된 부분, 프로그램 구조, 숫자, 예외처리, 문자열, 라이브러리, 유닛테스트 등 Java 개발에 대한 전반적인 영역을 다룬다. 특히 무심코 넘길 수 있는 숫자의 정밀도 손실이나 오버플로우 등 신경써야 할 부분에 대해 잘 설명을 해주며, 문자열에서는 replaceAll 함수의 오용 및 문자열의 대소문자 비교 등 사소한 실수에 대해 점검할 수 있는 요령을 잘 보여준다.

 

이미 알고 있다고 생각하지만 다시 되집어 볼 수 있는 유용한 정보를 제공하고 있다고 생각이 들었다. 특히 Java 개발을 시작한지 얼마되지 않는 개발자라면 옆에 두고 천천히 읽어보면서 자신의 것으로 소화시키면 매우 유용하겠다는 생각이 들었다. 개발을 빨리하는 것도 중요할 수 있지만 그에 못지않게 코드의 품질을 높이는 것은 더 중요하다고 볼 수 있다. 개발을 진행하면서 꼼꼼히 살펴보고 품질을 높이려는 노력을 기울이는 것이 필요하다고 생각된다.

 

"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."

"한빛미디어 서평단 <나는리뷰어다> 활동을 위해서 책을 협찬 받아 작성된 서평입니다."

 

개발을 하다보면 내가 어떤 오류를 맞닥뜨릴지도 모르고 내가 실수를 저지르고 있다 한들 그게 잘못된 것인지 조차 인지하지 못하는 경우가 많다.

이럴 때마다 학창시절처럼 개발에도 오답노트나 족보가 있었으면 좋겠다는 생각을 막연히 하곤 했다.

이 책은 나와 같은 생각을 한번이라도 해본 자바 개발자들에게 추천하고 싶다.

탄탄한 개념서나 바이블처럼 꼭 읽어봐야하는 자바 필수 도서 는 아니더라도 언제나 나도 모르게 저지를 수 있는 실수들에 대해 경각심을 일으켜준다.

또한 나의 실수에 대해 분노를 느끼는게 아닌 프로덕션으로 내보내기 전 빨리 발견하다니, 완전 럭키비키잖아?!

결제하기
• 문화비 소득공제 가능
• 배송료 : 2,000원배송료란?

배송료 안내

  • 20,000원 이상 구매시 도서 배송 무료
  • 브론즈, 실버, 골드회원 무료배송
닫기

리뷰쓰기

닫기
* 상품명 :
자바 코드의 품질을 높이는 100가지 방법
* 제목 :
* 별점평가
* 내용 :

* 리뷰 작성시 유의사항

글이나 이미지/사진 저작권 등 다른 사람의 권리를 침해하거나 명예를 훼손하는 게시물은 이용약관 및 관련법률에 의해 제재를 받을 수 있습니다.

1. 특히 뉴스/언론사 기사를 전문 또는 부분적으로 '허락없이' 갖고 와서는 안됩니다 (출처를 밝히는 경우에도 안됨).
2. 저작권자의 허락을 받지 않은 콘텐츠의 무단 사용은 저작권자의 권리를 침해하는 행위로, 이에 대한 법적 책임을 지게 될 수 있습니다.

오탈자 등록

닫기
* 도서명 :
자바 코드의 품질을 높이는 100가지 방법
* 구분 :
* 상품 버전
종이책 PDF ePub
* 페이지 :
* 위치정보 :
* 내용 :

도서 인증

닫기
도서명*
자바 코드의 품질을 높이는 100가지 방법
구입처*
구입일*
부가기호*
부가기호 안내

* 온라인 또는 오프라인 서점에서 구입한 도서를 인증하면 마일리지 500점을 드립니다.

* 도서인증은 일 3권, 월 10권, 년 50권으로 제한되며 절판도서, eBook 등 일부 도서는 인증이 제한됩니다.

* 구입하지 않고, 허위로 도서 인증을 한 것으로 판단되면 웹사이트 이용이 제한될 수 있습니다.

닫기

해당 상품을 장바구니에 담았습니다.이미 장바구니에 추가된 상품입니다.
장바구니로 이동하시겠습니까?