★ 이 책에서 다루는 내용 ★
■ __init__() 메소드의 다양한 디자인 패턴 이해
■ 파이썬3 추상 기반 클래스의 기본 기능과 이를 애플리케이션에서 사용하는 방법
■ with문을 활용해 콜러블 객체와 컨텍스트 매니저 디자인
■ JSON, YAML, Pickle, CSV, XML과 같은 형태로 객체 직렬화 수행
■ 정교한 로컬 데이터베이스로서 셸브 모듈 활용
■ 내장 SQLite 모듈을 사용해 파이썬 객체를 SQL 데이터베이스와 맵핑
■ RESTful 웹 서비스로 파이썬 객체 전송
■ doctest와 unittest.mock 모듈의 사용법을 포함해 자동 단위 테스트 전략을 고안
■ 커맨드 라인 인자를 파싱해 설정 파일과 환경 변수에 통합
★ 이 책의 대상 독자 ★
이 책은 고급 파이썬을 다루기 때문에 파이썬 3에 익숙해야 한다. 상당히 크거나 복잡한 문제를 해결해야 할 때 도움을 받을 수 있다.
다른 언어에 숙련된 프로그래머라면 언어를 파이썬으로 변경할 때 도움을 받을 수 있다. 이 책은 문법이나 기타 기본적인 개념은 소개하지 않는다.
고급 파이썬 2 프로그래머는 파이썬 3로 변경할 때 도움을 받을 수 있다. (버전 2에서 3로 옮기는 등의) 전환 유틸리티나 (six처럼) 병립하는 라이브러리는 다루지 않는다. 이 책은 전적으로 파이썬 3에서만 볼 수 있는 새로운 개발에 집중한다.
★ 이 책의 구성 ★
0장, ‘준비’에서는 단위 테스트와 doctest, docstring, 스페셜 메소드명과 같이 미리 알아야 할 주제를 다룬다.
1부, ‘스페셜 메소드를 통한 파이썬 다운 클래스’에서는 애플리케이션의 클래스 정의를 파이썬의 내장 기능에 맞게 통합하는 방법과 객체지향 프로그래밍 기법을 자세히 살펴본다. 1부는 다음과 같이 총 9개의 장으로 구성된다.
1장, ‘_init_() 메소드’에서는 _init_() 메소드의 상세한 설명과 구현을 제공한다. 단순 객체를 위한 다양한 유형의 초기화를 살펴본다. 이를 기반으로 컬렉션과 컨테이너를 포함하는 좀 더 복잡한 객체도 알아본다.
2장, ‘파이썬과 매끄러운 통합: 기초 스페셜 메소드’에서는 간단한 클래스 정의를 확장해 스페셜 메소드를 추가하는 방법을 상세히 설명한다. 무엇을 오버라이드해야 하고 언제 실제로 필요한지 알려면 객체로부터 상속받은 기본 동작 방식을 알아야 한다.
3장, ‘속성 접근과 프로퍼티, 디스크립터’에서는 기본 처리가 어떻게 동작하는지 자세히 살펴본다. 언제 어디서 기본 동작을 오버라이드할지 정해야 한다. 또한 디스크립터를 분석하고, 파이썬의 내부 동작 방식을 훨씬 더 깊이 이해해야 한다.
4장, ‘일관적인 디자인의 ABC’에서는 collections.abc 모듈에 들어 있는 추상 기반 클래스를 전반적으로 살펴본다. 수정하거나 확장할 다양한 컨테이너와 컬렉션의 일반적인 개념을 알아본다. 이와 비슷하게 구현할 숫자의 개념도 알아본다.
5장, ‘콜러블과 컨텍스트 사용’에서는 contextlib에 있는 도구를 사용해 컨텍스트 매니저를 생성하는 방법을 알아본다. 콜러블 객체의 수많은 변형 디자인을 선보인다. 이를 통해 상태 기반 콜러블 객체가 단순한 함수보다 더 유용한 이유를 알아본다. 바로 뛰어들어 사용자만의 컨텍스트 매니저를 작성하기 전에 먼저 기존 파이썬 컨텍스트 매니저를 사용하는 방법을 알아본다.
6장, ‘컨테이너와 컬렉션 생성’에서는 컨테이너 클래스의 기초를 설명한다. 컨테이너로 만든 후 컨테이너가 제공하는 다양한 기능을 제공할 수 있는 다양한 스페셜 메소드를 복습한다. 내장 컨테이너를 확장해 기능을 추가하는 방법도 알아본다. 또한 내장 컨테이너를 래핑하고 래퍼를 통해 메소드를 하위 컨테이너에 위임하는 방법도 살펴본다.
7장, ‘수 생성’에서는 +, -, *, /, //, %, ** 같은 필수 산술 연산자를 다룬다. 또한 〈, 〉, 〈=, 〉=, ==, != 같은 비교 연산자도 알아본다. 새로운 수를 확장하거나 생성하는 디자인 고려 사항을 요약하며 끝낸다.
8장, ‘장식자와 믹스인: 횡단 관점’에서는 간단한 함수 장식자와 매개변수를 갖는 함수 장식자, 클래스 장식자, 메소드 장식자를 다룬다.
2부, ‘지속성과 직렬화’에서는 영속 객체를 다룬다. 영속 객체는 저장소 매체에 직렬화된다. 주로 JSON으로 변환해 파일 시스템에 사용한다. ORM 계층은 객체를 데이터베이스에 저장할 수 있다. 2부에서는 지속성을 다루는 여러 대안을 살펴보며, 다음과 같은 5개의 장으로 구성된다.
9장, ‘직렬화와 저장: JSON, YAML, Pickle, CSV, XML’에서는 JSON과 YAML, pickle, XML, CSV 같은 다양한 데이터 표현에 초점을 맞춘 라이브러리를 사용해 간단한 지속성을 다룬다.
10장. ‘셸브를 통한 객체 저장과 추출’에서는 shelve와 dbm 같은 파이썬 모듈로 기초적인 데이터베이스 연산을 설명한다.
11장, ‘SQLite를 통한 객체 저장과 추출’에서는 SQL과 관계형 데이터베이스라는 좀 더 복잡한 세계로 이동한다. SQL의 특징은 객체지향 프로그래밍의 특징과 일치하지 않으므로 임피던스 불일치 문제가 생긴다. 일반적으로 ORM 계층을 사용해 넓은 도메인의 객체를 지속시킨다.
12장, ‘객체 전송과 공유’에서는 객체를 전송하기 위한 HTTP 프로토콜과 JSON, YAML, XML 표현을 알아본다.
13장, ‘설정 파일과 지속성’에서는 설정 파일로 파이썬 애플리케이션을 동작시키는 다양한 방법을 다룬다.
3부, ‘테스트와 디버깅, 배포, 유지 보수’에서는 데이터를 수집해 고성능 프로그램을 지원하고 디버깅하는 방법을 알아본다. 지원에 따른 혼란과 복잡도를 감소시키기 위해 가능한 한 가장 좋은 설명서를 생성하는 데 필요한 정보를 제공한다. 다음과 같은 5개의 장으로 구성된다.
14장, ‘로깅과 경고 모듈’에서는 logging과 warning 모듈을 이용해 감사와 디버그 정보를 생성하는 방법을 알아본다. 이를 통해 print() 함수를 사용하는 것보다 더 의미 있는 단계로 나아간다.
15장, ‘테스트 가능한 디자인’에서는 테스트 가능한 디자인과 unittest 및 doctest의 사용법을 다룬다.
16장, ‘커맨드라인 처리’에서는 옵션과 매개변수를 파싱하는 argparse 모듈의 사용법을 살펴본다. 한걸음 더 나아가 명령 디자인 패턴을 사용해 셸 스크립트를 작성하지 않고도 합쳐지고 확장될 수 있는 프로그램 컴포넌트를 생성한다.
17장, ‘모듈과 패키지 디자인’에서는 모듈과 패키지 디자인을 다룬다. 이러한 디자인은 좀 더 높은 수준의 고려 사항이다. 모듈 내에 연관된 클래스와 패키지 내에 연관된 모듈을 살펴본다.
18장, ‘품질과 설명서’에서는 소프트웨어가 올바르고 적절히 구현됐다는 신뢰를 쌓을 수 있는 디자인 설명서를 작성하는 방법을 다룬다.
★ 지은이의 말 ★
이 책의 가장 중요한 주제 중 하나는 어떤 문제든 단 하나의 가장 좋은 접근 방법이란 없다는 점이다. 서로 다른 특징을 갖는 많은 방식이 존재한다.
프로그래밍 스타일에서 스타일이라는 주제는 굉장히 큰 흥미를 불러일으킨다. 영악한 독자라면 예제에서 선택한 이름이나 구두점 등 모든 상세 요소가 꼼꼼하게 PEP-8을 따르지 않았다는 것을 알 수 있을 것이다.
객체지향 파이썬을 정복하기 위해 아주 많은 시간을 다양한 소스의 파이썬 코드를 읽는 데 쓰겠다. 심지어 파이썬 표준 라이브러리 모듈에도 광범위한 다양성이 존재한다. 모든 예제를 완벽하게 일관적으로 표현하는 대신 약간의 불일치를 남겨뒀다. 일관성이 없는 코드가 오히려 실제 환경의 다양한 오픈소스 프로젝트에서 볼 수 있는 코드와 더 잘 어울린다.
★ 옮긴이의 말 ★
객체지향 파이썬을 완전히 정복하겠다는 제목처럼 이 책은 이미 파이썬을 다뤄본 개발자에게 주는 완벽한 파이썬 고급 기능 가이드북이다. 특히 성능과 유지 보수 측면에서 높은 품질의 프로그램을 개발할 수 있도록 상세한 예제를 바탕으로 다양한 디자인 패턴과 고려 사항을 설명한다. 또한 객체지향에 초점을 두는 만큼 파이썬 내부 요소와 사용자 애플리케이션을 통합시켜주는 여러 파이썬 기능을 살펴본다. 블랙잭 시뮬레이션이라는 한 가지 문제를 계속해서 사용하므로 일관성 있고 비교적 쉽게 이해 할 수 있다. 단, 파이썬 3가 제공하는 새로운 기법 위주로 설명하므로, 파이썬 3에 익숙한 프로그래머여야 한다. 이 책은 다음과 같이 크게 세 가지 주제를 다룬다.
첫째, 사용자 애플리케이션에 파이썬의 기능을 통합시킬 수 있는 객체지향 프로그래밍 기법을 소개한다. 즉, 스페셜 메소드를 사용해 파이썬의 내장 기능과 매끄럽게 통합되는 사용자 클래스 정의를 생성한다. 객체 초기화와 거의 모든 클래스 정의에 쓰이는 기초 스페셜 메소드 외에도 스페셜 메소드를 여섯 가지 카테고리로 나눠 설명한다. 속성 접근과 프로퍼티에 쓰이는 스페셜 메소드, 매개변수에 적용할 함수를 구현하는 콜러블, 컬렉션의 기능을 구현하는 스페셜 메소드, 숫자 클래스의 산술 연산자와 비교 연산자를 구현하는 스페셜 메소드, 컨텍스트 매니저를 구현하는 스페셜 메소드, 그리고 반복자를 정의하는 스페셜 메소드다. 이 외에 추상 기반 클래스를 사용하는 방법과 횡단 관점으로서 장식자와 믹스인을 사용하는 방법도 알아본다.
둘째, 객체 지속성과 직렬화 기법을 소개한다. JSON, YAML, Pickle, CSV, XML 같은 형태로 객체를 직렬화하거나 셸브, SQLite 모듈을 사용해 파이썬 객체를 데이터베이스와 매핑해서 객체를 지속시키는 방법을 설명한다. RESTful 웹 서비스로 프로세스 간 파이썬 객체를 전송하는 법도 알아본다. 설정 파일 역시 객체 지속성의 한 형태이므로 설정 파일과 환경 변수, 커맨드 라인 인자를 통합하는 방법도 알아본다. 직렬화와 지속성에도 마찬가지로 객체지향 디자인이 존재한다. 즉, 애플리케이션의 핵심 처리 부와 데이터 표현 기능을 지속성과 분리하는 추상화를 통해 ‘관심사 분리’라는 원리를 적용할 수 있다. 이를 위한 고급 아키텍처 디자인 패턴을 제안한다.
셋째, 객체지향 프로그래밍 외에 소프트웨어의 품질을 향상시키는 추가적인 주제를 살펴본다. unittest와 doctest를 사용한 자동 단위 테스트, logging과 warnings 모듈을 사용한 디버깅, 유지 보수성을 높여주는 설명서 작성법을 소개한다. 뿐만 아니라 통합 가능한 프로그램 컴포넌트를 생성해주는 명령 디자인 패턴을 제안한다. 이러한 도구와 기법 역시 객체지향 파이썬 개발의 매우 중요한 요소다.
위와 같은 파이썬의 고급 기능과 이 책에 나오는 다양하고 상세한 예제를 활용하면 강력한 실 서비스 애플리케이션을 개발할 수 있다. 저자가 강조했듯이 단 하나의 완벽한 솔루션은 존재하지 않는다. 어떻게 활용하느냐와 어떤 부분에 가치를 두느냐에 따라 프로그램의 품질이 좌우된다. 핵심은 기본 원리와 개념을 파악하고 도구의 사용에 익숙해지는 것이다. 마지막 장을 덮었을 때 객체지향 파이썬에 대한 높은 이해와 자신감이 생기길 바란다.
심지현