Go 프로그래밍 개발 환경에서 의존성 주입 실습 [Go 개발 환경에서 읽기 쉽고, 유지 관리와 테스트가 편리한 클린 코드 작성법]
- 원서명Hands-On Dependency Injection in Go: Develop clean Go code that is easier to read, maintain, and test (ISBN 9781789132762)
- 지은이코리 스캇(Corey Scott)
- 옮긴이이준
- ISBN : 9791161754154
- 35,000원
- 2020년 05월 29일 펴냄
- 페이퍼백 | 444쪽 | 188*235mm
- 시리즈 : 프로그래밍 언어
책 소개
소스 파일은 아래 깃허브 페이지에서 내려 받으실 수 있습니다.
(https://github.com/AcornPublishing/dependency-injection-go)
요약
의존성 주입(Dependency Injection)은 객체지향 프로그래밍(Object Oriented Programming) 방법론 중 하나로 객체 간의 결합도를 낮추고 변경사항에 유연하게 대처하도록 구성하는 방법이다. 의존성 주입을 사용하면 코드의 가독성과 재사용성이 높아지고 테스트의 편의성을 제공해 소프트웨어의 유지 관리가 쉬워지기 때문에 실무에서 많이 사용되고 있다. 이 책은 의존성 주입을 구현하는 다양한 방법을 소개하고, 관련 예제를 통해 내용을 쉽게 습득하도록 했다. Go 언어를 사용하는 개발환경에서 의존성 주입을 구현할 수 있는 좋은 지침서가 될 것이다.
이 책에서 다루는 내용
■ DI의 장점
■ SOLID 디자인 원칙과 Go 언어와의 연관성
■ Go 개발 환경에서 사용 가능한 다양한 종류의 의존성 주입 패턴 분석
■ DI 활용으로 느슨하게 결합된 고품질 Go 코드 작성
■ DI 적용으로 기존 코드 리팩터링
■ 코드의 테스트 가능성과 테스트 커버리지 향상을 위한 툴 학습
■ Go 의존성 그래프의 생성 및 해석 방법
이 책의 대상 독자
코드를 쉽게 읽고, 테스트하고, 유지 관리하길 원하는 개발자를 위한 책이다. 코드의 품질이 특정 기능을 제공하는 것 이상이라고 생각하는 개발자뿐만 아니라 Go 언어를 사용해 더 많은 것을 구현하길 원하는 객체지향(object-oriented)에 익숙한 개발자에게 적합하다.
코드를 작성하는 것은 쉽다. 마찬가지로 단일 테스트 케이스를 통과하는 것도 간단하다. 하지만 몇 달 또는 몇 년 후에 부가적인 기능을 추가해도 테스트를 계속 통과할 수 있는 코드를 작성하는 것은 점점 불가능해지고 있다.
동일한 수준에서 일관되게 코드를 전달하려면 몇 가지 멋진 트릭이 필요하다. 이 책을 통해 이러한 트릭을 배울 뿐만 아니라, 트릭을 효과적으로 적용할 수 있는 지혜를 얻길 바란다.
이 책의 구성
1장, ‘개선을 멈추지 말라’에서는 의존성 주입을 정의하고, 의존성 주입이 Go 언어를 활용한 개발에 중요한 이유를 설명하며, 의존성 주입으로 해결할 수 있는 몇 가지 코드 속 나쁜 냄새를 소개한다.
2장, ‘Go 언어를 위한 SOLID 디자인 원칙’에서는 SOLID 소프트웨어 디자인 원칙을 소개하고 Go에서 의존성 주입과 프로그래밍이 어떤 관계인지 살펴본다.
3장, ‘사용자 경험을 위한 코딩’에서는 프로그래밍에서 종종 간과되는 개념인 테스팅과 코드의 사용자 경험을 설명한다. 또한 모의(mock), 스텁(stub), 테스트로 인한 손상, 의존성 그래프 등 이 책에서 전반적으로 사용할 여러 가지 개념을 소개한다.
4장, ‘ACME 등록 서비스 소개’에서는 이후 장들에서 실습하게 될 여러 예제의 기초가 되는 소규모 가상 서비스를 소개한다. 서비스의 현재 구현과 관련된 문제를 강조하고 의존성 주입을 적용해 달성하고자 하는 목표를 간략하게 설명한다.
5장, ‘몽키 패치를 통한 의존성 주입’에서는 테스트 과정에서 의존성을 바꿀 수 있는 방법인 몽키 패치를 살펴본다. 샘플 서비스에 몽키 패치를 적용해 데이터베이스에 대한 의존성으로부터 테스트 코드를 분리하고, 중요한 리팩터링 없이도 서로 다른 계층(layer)을 분리하도록 한다.
6장, ‘생성자 주입을 통한 의존성 주입’에서는 가장 전통적인 방식의 의존성 주입 기법이라 할 수 있는 생성자 주입을 소개한다. 생성자 주입의 여러 가지 장단점을 살펴보고, 생성자 주입을 성공적으로 적용할 수 있는 방법을 보여준다.
7장, ‘메서드 주입을 통한 의존성 주입’에서는 두 번째로 많이 사용되는 의존성 주입 기법인 메서드 주입을 소개한다. 메서드 주입의 여러 가지 장단점을 살펴보고, 요청 범위 의존성에 메서드를 성공적으로 적용할 수 있는 방법을 보여준다.
8장, ‘컨피그에 의한 의존성 주입’에서는 컨피그 주입(config injection)을 소개한다. 컨피그 주입은 생성자 및 메서드 주입의 확장 버전이며, 매개변수의 수를 줄임으로써 코드의 사용성을 향상시키는 것을 목적으로 한다.
9장, ‘JIT 의존성 주입’에서는 특이한 형태의 또 다른 의존성 주입인 JIT(Just-In-Time) 주입을 다룬다. JIT 주입은 생성자 또는 메서드에 매개변수를 추가하지 않고도 디커플링(decoupling)과 테스트 가능성(testability) 같은 의존성 주입의 많은 이점을 제공하는 전략이다.
10장, ‘오프 더 셸프 주입’에서는 마지막 의존성 주입 기법인 프레임워크를 활용한 의존성 주입을 소개한다. 의존성 주입 프레임워크에 관한 몇 가지 장단점을 살펴본 후, 구글 Go 클라우드의 와이어(Wire) 프레임워크를 소개하고 샘플 서비스에 적용해본다.
11장, ‘열정을 억제하라’에서는 의존성 주입이 잘못될 수 있는 몇 가지 방법을 살펴본다. 의존성 주입을 적용하는 것이 불필요하거나 의존성이 코드에 악영향을 미치는 여러 가지 예제를 소개한다.
12장, ‘진행 사항 복습’에서는 의존성 주입을 도입한 후의 샘플 서비스 상태를 최초 상태와 비교해본다. 또한 의존성 주입을 통해 새로운 서비스를 시작하는 경우 취할 수 있는 단계도 설명한다.
목차
목차
- 1장. 개선을 멈추지 말라
- 기술적 요구 사항
- DI는 왜 중요한가?
- 그렇다면 어떻게 DI를 정의하는가?
- DI가 필요한 코드 냄새
- 코드 팽창
- 변경에 대한 저항
- 낭비되는 노력
- 강한 결합
- 합리적 의심
- 관용적인 Go에 관한 간단한 고찰
- 기존의 관점에서 벗어난 새로운 관점에서의 접근
- 요약
- 질문
- 더 읽을 거리
- 2장. Go 언어를 위한 SOLID 디자인 원칙
- 기술적 요구 사항
- 단일 책임 원칙(SRP)
- SRP는 DI와 어떤 관련이 있는가?
- Go 언어에서 SRP는 무엇을 의미하는가?
- 개방/폐쇄 원칙(OCP)
- OCP는 DI와 어떤 관련이 있는가?
- Go 언어에서 OCP는 무엇을 의미하는가?
- 리스코프 치환 원칙(LSP)
- LSP는 DI와 어떤 관련이 있는가?
- Go 언어에서 LSP는 무엇을 의미하는가?
- 인터페이스 분리 원칙(ISP)
- ISP는 DI와 어떤 관련이 있는가?
- Go 언어에서 ISP는 무엇을 의미하는가?
- 의존성 역전 원칙(DIP)
- DIP는 DI와 어떤 관련이 있는가?
- Go 언어에서 DIP는 무엇을 의미하는가?
- 요약
- 질문
- 더 읽을 거리
- 3장. 사용자 경험을 위한 코딩
- 기술적 요구 사항
- 사람을 위한 최적화 작업
- Go 코드에서 사용자 경험은 무엇을 의미하는가?
- 좋은 사용자 경험을 발견하라
- 단위 테스트란 이름의 안심 담요
- 그렇다면 왜 단위 테스트를 작성해야 하는가?
- 무엇을 테스트해야 하는가?
- 테스트로 인한 손상
- 테스트로 인한 손상의 징후
- 고디그래프를 통한 패키지 의존성 시각화
- 시각화 도구 설치 방법
- 의존성 그래프 생성하기
- 의존성 그래프 해석하기
- 요약
- 질문
- 4장. ACME 등록 서비스 소개
- 기술적 요구 사항
- 시스템의 목표
- 높은 가독성
- 높은 테스트 가능성
- 낮은 결합도
- 목표에 대한 최종 결론
- 시스템 소개
- 소프트웨어 아키텍처
- 알려진 이슈
- 테스트 가능성
- 노력의 중복
- 테스트 환경에서 부족한 격리
- data 패키지와 REST 패키지 사이의 강한 결합
- config 패키지와 강한 결합
- 다운스트림의 통화 서비스
- 요약
- 질문
- 5장. 몽키 패치를 통한 의존성 주입
- 기술적 요구 사항
- 몽키 매직!
- 몽키 패치의 장점
- 몽키 패치 적용
- SQLMock 소개
- SQLMock을 활용한 몽키 패치
- 에러 핸들링 테스트
- 테이블 주도 테스트를 통한 테스트 부풀림 방지
- 패키지 사이의 몽키 패치
- 몽키 패치의 단점
- 요약
- 질문
- 더 읽을 거리
- 6장. 생성자 주입을 통한 의존성 주입
- 기술적 요구 사항
- 생성자 주입
- 방 안에 있는 오리 설명하기
- 생성자 주입의 장점
- 생성자 주입 적용하기
- 의존성으로부터 분리
- 생성자 만들기
- 테스트 시나리오 커버리지 개선하기
- 의존성 그래프를 통한 개선 사항 검증하기
- 생성자 주입의 단점
- 요약
- 질문
- 7장. 메서드 주입을 통한 의존성 주입
- 기술적 요구 사항
- 메서드 주입
- 메서드 주입의 장점
- 메서드 주입 적용하기
- 빠르게 요약하기
- 짧은 중단
- 대기 시간 예산
- 메서드 주입의 단점
- 요약
- 질문
- 8장. 컨피그에 의한 의존성 주입
- 기술적 요구 사항
- 컨피그 주입
- 컨피그 주입의 장점
- 컨피그 주입 적용하기
- 모델 계층에 컨피그 주입 적용하기
- data 패키지에 컨피그 주입 적용하기
- exchange 패키지에 컨피그 주입 적용하기
- 경계 테스트
- 컨피그 주입의 단점
- 요약
- 질문
- 9장. JIT 의존성 주입
- 기술적 요구 사항
- JIT 주입
- JIT 주입의 장점
- JIT 주입 적용하기
- 프라이빗 의존성
- 선택적인 퍼블릭 의존성
- JIT 주입의 단점
- 요약
- 질문
- 10장. 오프 더 셸프 주입
- 기술적 요구 사항
- 와이어를 통한 오프 더 셸프 주입
- 프로바이더 소개
- 인젝터에 대한 이해
- 프로바이더 세트 적용
- 오프 더 셸프 주입의 장점
- 오프 더 셸프 의존성 주입 적용하기
- 구글 와이어 도입하기
- API 회귀 테스트
- 오프 더 셸프 주입의 단점
- 요약
- 질문
- 11장. 열정을 억제하라
- 기술적 요구 사항
- DI에 의한 손상
- 긴 생성자 파라미터 리스트
- 컨피그를 수행할 때 객체의 주입
- 불필요한 간접화
- 서비스 로케이터
- 조기 미래 방지
- HTTP 요청에 대한 모의
- 불필요한 주입
- 요약
- 질문
- 12장. 진행 사항 복습
- 기술적 요구 사항
- 개선 사항의 개요
- 글로벌 싱글톤
- config 패키지를 통한 강한 결합
- 업스트림 서비스에 대한 의존성 제거
- 짧은 중단 및 대기 시간 예산
- 의존성 생성의 단순화
- 결합 및 확장성
- 의존성 그래프 복습
- 테스트 커버리지와 테스트 가능성 복습
- 테스트 커버리지
- DI를 통해 새로운 서비스 시작하기
- 사용자 경험
- 코드의 구조
- 교차 관심사
- 아웃사이드-인 전략으로 디자인
- 요약
- 질문