ݺߣ

ݺߣShare a Scribd company logo
유연하게 확장할 수 있는 
PHP 웹 개발 이야기 
용영환 
PHPKorea 
http://xenonix.com 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
유연하게 확장한다? 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
http://sports.donga.com/3/all/20110317/35666621/3
확장이 필요한 경우라면 
일하는 사람이 늘었거나 
돈 내는 사람이 늘었거나. 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
일하는 사람만 늘었다면… 
미안하다!!! 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
미안하지만 
어찌됐든 
일은 해야 한다. 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
돈 내는 사람이 늘었다면… 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
서버에 장애가 나도 
일단 
땡큐여서 미안하다!!! 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
서비스가 성장함에 따라 
유연하게 확장하는 
길목을 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
세 가지로 나눠 보면 
인간 + 프로그램 + 시스템 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
처음부터 다 대응하면 
좋겠지만… 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
다음 대응 단계를 
알고 준비하고 있으면 
좋을 것 같습니다. 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
초기 
개발자 1명? 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
그리고 
우리는 
돈이 없다. 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
그래서, 가볍게 시작합니다. 
서버 1 대 = 웹 + DB 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
mysql_connect 
( /slideshow/xe-con-phpfest2014/41350815/“127.0.0.1” …); 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
이용자
웹 서버 <분리> DBMS 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
웹 서버 
DBMS
mysql_connect 
( /slideshow/xe-con-phpfest2014/41350815/“192.168.0.100” …); 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
OPcache 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
이용자
정적 파일과 
동적 파일 분리 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
function getImgUrl($path) 
{ 
return $path; 
} 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
<img src=/slideshow/xe-con-phpfest2014/41350815/“ 
<?php echo 
getImgUrl(‘/hello.png’) 
?> 
” /> 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
웹 서버 
DBMS 
이미지 
웹 서버
function getImgUrl($path) 
{ 
return ‘http://img.phpk.org’.$path; 
} 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
ob_start( ); 
미리 HTML 파일로 생성 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
이용자
웹 서버 추가 
1 + 1 = 2 대 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
웹 서버 
DBMS 
웹 서버
이렇게 
확장하면 
참 좋겠습니다만… 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
웹 서버 
DBMS 
웹 서버
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
웹 서버 
DBMS 
웹 서버 
L4 스위치
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
웹 서버 
DBMS 
웹 서버 
프록시 서버
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
이용자
웹 서버 추가 
1 + 1 + 1 = 3 대 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
웹 서버 
웹 서버 
DBMS 
웹 서버 
프록시 서버
2014.11.08 Session 1-5 
XECon + PHPFest 2014
이제 
안정화가 된 것 같으니 
개발자를 구해봅니다. 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
개발자
협업 개발 환경 필요 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
이슈 트래킹 시스템 
소스 저장소, 문서 저장소, 
개발 서버, IDE, 소스 리뷰, 
통일된 빌드 환경 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
이슈 트래킹 시스템 
JIRA? Mantis? 
지금은 그냥 Yobi 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
소스 저장소 
SVN + GIT 
CVS는 요즘 안씁니다. 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
문서 저장소 
Confluence 
지금은 그냥 NAS 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
개발 서버 
CentOS 가상머신 
or 
성능 좋은 개발서버 한대 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
개발자 PC 
개발자 PC 
개발자 PC 
개발자 PC 
개발 서버 
개발 서버 
개발 서버 
개발 서버 
가상머신 개발서버
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
개발 서버 
개발자 PC 
개발자 PC 
개발자 PC 
개발자 PC
IDE 
이클립스 PDT 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
장점 : 
소스 저장소에서 
Checkout 만 받으면 
동일한 코드 환경이 유지 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
통일된 빌드 환경 
현재 Ant 
조만간 Maven 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
개발 서버 
개발자 PC 
개발자 PC 
개발자 PC 
개발자 PC
빌드 프로그램을 사용하면 
PHP 프로젝트를 
ZIP 같은 파일로 패키징 
할 수 있습니다. 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
패키징을 하면 
배포가 수월하다. 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
www.php-maven.org 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
개발자를 뽑았으니 
뭔가를 더 만들겠죠. 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
기능
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
웹 서버 
웹 서버 
DBMS 
웹 서버
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
웹 서버 
웹 서버 
DBMS 
웹 서버 
DBMS
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
웹 서버 
웹 서버 
DBMS 
웹 서버 
DBMS
라운드 로빈 
$db_no = rand(0,1); 
mysql_connect 
( $db [ $db_no ] ,…); 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
이용자
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
웹 서버 
웹 서버 
DBMS 
웹 서버 
DBMS 
웹 서버 
DBMS
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
웹 서버 
웹 서버 
DBMS 
웹 서버 
DBMS 
웹 서버 
DBMS 
프록시 서버
mysql_connect 
( /slideshow/xe-con-phpfest2014/41350815/“192.168.0.99” …); 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
2014.11.08 Session 1-5 
XECon + PHPFest 2014
Memcached 같은 
메모리 캐시 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
이용자를 위한 
맞춤형 정보가 있다면 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
로그인을 
어떻게 유지할 것인가 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
방법 1 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
웹 서버 
웹 서버 
DBMS 
웹 서버 
DBMS 
웹 서버 
DBMS 
프록시 서버 
세션 DB
방법 2 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
쿠키를 
직접 이용한다. 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
이용자 서버를 분리 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
DBMS 
웹 서버 
프록시 서버 
user.phpk.org 
DBMS
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
user1 
DBMS 
user2 
DBMS
자신의 /slideshow/xe-con-phpfest2014/41350815/“이용자 서버”가 
어디인지 어떻게 아는가 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
$_SESSION[/slideshow/xe-con-phpfest2014/41350815/“user_server”] 
= /slideshow/xe-con-phpfest2014/41350815/“user1”; 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
회원들에게 
이메일 발송을 
해야한다면… 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
PHP 
Worker 
MQ 
SMTP 
비동기
MQ 
ActiveMQ 
RabbitMQ 
ZeroMQ … 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
PHP 프로젝트의 
기능 분리 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
PHP 코드에서 
컨트롤러를 분리하면 
데이터 처리 부분을 
분리할 수 있다. 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
2014.11.08 Session 1-5 
XECon + PHPFest 2014
플러그인 방식? 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
class HelloModule { } 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
Interface Module{ 
public function run(); 
} 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
$moduleList[ ] = ‘HelloModule’; 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
foreach ( 
$moduleList as $module 
) $module->run(); 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
API 방식? 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
DBMS 
웹 서버 
프록시 서버 
API 웹 서버 
JSON
AJAX 방식? 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
데이터 객체의 분리 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
class ArticleDAO 
extends DB { } 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
DB 객체가 
DB 연결을 
담당한다. 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
이렇게 
컨트롤러를 분리하면 
테스트가 가능하다. 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
PHP UnitTest 
2014.11.08 Session 1-5 
XECon + PHPFest 2014
2014.11.08 Session 1-5 
XECon + PHPFest 2014
2014.11.08 Session 1-5 
XECon + PHPFest 2014
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
Front-End 
PHP 
Back-End 
PHP
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
이용자
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
웹 서버 
Nginx Cache 
프록시 서버
2014.11.08 Session 1-5 
XECon + PHPFest 2014 
웹 서버 
FestCGI 
PHP/Hack 서버 
DBMS
2014.11.08 Session 1-5 
XECon + PHPFest 2014

More Related Content

유연하게 확장할 수 있는 PHP 웹 개발 이야기