인터넷에는 수없이 많은 PHP 튜토리얼이 있다. 이들 대부분은 이미 낡고 쓸모없어진 지 오래지만 불행히도 구글 검색 결과에 살아남아 여전히 참조자료로 활용된다. 이런 낡은 정보를 무분별하게 받아들인 PHP 프로그래머는 자신도 모르는 사이에 느리고 보안에 취약한 PHP 애플리케이션을 만들게 된다.
이 책에서는 슬림(Slim) 프레임워크의 제작자이자 ‘PHP The Right Way’의 창안자인 조시 록하트가 최신 PHP 기술을 소개하는 한편, 자신의 오픈소스 프로젝트와 일상 업무에서 매일 사용하는 최신 기술을 보여준다. 독자 여러분도 이 책을 통해 PHP의 짜릿한 변화의 순간에 동참하고 진보된 PHP를 온전히 활용할 수 있게 될 것이다.
- 네임스페이스, 트레이트, 제너레이터, 클로저 등의 모던 PHP 기능
- PHP 컴포넌트를 검색, 사용, 작성하는 방법
- 보안, 데이터베이스 작업, 문자열, 스트림, 에러와 예외 등에 대한 모범 사례
- 프로비저닝, 배포, 튜닝, 테스팅, 프로파일링에 필요한 도구와 기술
- 페이스북이 선보인 HHVM과 Hack이 최신 PHP에 미친 영향
- 프로덕션 서버에 대응하는 로컬 개발 환경 구축
★ 대상 독자
- PHP에 대한 기본적인 이해가 있으며 자신의 기량을 강화하고 싶은 모든 개발자
- 수년 전부터 같은 패턴으로 개발하고 있는 PHP 개발자
- PHP의 최신 변화가 궁금하고 미래를 적극적으로 준비하고 싶은 개발자
- 호환되지 않는 여러 PHP 버전의 설명이 혼재된 인터넷 자료에 고생하고 있는 개발자
★ 추천사
나는 PHP 언어와 커뮤니티의 현 상황을 제대로 반영한 서적을 찾느라 수년을 보냈다. 이제 주저하지 않고 『Modern PHP』를 추천한다.
─ 에드 핀클러, 개발자 겸 블로거(funkatron.com)
프로그래밍에서 절대 변하지 않는 진리는 ‘프로그래밍은 변한다’는 사실뿐이다. PHP는 변하고 있고 여러분의 개발 방법 역시 변해야만 한다. 조시는 최신 PHP로 작성하기 위해 알아야 할 도구와 개념을 제시한다.
─ 캘 에번스, E.I.C.C. CEO
2. www.hanbit.co.kr
이것이
프로그래밍이다!
이것이 안드로이드다
진정한 안드로이드 개발자로
이끌어줍니다.
SDK 5.0 롤리팝 호환!
책만 보고,
동영상 강좌로도 만족하지 못했다면 Daum
카페 '슈퍼드로이드'에서 만나요
cafe.daum.net/superdroid
박성근 저 | 1,164쪽 | 45,000원
이것이 C언어다
세상에 없던 새로운
C언어 입문서 탄생!
삼성, LG에서 펼쳐졌던
전설의 명강의를 풀타임 동영상 강좌로!
이보다 더 확실한 방법은 없다, 칠판강의
전체 동영상 강좌 유투브 전격 공개!
http://goo.gl/tJK3Tu
서현우 저 | 708쪽 | 25,000원
이것이 자바다
가장 중요한 프로그래밍 언어를 하나
배워야 한다면, 결론은 자바다!
중급 개발자로 나아가기 위한 람다식,
JavaFX, NIO 수록
자바의 모든 것을 알려주는 인터넷 강의
궁금한 것은 카페에서!
cafe.naver.com/thisisjava
신용권 저 | 1,224쪽 | 30,000원
저자직강동영상 제공!
3. 모던 웹을 위한
JavaScript +
jQuery 입문
www.hanbit.co.kr
지금은
모던 웹 시대!
HTML5 분야 부동의 1위 도서
HTML5 표준안 확정에 맞춘 완전 개정판의 귀환!
HTML5 권고안과 최신 웹 브라우저 환경 대응
윤인성 저 | 624쪽 | 30,000원
모던 웹 디자인을 위한
HTML5 +
CSS3 입문
자바스크립트에서 제이쿼리, 제이쿼리 모바일까지
한 권으로 끝낸다!
시대의 흐름에 맞춰 다시 쓴 자바스크립트 교과서
윤인성 저 | 980쪽 | 32,000원
페이스북, 월마트, 링크드인은 왜
Node.js를 선택했는가?
이 물음에 대한 답은 Node.js가 보여주는 빠른 처리 능력 때문이다.
윤인성 저 | 484쪽 | 25,000원
모던 웹을 위한
Node.js
프로그래밍
필요한 것만 배워
바로 현장에서 쓰는 HTML5
순서대로 읽으며 실습할 수 있는 HTML5 자습서
김상형 저 | 700쪽 | 32,000원
HTML5 +
CSS3 정복
10. 10
처음으로 실무에 PHP를 사용했던 때는 2002년이었다. 한 중소 규모의 웹 서비스 개발을 맡았
을 때였는데, 처음에는 서블릿으로 개발할 계획이었지만 몇 가지 이유로 최종 기획 단계에서
PHP로 결정됐다. 사이트 전체를 PHP로 개발하는 일은 처음이었던지라 우려도 있었지만 막상
작업해보니 Perl CGI나 서블릿을 사용하는 것보다 쉽고 빠르게 사이트를 구축할 수 있어 새삼
놀랐던 기억이 난다. PHP의 풍부한 내장 라이브러리와 유연한 출력 제어 능력 덕분이었다.
아닌 게 아니라 그즈음 우리나라에서는 이미 PHP가 빠른 속도로 자리를 잡아가고 있었다. 개
발 언어로서뿐만 아니라 호스팅 업체들이 주력으로 지원하는 언어로서도 각광받았다. 단기간
동안 호스팅 서비스 거의 대부분에 PHP가 탑재됐고 한쪽에서는 다양한 PHP 웹 애플리케이션
들이 제작되고 공개됐다. 자생적으로 형성된 국내 커뮤니티 웹 사이트가 대부분 이런 PHP 웹
프로그램들을 이용해 구축됐다. 이 시기에 큰 인기를 끌었던 PuryBBS, 제로보드4 등은 이후
에 나온 테터툴즈나 XE 같은 걸출한 프로젝트의 모태이기도 하다. 이런 면에서 보자면 우리나
라에서 PHP가 저변을 확대하는 과정은 국내 인터넷 문화의 폭발적 확장 과정과 어느 정도 궤
를 같이 한다고도 볼 수 있다.
PHP 같은 고참 스크립트 언어가 아직까지 각종 통계나 인기 순위에서 상위권을 차지하는 데
에는 이유가 있다. 나는 PHP가 지닌 매력의 본질이 자유로운 포용력이라고 생각한다. PHP는
끊임없이 언어 구조를 개선하고 유수의 라이브러리들을 통합하는 한편 스크립트 언어의 태생
적 한계를 극복하려는 시도도 멈추지 않았다. PHP 진영은 늘 다양한 프로젝트로 북적거리는
활기찬 분위기를 이어왔다. 여기에 수많은 개발자들의 활발한 참여가 더해져 PHP 개발 생태
계는 나날이 성숙해지고 있다. 특히 최근 몇 년간 PHP는 탄생 이후 가장 역동적인 변화의 시
기를 겪고 있다고 해도 과언이 아니다. 페이스북과 Hack으로 대변되는 외적 요인을 촉매로 언
어 자체의 근간부터 재정립되고 있으며, 그 결과 PHP 7이라는 또 한번의 큰 도약을 목전에 두
고 있다.
국내에서는 PHP가 대형 솔루션을 개발하기에 적합하지 않다거나 보안에 취약한 언어라고 생
각하는 이들도 있다. 역설적이게도 이런 부정적인 인식은 PHP가 지닌 강점에 기인한다. 입문
옮긴이의 글
11. 11
하기 쉽고 빠르게 개발할 수 있어 단기간에 많은 프로젝트에 도입됐지만 그에 반해 엔터프라이
즈급 솔루션 개발에 사용되거나 다양한 고도화 작업에 심도있게 활용된 사례가 드물기 때문이
다. 스크립트 언어의 특성상 소스코드가 공개되어 있다는 점도 기피 사유 중 하나였으며 국내
SI 프로젝트에 채택되는 플랫폼 구성이 다소 획일적이라는 실정도 한 몫 거들었다. 그러나 이
런 인식과는 달리 현재 PHP는 방대한 솔루션을 많은 개발자가 공동으로 작업할 수 있는 제반
환경을 충분히 갖추고 있다. 의존성과 패키징에 대한 표준이 정립됐으며 이들을 관리할 수 있
는 우수한 도구가 등장했고, 지속적인 통합과 자동화된 테스팅 또한 가능해졌다. 뿐만 아니라
완성도 높은 풀스택 프레임워크와 ORM, 강력한 템플릿 엔진들이 포진하고 있으며 셀 수 없이
많은 오픈소스 컴포넌트를 자유롭게 활용할 수 있다.
PHP의 기술적인 최신 동향과 그에 따른 모범 사례들에 대한 정보를 PHP 초심자나 다른 언어
개발자가 일목요연하게 열람하거나 편리하게 접할 수 있는 창구는 흔치 않다. 몇몇 선도적인
개발자들의 세미나와 블로그 기고만으로는 역부족이다. 특히나 최근 국내에는 PHP 관련 서적
들의 출간도 주춤한 편이어서 아쉬움이 더해가는 상황이었다. 『Modern PHP』는 이런 시점에
서 만난 가뭄의 단비 같은 책이다.
이 책은 ‘모던 PHP’라는 제목 그대로 PHP 언어의 최신 핵심 기능을 요점정리해줄 뿐만 아니
라 유머러스하고 친절한 설명과 이해하기 쉬운 예제를 통해 모범 사례와 발전된 개발 방법까지
제시해주는 실용서다. 저자인 조시 록하트는 유력 프레임워크의 개발자인 동시에 PHP에 대한
인식 제고를 위해 발벗고 나선 오피니언 리더로서, PHP에 대한 자신의 애정과 열정을 이 책에
고스란히 담아 놓았다. 또한 PHP 진영의 전반적인 근황에 대해 넓은 시각으로 잘 설명하고 있
어서 앞으로 공개될 PHP 7을 준비하는 데 있어서도 도움이 될만한 책이다.
PHP의 미래는 여전히 활짝 열려있고 잠재력 역시 무궁무진하다. 모쪼록 국내의 개발자들도
PHP의 짜릿한 변화의 순간에 기꺼이 동참하고 진보된 PHP를 온전히 활용할 수 있게 되기를
바라며, 그 과정에 이 책이 조금이나마 보탬이 될 수 있었으면 한다.
이 책이 나오기까지 도움을 주신 분들에게 진심으로 감사의 마음을 전하고 싶다. 먼저, 처음 번
12. 12
역 의사를 전달했을 때 선뜻 기회를 제공해 준 한빛미디어 측에 감사드린다. 강은희 님과 최현
우 팀장님이 원고의 미숙한 부분을 명확히 짚어주고 적절한 가이드 라인을 제시해 준 덕분에
무사히 작업을 마무리할 수 있었다. 막히는 부분이 있을 때는 종종 주변에 도움을 구했다. 그
때마다 매번 새로운 시각과 다양한 아이디어로 생각의 물꼬를 틔워준 김재영 님에게도 감사드
린다. 마지막으로, 언제나 나를 지지하고 응원해주시는 부모님께 감사의 말씀을 드린다.
_2015년 10월 정병열
옮긴이 정병열 cloudshadow@gmail.com
연세대학교 세라믹 공학과를 졸업하고 개발자와 번역자로 활동하고 있다. 어린 시절 BASIC 언어를 통해 프로그래밍을 처음 경험
했으며 PC통신 시절에는 프로그래밍 관련 동호회에서 활동했다. 2000년대 초반부터 프로그래밍 언어와 플랫폼에 관계없이 다양
한 웹 사이트 및 솔루션 개발 프로젝트를 수행했으며 몇 년간은 리눅스 시스템 엔지니어로 근무하기도 했다. 분야를 가리지 않는 폭
넓은 관심사를 가지고 있으며 흥미를 느끼면 어떻게든 파고들어 습득하고 마는 성격의 소유자다. 현재는 취업포털 업체에서 다양한
업무를 수행하고 있다.
13. 13
온라인에는 수없이 많은 PHP 튜토리얼이 있다. 이들 대부분은 이미 낡고 쓸모 없어진 지 오래
지만 불행히도 구글 검색 결과에 살아남아 여전히 참조자료로 활용된다. 이런 낡은 정보를 무
분별하게 받아들인 PHP 프로그래머는 자신도 모르는 사이에 느리고 보안에 취약한 PHP 애플
리케이션을 만들게 될 위험에 처한다. 나는 2013년에 이러한 문제를 인식했고, 그때 가졌던 문
제의식은 PHP The Right Way(http://www.phptherightway.com)를 시작하는 가장 큰 계기
가 됐다. PHP The Right Way는 PHP 프로그래머가 PHP 커뮤니티 권위자들이 제공하는 품
질 높은 최신 정보에 쉽게 접근할 수 있게 하려고 만든 것이다.
『Modern PHP』는 이와 같은 목표를 지향하는 나의 다음 시도다. 이 책은 참고서가 절대 아니
며 여러분과 내가 친근하고 재미있게 나눈 대화를 담은 기록과도 같다. 나는 최신 PHP 프로
그래밍 언어를 소개하는 한편, 나의 오픈소스 프로젝트와 일상 업무에서 매일 사용하는 최신
PHP 기술을 보여줄 것이다. 그리고 여러분이 최신 코딩 표준을 사용하여 자신의 컴포넌트와
라이브러리들을 PHP 커뮤니티에서 공유할 수 있도록 도울 것이다.
‘커뮤니티’라는 말이 되풀이되어 나올 것이다. 가끔 극적인 사건이 있긴 해도 PHP 커뮤니티는
대체로 프로그래머들에게 친근하고 유용하며 우호적이다. 만약 이 책에서 언급한 특정 내용에
대해 궁금해지면 자신의 지역 PHP 사용자 그룹에 가서 질문해보기 바란다. 여러분이 더 나은
PHP 프로그래머가 되도록 도와줄 개발자들은 얼마든지 가까이에 있을 것이다. 지역 PHP 사
용자 그룹은 당신이 이 책을 다 읽은 후에도 지속적으로 PHP 스킬을 향상할 수 있게 도와줄
귀중한 자원이다.
이 책에 대하여
시작하기에 앞서 몇 가지를 염두에 두었으면 한다.
첫째, 다양한 PHP 사용 방법을 이 책에서 모두 다루기에는 시간이 부족하다. 대신 나의 PHP
사용 방법을 보여줄 것이다. 독단적인 접근 방식임에 분명하지만, 나는 많은 PHP 개발자가 채
들어가며
14. 14
택한 사례와 표준을 그대로 사용한다. 이 책에서 얻은 것들을 여러분의 프로젝트에 즉시 적용
할 수 있을 것이다.
둘째, 여러분이 변수와 조건문, 반복문 등에 익숙하다고 간주한다. PHP를 알아야 하는 것은
아니지만, 최소한 프로그래밍 기초 개념에 대한 기본 이해는 필요하다. 커피를 곁들여도 된다.
그 외의 모든 것은 내가 제공해줄 것이다.
셋째, 나는 여러분이 특정 운영체제를 사용한다고 간주하지 않는다. 하지만 앞으로 나올 코드
예제는 리눅스에서 작성한다. 배시Bash 명령어는 우분투용과 CentOS용을 함께 제공하며 일부
는 OS X에서도 실행할 수 있다. 만약 윈도우 사용자가 이 책의 예제 코드를 실행하고자 한다
면 가급적 리눅스 가상머신을 사용하기 바란다.
이 책의 구성
1부에서는 네임스페이스namespace, 제너레이터generator, 트레이트trait 같은 PHP의 새로운 기능을
설명한다. 모던 PHP 언어를 소개하고 여러분이 지금까지 몰랐을 수도 있는 기능을 선보인다.
2부에서는 PHP 애플리케이션에서 구현해야 할 모범 사례들을 알아본다. PSR에 대해 들어보
았을 것이다. 하지만 그것이 무엇인지, 어떻게 사용하는 것인지 온전하게 확신할 수 있는가?
사용자 입력의 위험을 제거하고 데이터베이스 쿼리를 안전하게 사용하는 방법을 알고 싶은가?
그렇다면 2부를 보라.
3부는 1부와 2부보다 더 기술적이다. 배포, 튜닝, 테스트 그리고 PHP 애플리케이션을 프로파
일링하는 방법을 알아본다. 카피스트라노Capistrano를 이용한 배포 전략을 세우고 PHP유닛PHPUnit
과 트래비스 CITravis CI 같은 테스팅 도구를 이야기한다. 그리고 PHP 애플리케이션의 성능을 높
이기 위한 PHP 튜닝 방법도 알아본다.
부록 A는 PHP-FPM 설치와 구성에 대해 단계별 안내를 제공한다.
15. 15
부록 B는 프로덕션 서버에 유사하게 대응하는 로컬 개발 환경을 구축하는 방법을 설명한다. 또
한 신속한 구축에 도움을 줄 대안 도구로 베이그런트Vagrant, 퍼핏Puppet, 셰프Chef를 알아본다.
감사의 말
이 책은 나의 첫 책이다. 오라일리에서 『Modern PHP』 집필을 제안했을 때 나는 정말이지 흥
분과 두려움에 휩싸여버리고 말았다. 어깨춤이 절로 나올 정도였다. 오라일리가 집필을 제안하
다니, 굉장한 일이지 않은가! 기쁨도 잠시, 흥분을 가라앉히고 나는 스스로에게 정말 그렇게 많
은 양을 쓸 수 있을지 물었다. 책을 쓰는 것은 그리 만만한 작업이 아니기 때문이다.
물론, 즉시 “네”라고 말했다. 가족, 친구, 동료, 편집자, 나를 전적으로 지지해줄 독자들이 있었
기 때문에 기꺼이 『Modern PHP』를 쓰겠다고 할 수 있었다. 그들이 보내준 귀중한 조언에 감
사의 뜻을 밝히고 싶다. 이들이 아니었다면, 이 책은 절대로 나올 수 없었다.
우선, 오라일리 미디어의 담당 편집자 앨리슨 맥도날드(@allyatoreilly)에게 감사하고 싶다.
앨리는 친절하고, 비판적이고, 든든하며, 명석하다. 그녀는 내가 방향을 잃을 때마다 적절히 바
로 잡아주어야 할 정확한 때와 방법을 알고 있었다. 그녀는 내게 있어 최고의 편집자다.
또한 기술 검토를 해준 아담 페어홀름(@adamfairholm)과 에드 핀클러(@funkatron)에게
도 감사한다. 아담은 뉴프랭글드(https://www.newfangled.com)의 뛰어난 웹 개발자며, 뮤직
비디오 데이터베이스 웹 사이트 IMVDb(http://imvdb.com)의 개발자로 유명하다. 에드는 어
마어마한 PHP 실력과 개성적인 팟캐스트 /dev/hell(http://devhell.info), 오픈소싱 정신질환
캠페인Open Sourcing Mental Illness campaign (http://funkatron.com/osmi)으로 잘 알려져 있다. 아담과
에드는 내 초고의 멍청하고 비논리적이며 부정확한 부분들을 지적해주었다. 그들의 노골적이
고 정직한 피드백에 대해서는 어떠한 말로도 감사의 표현을 다 할 수 없다. 그들의 지도와 지혜
에 영원히 감사한다. 최종 원고에 실수나 오류가 있다면 그것은 전적으로 내 책임이다.
16. 16
늘 나를 격려해준 뉴미디어 캠페인New Media Campaigns (http://www.newmediacampaigns.com)의
동료들 엘, 클레이, 크리스, 알렉스, 패트릭, 애슐리, 레니, 클레어, 토드, 파스칼, 헨리, 네이
선! 그리고 처음부터 끝까지 친절하게 격려해준 모든 이에게 고개 숙여 감사한다.
가장 중요한 나의 가족 로럴, 이선, 테사, 찰리, 리사, 글렌, 리즈에게 감사한다. 그들의 격려가
없었다면 절대로 이 책을 낼 수 없었을 것이다. 사랑스러운 나의 아내 로럴, 당신의 인내에 감
사한다. 밤 늦은 집필 작업 때문에 매번 카리부 커피Caribou Coffe1
에 동행해주고 주말에도 아내에
게 소홀했던 나를 이해해줘서 감사한다. 일정을 맞추고 지속적으로 동기부여할 수 있게 해준
것에 감사한다. 지금부터 영원토록 당신을 사랑하겠다.
_저자 조시 록하트
1 역자주_ 커피숍 체인의 이름이다.
지은이 조시 록하트 Josh Lockhart
조시 록하트는 웹 애플리케이션과 API를 빠르게 개발할 수 있는 초소형 PHP 프레임워크 슬림Slim을 개발했다. 또한 전 세계 PHP
개발자들에게 모범 사례를 장려하고 양질의 정보를 제공하는 권장안으로 유명한 ‘PHP The Right Way’를 창안했으며 지금도 운
영하고 있다.
조시는 노스캐롤라이나주 칼버러에 위치한 풀-서비스 웹 디자인, 개발, 마케팅 에이전시 업체인 뉴미디어 캠페인(http://www.
newmediacampaigns.com/)에서 개발자로 일하고 있다. HTML, CSS, PHP, 자바스크립트, Bash와 다양한 콘텐츠 관리 프
레임워크를 이용한 맞춤 애플리케이션 만들기를 좋아한다. 2008년 노스캐롤라이나대학교 채플힐 캠퍼스 정보문헌학 과정을 수료
했으며 아내인 로럴과 함께 두 마리 개를 키우며 노스캐롤라이나주 채플힐에 거주하고 있다.
조시의 트위터(https://twitter.com/codeguy)를 팔로우하거나 깃허브(https://github.com/codeguy)에서 그의 오픈소스 프
로젝트들을 확인할 수 있다.
17. 17
CONTENTS
옮긴이의 글 ��������������������������������������������������������������������������������������������������������������������
6
들어가며 ������������������������������������������������������������������������������������������������������������������������
9
PART 1 언어 기능
CHAPTER 1 새로운 PHP
1.1 과거 ����������������������������������������������������������������������������������������������������������������������������
27
1.2 현재 ����������������������������������������������������������������������������������������������������������������������������
28
1.3 미래 ����������������������������������������������������������������������������������������������������������������������������
30
CHAPTER 2 기능
2.1 네임스페이스 ����������������������������������������������������������������������������������������������������������������
31
2.1.1 네임스페이스를 사용하는 이유 ��������������������������������������������������������������������������������
33
2.1.2 선언 �������������������������������������������������������������������������������������������������������������������
34
2.1.3 임포트와 별칭 ������������������������������������������������������������������������������������������������������
35
2.1.4 유용한 팁 ������������������������������������������������������������������������������������������������������������
38
2.2 인터페이스로 코딩하기 ���������������������������������������������������������������������������������������������������
40
2.3 트레이트 ����������������������������������������������������������������������������������������������������������������������
45
2.3.1 트레이트를 사용하는 이유 ��������������������������������������������������������������������������������������
46
2.3.2 트레이트 생성 ������������������������������������������������������������������������������������������������������
47
2.3.3 트레이트 사용 ������������������������������������������������������������������������������������������������������
49
2.4 제너레이터 �������������������������������������������������������������������������������������������������������������������
50
2.4.1 제너레이터 생성 ���������������������������������������������������������������������������������������������������
51
2.4.2 제너레이터 사용 ���������������������������������������������������������������������������������������������������
52
18. 18
CONTENTS
2.5 클로저 �������������������������������������������������������������������������������������������������������������������������
54
2.5.1 생성 �������������������������������������������������������������������������������������������������������������������
55
2.5.2 상태 등록 ������������������������������������������������������������������������������������������������������������
56
2.6 젠드 오피캐시 ���������������������������������������������������������������������������������������������������������������
59
2.6.1 젠드 오피캐시 활성화 ��������������������������������������������������������������������������������������������
59
2.6.2 젠드 오피캐시 설정 �����������������������������������������������������������������������������������������������
61
2.6.3 젠드 오피캐시 사용 �����������������������������������������������������������������������������������������������
62
2.7 내장 HTTP 서버 �����������������������������������������������������������������������������������������������������������
62
2.7.1 서버 실행 ������������������������������������������������������������������������������������������������������������
63
2.7.2 서버 설정 ������������������������������������������������������������������������������������������������������������
63
2.7.3 라우터 스크립트 ���������������������������������������������������������������������������������������������������
64
2.7.4 내장 서버 감지 �����������������������������������������������������������������������������������������������������
64
2.7.5 단점 �������������������������������������������������������������������������������������������������������������������
65
2.8 다음 장에서 다룰 내용 ����������������������������������������������������������������������������������������������������
65
PART 2 모범 사례
CHAPTER 3 표준
3.1 PHP-FIG 구조대 ����������������������������������������������������������������������������������������������������������
70
3.2 프레임워크 상호운용성 ���������������������������������������������������������������������������������������������������
70
3.2.1 인터페이스 ����������������������������������������������������������������������������������������������������������
71
3.2.2 오토로딩 �������������������������������������������������������������������������������������������������������������
71
3.2.3 코드 스타일 ���������������������������������������������������������������������������������������������������������
71
3.3 PSR ���������������������������������������������������������������������������������������������������������������������������
72
3.4 PSR-1: 기본 코드 스타일 �����������������������������������������������������������������������������������������������
73
3.5 PSR-2: 엄격한 코드 스타일 ��������������������������������������������������������������������������������������������
74
19. 19
3.6 PSR-3: 로거 인터페이스 ������������������������������������������������������������������������������������������������
77
3.6.1 PSR-3 로거 작성 ������������������������������������������������������������������������������������������������
78
3.6.2 PSR-3 로거 사용 ������������������������������������������������������������������������������������������������
79
3.7 PSR-4: 오토로더 ����������������������������������������������������������������������������������������������������������
80
3.7.1 왜 오토로더가 중요한가 �����������������������������������������������������������������������������������������
80
3.7.2 PSR-4 오토로더 전략 ������������������������������������������������������������������������������������������
81
3.7.3 PSR-4 오토로더 작성(을 하면 안 되는 이유) �������������������������������������������������������������
82
CHAPTER 4 컴포넌트
4.1 컴포넌트를 사용하는 이유 �����������������������������������������������������������������������������������������������
85
4.2 컴포넌트란 무엇인가 ������������������������������������������������������������������������������������������������������
86
4.3 컴포넌트 vs. 프레임워크 �������������������������������������������������������������������������������������������������
87
4.3.1 모든 프레임워크가 나쁜 것은 아니다 ������������������������������������������������������������������������
88
4.3.2 알맞은 도구를 사용하라 �����������������������������������������������������������������������������������������
89
4.4 컴포넌트 선택 ���������������������������������������������������������������������������������������������������������������
90
4.4.1 쇼핑 �������������������������������������������������������������������������������������������������������������������
90
4.4.2 선택 �������������������������������������������������������������������������������������������������������������������
91
4.4.3 피드백 남기기 ������������������������������������������������������������������������������������������������������
92
4.5 컴포넌트 사용 ���������������������������������������������������������������������������������������������������������������
92
4.5.1 컴포넌트 설치 ������������������������������������������������������������������������������������������������������
93
4.5.2 컴포넌트 사용법 ���������������������������������������������������������������������������������������������������
94
4.5.3 예제 프로젝트 ������������������������������������������������������������������������������������������������������
96
4.5.4 컴포저와 사설 저장소 ������������������������������������������������������������������������������������������
100
4.6 컴포넌트 만들기 ����������������������������������������������������������������������������������������������������������
101
4.6.1 벤더와 패키지명 �������������������������������������������������������������������������������������������������
102
4.6.2 네임스페이스 �����������������������������������������������������������������������������������������������������
103
4.6.3 파일시스템 구성 �������������������������������������������������������������������������������������������������
103
20. 20
CONTENTS
4.6.4 composer.json 파일 �����������������������������������������������������������������������������������������
104
4.6.5 README 파일 �������������������������������������������������������������������������������������������������
106
4.6.6 컴포넌트 구현 ����������������������������������������������������������������������������������������������������
107
4.6.7 버전 관리 ����������������������������������������������������������������������������������������������������������
109
4.6.8 패키지스트 등록 �������������������������������������������������������������������������������������������������
109
4.6.9 컴포넌트 사용 ����������������������������������������������������������������������������������������������������
111
CHAPTER 5 모범 사례
5.1 위험 제거, 유효성 검사, 예외 처리 �����������������������������������������������������������������������������������
114
5.1.1 입력값 위험 제거 ������������������������������������������������������������������������������������������������
114
5.1.2 유효성 검사 �������������������������������������������������������������������������������������������������������
118
5.1.3 출력 예외 처리 ���������������������������������������������������������������������������������������������������
119
5.2 비밀번호 ��������������������������������������������������������������������������������������������������������������������
120
5.2.1 사용자 비밀번호를 절대 알 수 없게 할 것 ����������������������������������������������������������������
120
5.2.2 비밀번호에 절대 제한을 두지 말 것 ������������������������������������������������������������������������
120
5.2.3 사용자 비밀번호를 절대 이메일로 보내지 말 것 ��������������������������������������������������������
121
5.2.4 사용자 비밀번호를 bcrypt로 해시하라 �������������������������������������������������������������������
121
5.2.5 비밀번호 해싱 API ����������������������������������������������������������������������������������������������
122
5.2.6 PHP 5.5.0 이전의 비밀번호 해싱 API �������������������������������������������������������������������
127
5.3 날짜, 시간, 시간대 ��������������������������������������������������������������������������������������������������������
128
5.3.1 기본 시간대 지정 ������������������������������������������������������������������������������������������������
128
5.3.2 DateTime 클래스 ����������������������������������������������������������������������������������������������
129
5.3.3 DateInterval 클래스 �������������������������������������������������������������������������������������������
130
5.3.4 DateTimeZone 클래스 ��������������������������������������������������������������������������������������
132
5.3.5 DatePeriod 클래스 ��������������������������������������������������������������������������������������������
133
5.3.6 nesbot/carbon 컴포넌트 �����������������������������������������������������������������������������������
134
5.4 데이터베이스 ��������������������������������������������������������������������������������������������������������������
134
21. 21
5.4.1 PDO 확장 ��������������������������������������������������������������������������������������������������������
135
5.4.2 데이터베이스 연결과 DSN �����������������������������������������������������������������������������������
135
5.4.3 준비된 구문 �������������������������������������������������������������������������������������������������������
138
5.4.4 쿼리 결과 ����������������������������������������������������������������������������������������������������������
140
5.4.5 트랜잭션 �����������������������������������������������������������������������������������������������������������
143
5.5 멀티바이트 문자열 �������������������������������������������������������������������������������������������������������
147
5.5.1 문자 인코딩 �������������������������������������������������������������������������������������������������������
147
5.5.2 UTF-8 데이터 ��������������������������������������������������������������������������������������������������
148
5.6 스트림 �����������������������������������������������������������������������������������������������������������������������
149
5.6.1 스트림 래퍼 �������������������������������������������������������������������������������������������������������
150
5.6.2 스트림 콘텍스트 �������������������������������������������������������������������������������������������������
153
5.6.3 스트림 필터 �������������������������������������������������������������������������������������������������������
154
5.6.4 사용자 정의 스트림 필터 ��������������������������������������������������������������������������������������
156
5.7 오류와 예외 ����������������������������������������������������������������������������������������������������������������
159
5.7.1 예외 �����������������������������������������������������������������������������������������������������������������
160
5.7.2 예외 처리기 �������������������������������������������������������������������������������������������������������
164
5.7.3 오류 �����������������������������������������������������������������������������������������������������������������
165
5.7.4 오류 처리기 �������������������������������������������������������������������������������������������������������
167
5.7.5 개발 과정에서 오류와 예외 다루기 �������������������������������������������������������������������������
169
5.7.6 프로덕션 �����������������������������������������������������������������������������������������������������������
171
PART 3 배포, 테스팅, 튜닝
CHAPTER 6 호스팅
6.1 공유 서버 �������������������������������������������������������������������������������������������������������������������
177
6.2 가상 사설 서버 ������������������������������������������������������������������������������������������������������������
178
22. 22
CONTENTS
6.3 전용 서버 �������������������������������������������������������������������������������������������������������������������
179
6.4 PaaS ������������������������������������������������������������������������������������������������������������������������
179
6.5 호스팅 선택 ����������������������������������������������������������������������������������������������������������������
180
CHAPTER 7 프로비저닝
7.1 목표 ��������������������������������������������������������������������������������������������������������������������������
182
7.2 서버 설정 �������������������������������������������������������������������������������������������������������������������
182
7.2.1 최초 로그인 �������������������������������������������������������������������������������������������������������
183
7.2.2 소프트웨어 업데이트 �������������������������������������������������������������������������������������������
183
7.2.3 비루트 사용자 ����������������������������������������������������������������������������������������������������
184
7.2.4 SSH 키 쌍 인증 �������������������������������������������������������������������������������������������������
185
7.2.5 비밀번호 인증 및 루트 로그인 비활성화 ������������������������������������������������������������������
187
7.3 PHP-FPM ����������������������������������������������������������������������������������������������������������������
188
7.3.1 설치 �����������������������������������������������������������������������������������������������������������������
188
7.3.2 전역 설정 ����������������������������������������������������������������������������������������������������������
189
7.3.3 풀 설정 �������������������������������������������������������������������������������������������������������������
190
7.4 엔진엑스 ��������������������������������������������������������������������������������������������������������������������
193
7.4.1 설치 �����������������������������������������������������������������������������������������������������������������
193
7.4.2 가상 호스트 �������������������������������������������������������������������������������������������������������
193
7.5 서버 프로비저닝 자동화 ������������������������������������������������������������������������������������������������
197
7.6 서버 프로비저닝 위임 ���������������������������������������������������������������������������������������������������
197
7.7 추가 자료 �������������������������������������������������������������������������������������������������������������������
198
7.8 다음 장에서 다룰 내용 ��������������������������������������������������������������������������������������������������
198
CHAPTER 8 튜닝
8.1 php.ini 파일 ���������������������������������������������������������������������������������������������������������������
199
23. 23
8.2 메모리 �����������������������������������������������������������������������������������������������������������������������
200
8.3 젠드 오피캐시 �������������������������������������������������������������������������������������������������������������
201
8.4 파일 업로드 ����������������������������������������������������������������������������������������������������������������
203
8.5 최대 실행 시간 ������������������������������������������������������������������������������������������������������������
204
8.6 세션 처리 �������������������������������������������������������������������������������������������������������������������
205
8.7 출력 버퍼링 ����������������������������������������������������������������������������������������������������������������
205
8.8 리얼패스 캐시 �������������������������������������������������������������������������������������������������������������
206
8.9 다음 장에서 다룰 내용 ��������������������������������������������������������������������������������������������������
206
CHAPTER 9 배포
9.1 버전 관리 �������������������������������������������������������������������������������������������������������������������
207
9.2 배포 자동화 ����������������������������������������������������������������������������������������������������������������
208
9.2.1 단순하게 �����������������������������������������������������������������������������������������������������������
208
9.2.2 예측 가능하게 ����������������������������������������������������������������������������������������������������
208
9.2.3 가역적으로 ��������������������������������������������������������������������������������������������������������
208
9.3 카피스트라노 ��������������������������������������������������������������������������������������������������������������
208
9.3.1 작동 �����������������������������������������������������������������������������������������������������������������
209
9.3.2 설치 �����������������������������������������������������������������������������������������������������������������
210
9.3.3 설정 �����������������������������������������������������������������������������������������������������������������
210
9.3.4 인증 �����������������������������������������������������������������������������������������������������������������
212
9.3.5 원격 서버 ����������������������������������������������������������������������������������������������������������
212
9.3.6 카피스트라노 훅 �������������������������������������������������������������������������������������������������
213
9.3.7 애플리케이션 배포 ����������������������������������������������������������������������������������������������
214
9.3.8 애플리케이션 되돌리기 ����������������������������������������������������������������������������������������
214
9.4 참고 자료 �������������������������������������������������������������������������������������������������������������������
214
9.5 다음 장에서 다룰 내용 ��������������������������������������������������������������������������������������������������
215
24. 24
CONTENTS
CHAPTER 10 테스팅
10.1 테스트를 하는 이유 ������������������������������������������������������������������������������������������������������
217
10.2 테스트 시점 ���������������������������������������������������������������������������������������������������������������
218
10.2.1 개발 전 �������������������������������������������������������������������������������������������������������������
218
10.2.2 개발 도중 ����������������������������������������������������������������������������������������������������������
218
10.2.3 개발 후 �������������������������������������������������������������������������������������������������������������
219
10.3 테스트 대상 ����������������������������������������������������������������������������������������������������������������
219
10.4 테스트 방법 ����������������������������������������������������������������������������������������������������������������
219
10.4.1 단위 테스트 �������������������������������������������������������������������������������������������������������
220
10.4.2 테스트 주도 개발(TDD) ���������������������������������������������������������������������������������������
220
10.4.3 행위 주도 개발(BDD) ������������������������������������������������������������������������������������������
221
10.5 PHP유닛 �������������������������������������������������������������������������������������������������������������������
222
10.5.1 디렉터리 구조 ����������������������������������������������������������������������������������������������������
222
10.5.2 PHP유닛 설치 ���������������������������������������������������������������������������������������������������
223
10.5.3 Xdebug 설치 ����������������������������������������������������������������������������������������������������
224
10.5.4 PHP유닛 설정 ���������������������������������������������������������������������������������������������������
224
10.5.5 Whovian 클래스 �����������������������������������������������������������������������������������������������
226
10.5.6 WhovianTest 테스트 케이스 �������������������������������������������������������������������������������
227
10.5.7 테스트 수행 �������������������������������������������������������������������������������������������������������
230
10.5.8 코드 커버리지 ����������������������������������������������������������������������������������������������������
231
10.6 트래비스 CI를 통한 지속적인 테스팅 �������������������������������������������������������������������������������
232
10.6.1 설정 �����������������������������������������������������������������������������������������������������������������
232
10.6.2 실행 �����������������������������������������������������������������������������������������������������������������
233
10.7 참고 자료 �������������������������������������������������������������������������������������������������������������������
234
10.8 다음 장에서 다룰 내용 ��������������������������������������������������������������������������������������������������
234
25. 25
CHAPTER 11 프로파일링
11.1 프로파일러 사용 시점 ���������������������������������������������������������������������������������������������������
235
11.2 프로파일러 종류 ����������������������������������������������������������������������������������������������������������
236
11.3 Xdebug ��������������������������������������������������������������������������������������������������������������������
236
11.3.1 설정 �����������������������������������������������������������������������������������������������������������������
237
11.3.2 발동 �����������������������������������������������������������������������������������������������������������������
237
11.3.3 분석 �����������������������������������������������������������������������������������������������������������������
238
11.4 XHProf ���������������������������������������������������������������������������������������������������������������������
238
11.4.1 설치 �����������������������������������������������������������������������������������������������������������������
238
11.4.2 XHGUI ������������������������������������������������������������������������������������������������������������
239
11.4.3 설정 �����������������������������������������������������������������������������������������������������������������
240
11.4.4 발동 �����������������������������������������������������������������������������������������������������������������
240
11.5 뉴렐릭 프로파일러 �������������������������������������������������������������������������������������������������������
241
11.6 블랙파이어 프로파일러 �������������������������������������������������������������������������������������������������
241
11.7 참고 자료 �������������������������������������������������������������������������������������������������������������������
242
11.8 다음 장에서 다룰 내용 ��������������������������������������������������������������������������������������������������
242
CHAPTER 12 HHVM과 Hack
12.1 HHVM ����������������������������������������������������������������������������������������������������������������������
244
12.1.1 페이스북과 PHP ������������������������������������������������������������������������������������������������
244
12.1.2 HHVM과 젠드 엔진의 동등성 �������������������������������������������������������������������������������
246
12.1.3 HHVM은 내게 적당한가 ��������������������������������������������������������������������������������������
246
12.1.4 설치 �����������������������������������������������������������������������������������������������������������������
247
12.1.5 설정 �����������������������������������������������������������������������������������������������������������������
248
12.1.6 확장 �����������������������������������������������������������������������������������������������������������������
249
26. 26
CONTENTS
12.1.7 슈퍼바이저를 이용한 HHVM 관제 �������������������������������������������������������������������������
249
12.1.8 HHVM, FastCGI, 엔진엑스 ���������������������������������������������������������������������������������
251
12.2 Hack 언어 �����������������������������������������������������������������������������������������������������������������
253
12.2.1 PHP를 Hack으로 변환하기 ���������������������������������������������������������������������������������
253
12.2.2 타입이란 �����������������������������������������������������������������������������������������������������������
254
12.2.3 정적 타이핑 �������������������������������������������������������������������������������������������������������
256
12.2.4 동적 타이핑 �������������������������������������������������������������������������������������������������������
256
12.2.5 Hack은 양손잡이다 ��������������������������������������������������������������������������������������������
257
12.2.6 Hack 타입 검사 �������������������������������������������������������������������������������������������������
258
12.2.7 Hack 모드 ��������������������������������������������������������������������������������������������������������
258
12.2.8 Hack 문법 ��������������������������������������������������������������������������������������������������������
259
12.2.9 Hack 데이터 구조 ����������������������������������������������������������������������������������������������
261
12.2.10 HHVM/Hack vs. PHP ��������������������������������������������������������������������������������������
262
12.3 참고 자료 �������������������������������������������������������������������������������������������������������������������
264
CHAPTER 13 커뮤니티
13.1 지역 PUG ������������������������������������������������������������������������������������������������������������������
265
13.2 컨퍼런스 ��������������������������������������������������������������������������������������������������������������������
266
13.3 멘토링 �����������������������������������������������������������������������������������������������������������������������
266
13.4 최신 정보 �������������������������������������������������������������������������������������������������������������������
266
13.4.1 웹 사이트 ����������������������������������������������������������������������������������������������������������
266
13.4.2 메일링 리스트 ����������������������������������������������������������������������������������������������������
267
13.4.3 트위터 ��������������������������������������������������������������������������������������������������������������
267
13.4.4 팟캐스트 �����������������������������������������������������������������������������������������������������������
267
13.4.5 유머 �����������������������������������������������������������������������������������������������������������������
267