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

Preview:

DESCRIPTION

XECon + PHPFest 2014 발표 자료입니다.

Citation preview

유연하게 확장할 수 있는

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