유연하게 확장할 수 있는 PHP 웹 개발 이야기 용영환 PHPKorea http://xenonix.com 2014.11.08 Session 1-5 XECon + PHPFest 2014
유연하게 확장할 수 있는
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
( “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
( “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=“
<?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
( “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
자신의 “이용자 서버”가
어디인지 어떻게 아는가
2014.11.08 Session 1-5 XECon + PHPFest 2014
$_SESSION[“user_server”]
= “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