O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.
Google Developers Group
#Incheon
Modern PHP
전창완
@wan2land
Google Developers Group
#Incheon
발표자소개
- 전창완
- Oponiti 개발자
- Wandu Framework

wandu.github.io
Google Developers Group
#Incheon
목적
- PHP 후지지않아요, PHP도 충분히 세련되요..
Google Developers Group
#Incheon
목차
- Modern PHP?
1. 최신버전
2. 패키지매니저
3. PSR
4. 설계방법
- 프레임워크
Google Developers Group
#Incheon
Modern PHP?
Google Developers Group
#Incheon
Modern + PHP
Google Developers Group
#Incheon
Modern은 무엇일까요?
Google Developers Group
#Incheon
Modern은 무엇일까요?
- 최신버전
- 패키지매니저
- PSR
- 설계방법
Google Developers Group
#Incheon
1최신버전
Google Developers Group
#Incheon
어디서 부터가 최신버전일까요?
Google Developers Group
#Incheon
PHP의 흐름
1995 2016
1995 PHP 1.0
2000 2005 2010 2015
2006 PHP 5.2
2009 PHP 5.3
2012 PHP 5.4...
Google Developers Group
#Incheon
PHP Support
여기까지 지원종료
Google Developers Group
#Incheon
웹호스팅의 환경
- 상당수의 웹호스팅은 PHP 5.2.
- 요즘에는 PHP 5.5까지는 지원하고 있음.
- 물론 큰 업체는 PHP7을 지원하는 곳도 있음.
Google Developers Group
#Incheon
왜 이런일이 벌어지는걸까?
- Wordpress가 너무 유명함.
- 국문으로 된 최신 PHP 자료가 없음.
Google Developers Group
#Incheon
보안때문에라도 일단은 올려야 한다.
Google Developers Group
#Incheon
그리고,
속도 이야기를 안할수가 없죠.
Google Developers Group
#Incheon
PHP의 동작 원리
1Request = 1Process
Google Developers Group
#Incheon
PHP의 동작 원리
Nginx
Process
PHP FPM Process
Process
PHP ScriptFast CGI
Google Developers Group
#Incheon
PHP의 동작 원리
Nginx
Process
PHP FPM Process
Process
PHP ScriptFast CGI
페이지 요청시 프로그램을 처음부터 실행...
Google Developers Group
#Incheon
PHP의 동작 원리
Nginx
Process
PHP FPM Process
Process
PHP ScriptFast CGI
왜 그럴까요?
Google Developers Group
#Incheon
왜 그럴까요?
- PHP는 Apache Module로서, 템플릿 엔진으로 시작된 언어.
Google Developers Group
#Incheon
새로운 PHP가 필요
- 1Request = 1Process 특성상 느릴 수 밖에 없음.
- 처음에는 가벼운 프로그램이었지만,

프로그램이 거대해지면서 점점 느...
Google Developers Group
#Incheon
새로운 PHP가 필요
- 이 문제 해결을 위해서 Facebook이 직접 HHVM 이라는 것을
만듦.
- HHVM(Hiphop Virtual Machine)
- ...
Google Developers Group
#Incheon
새로운 PHP가 필요
- PHP그룹 에서도 문제의 심각성(?)을 느끼고 PHP7 개발 착수…
- 2015, PHP7 등장!
- (현재 최신 버전은 7.0.9)
Google Developers Group
#Incheon
PHP 버전별 워드프레스의 성능
www.php.technology/changes-in-php7-and-performance
0
175
350
525
700
PH...
Google Developers Group
#Incheon
PHP 버전별 워드프레스의 성능
www.php.technology/changes-in-php7-and-performance
0
175
350
525
700
PH...
Google Developers Group
#Incheon
다른 언어와의 비교
PHP vs Python
Google Developers Group
#Incheon
다른 언어와의 비교
Google Developers Group
#Incheon
PHP7 vs Python3
benchmarksgame.alioth.debian.org/u64q/php.html
Google Developers Group
#Incheon
PHP7 vs Python3
benchmarksgame.alioth.debian.org/u64q/php.html
언어 자체가 빠르다고 해도,

PHP는 매 리퀘...
Google Developers Group
#Incheon
기존 PHP와 다른 패러다임의 프로젝트
- React PHP : Event Driven, Non Blocking
- Icicle PHP : Coroutine
-...
Google Developers Group
#Incheon
정리
- 성능에 문제가 되는 부분은 대부분 I/O(주로 Database).
- 언어자체가 문제가 되는 경우는 거의 없음.
Google Developers Group
#Incheon
2패키지매니저
Google Developers Group
#Incheon
패키지매니저?
- 설치, 업데이트, 삭제를 자동화 하는 도구.
- 라이브러리 간의 의존성 및 버전을 관리.
Google Developers Group
#Incheon
패키지매니저?
- Ruby - Gem / Bundler
- Python - PIP
- Node.js - NPM
- iOS - CocoaPads
- Java - ...
Google Developers Group
#Incheon
PHP 패키지매니저
<?php

include_once '../../common/lib.php';

include_once ‘../../common/func.php';

include_once '../../common/site.php';
...
Google Developers Group
#Incheon
“include_once” 구문은 이제 그만..
Google Developers Group
#Incheon
“include”는 한번만 하면 돼요.
<?php

use WanduFoundationApplication;

use WanduFoundationDefinitionsNeedInstallDefinition;

use WanduFoundationKernelsCo...
<?php

namespace WanduFoundationKernels;



use SymfonyComponentConsoleApplication as SymfonyApplication;

use WanduConfig...
Google Developers Group
#Incheon
Composer
- 남들이 만든 다양한 라이브러리를 제공.
- Packagist라는 웹사이트를 운영.
- packagist.org
Google Developers Group
#Incheon
Packagist
Google Developers Group
#Incheon
바퀴는 그만 만들고,

이제는 필요한 것만 가져다 사용해요.
Google Developers Group
#Incheon
PSR
3
Google Developers Group
#Incheon
PSR
- PHP Standard Recommendation
- www.php-fig.org/psr
Google Developers Group
#Incheon
PSR
Google Developers Group
#Incheon
4설계방법
Google Developers Group
#Incheon
설계방법, OOP
Google Developers Group
#Incheon
설계방법
- Routing
- Testable / Container
Google Developers Group
#Incheon
Routing
Google Developers Group
#Incheon
옛날 방식의 PHP 사이트
Google Developers Group
#Incheon
요즘 방식의 PHP 사이트
Google Developers Group
#Incheon
요즘 방식의 사이트
RESTFul
use PsrHttpMessageServerRequestInterface as Request;

use PsrHttpMessageResponseInterface as Response;



$app = new SlimA...
Route::group(['prefix' => '/users'], function () {

Route::get('', 'AdminUserController@index')->name('admin.users.index')...
Google Developers Group
#Incheon
PHP에서 Routing
- 확장자를 감출 수 있음.
- 파일 한개 != 하나의 페이지.
- RESTFul 하게 페이지 구성가능.
- MVC 패턴 사용.
Google Developers Group
#Incheon
Testable / Container
Google Developers Group
#Incheon
다들 잘 아는 얘기겠지만..
if ( $shake_error_codes && $wp_error->get_error_code() && in_array( $wp_error-
>get_error_code(), $shake_error_codes ) )

...
Google Developers Group
#Incheon
왜 이렇게 되었는가?
- PHP 태생적 한계.
- 단순한 웹 템플릿 수준의 프로그램일 때는 괜찮았는데,

복잡한 프로그램을 작성하게 되면서 발생한 문제.
Google Developers Group
#Incheon
무엇이 문제인가?
- 워드프레스 코드는 어떻게 테스트 할 수 있는가?
- 테스트 코드 작성하기가 힘듦.
- 유닛테스트 불가능. (물론, UI 테스트는 가능함)
Google Developers Group
#Incheon
무엇이 문제인가?
- 유닛테스트를 작성하려면 Mocking이 있으면 편함.
- 그러려면 의존성을 주입 받아야함.
Google Developers Group
#Incheon
의존성 주입 / Mocking
- “프로그래밍에서 구성요소간의 종속성을 소스코드에서 설정하
지 않고 외부의 설정파일 등을 통해 컴파일 시점이나 실행 시점
에 주...
Google Developers Group
#Incheon
의존성 주입 / Mocking
Database
Connec>on
Ar>cleRepository
GrammarInterfaceMySqlGrammar
class Database

{

/** @var GrammarInterface */

protected $grammar;



/** @var Connection */

protected $connection;



...
class Database

{

/** @var GrammarInterface */

protected $grammar;



/** @var Connection */

protected $connection;



...
$connection = Mockery::mock(Connection::class);

$connection->shouldReceive(‘connect')

->andReturn(true);



$grammar = M...
Google Developers Group
#Incheon
의존성 주입 / Mocking
- 쉽게 이야기 해서 주입을 받는 편이 프로그램 수정하기가 좋음.
- (이거 다 설명하려면 하루종일 걸림…)
- (자세한건 구글신...
Google Developers Group
#Incheon
ArticleRepository 객체

어떻게 만들 수 있을까?
Google Developers Group
#Incheon
Container
Database
Connec>on
Ar>cleRepository
GrammarInterfaceMySqlGrammar
$articleRepo = new ArticleRepository(

new Database(

new Connection,

new MySqlGrammar()

)

);
Google Developers Group
#Incheon
Container
- 이걸 언제 다 할텐가.
- 컨테이너를 사용하자.
- 그래서, 각 객체에 대해서 생성 방식만 정의하자.
// GrammarInterface를 요청하면 MySqlGrammar를 반환

$container->bind(GrammarInterface::class, MySqlGrammar::class);



// Database...
Google Developers Group
#Incheon
Container?
- 요즘 나온 프레임워크를 구성하는 기본단위.
- 클래스를 생성하고 의존관계를 관리함.
- 생성한 객체를 보관.
- 의존성을 자동으로 해결해...
Google Developers Group
#Incheon
Container?
- Android - Dagger
- Spring
Google Developers Group
#Incheon
Container의 기능
- Auto Resolve : 의존성 자동 해결
- Auto Wiring : Annotation을 통해 객체 내부 변수에 직접 변
수 ...
Google Developers Group
#Incheon
PHP Container Package
- Pimple
- Wandu Container
- Laravel Container (단독으로 사용하기 어려움)
Google Developers Group
#Incheon
Framework
Google Developers Group
#Incheon
잠깐 하소연..
- Ruby on Rails vs Python Django vs PHP
Google Developers Group
#Incheon
잠깐 하소연..
- Ruby on Rails vs Python Django vs PHP
- Ruby on Rails vs Python Django vs PHP ...
Laravel
Google Developers Group
#Incheon
Laravel
- PHP에서는 가장 Hot 한 프레임워크.
Google Developers Group
#Incheon
Laravel
- Full Stack Framework.
- MVC Pattern.
- MIT License.
Google Developers Group
#Incheon
Laravel 주요 기능
- Active Record 방식의 ORM 제공.
- 가상 개발환경 Homestead 제공.
- Front End Build 도구인 E...
Google Developers Group
#Incheon
그외에도 모던한 Framework
- Full stack Framework
- Symfony, Phalcon, League, Wandu …
- Micro Fra...
Google Developers Group
#Incheon
결론
Google Developers Group
#Incheon
PHP 생각보다 나쁘지 않다.
Google Developers Group
#Incheon
더 궁금하다면?
- ModernPHP
- Josh Lockhart 저, 정병열 역
- 한빛미디어
Google Developers Group
#Incheon
더 궁금하다면?
- Modern PHP User Group
- www.modernpug.org
- PHP : The Right Way 한글판
- modernpu...
Google Developers Group
#Incheon
광고
- Modern 한 프레임워크가 개발하고 싶다면..
- github.com/wandu
Google Developers Group
#Incheon
Q & A
Google Developers Group
#Incheon
끝
Modern PHP
Próximos SlideShares
Carregando em…5
×

Modern PHP

PHP를 안좋게 바라보는 개발자 분들 중에 상당 수가 옛날 방식을 이야기 하는 분들이 많습니다. 그런 분들에게 요즘의 PHP는 어떻게 좋아지고 있는지 어떻게 개발방법이 바뀌었는지 소개하고자 만들었습니다.

8월 GDG 인천에서 발표한 내용입니다.

  • Entre para ver os comentários

Modern PHP

  1. 1. Google Developers Group #Incheon Modern PHP 전창완 @wan2land
  2. 2. Google Developers Group #Incheon 발표자소개 - 전창완 - Oponiti 개발자 - Wandu Framework
 wandu.github.io
  3. 3. Google Developers Group #Incheon 목적 - PHP 후지지않아요, PHP도 충분히 세련되요..
  4. 4. Google Developers Group #Incheon 목차 - Modern PHP? 1. 최신버전 2. 패키지매니저 3. PSR 4. 설계방법 - 프레임워크
  5. 5. Google Developers Group #Incheon Modern PHP?
  6. 6. Google Developers Group #Incheon Modern + PHP
  7. 7. Google Developers Group #Incheon Modern은 무엇일까요?
  8. 8. Google Developers Group #Incheon Modern은 무엇일까요? - 최신버전 - 패키지매니저 - PSR - 설계방법
  9. 9. Google Developers Group #Incheon 1최신버전
  10. 10. Google Developers Group #Incheon 어디서 부터가 최신버전일까요?
  11. 11. Google Developers Group #Incheon PHP의 흐름 1995 2016 1995 PHP 1.0 2000 2005 2010 2015 2006 PHP 5.2 2009 PHP 5.3 2012 PHP 5.4 2012 Composer Release 2013 PHP 5.5 2014 PHP 5.6 2015 PHP 7.0 …
  12. 12. Google Developers Group #Incheon PHP Support 여기까지 지원종료
  13. 13. Google Developers Group #Incheon 웹호스팅의 환경 - 상당수의 웹호스팅은 PHP 5.2. - 요즘에는 PHP 5.5까지는 지원하고 있음. - 물론 큰 업체는 PHP7을 지원하는 곳도 있음.
  14. 14. Google Developers Group #Incheon 왜 이런일이 벌어지는걸까? - Wordpress가 너무 유명함. - 국문으로 된 최신 PHP 자료가 없음.
  15. 15. Google Developers Group #Incheon 보안때문에라도 일단은 올려야 한다.
  16. 16. Google Developers Group #Incheon 그리고, 속도 이야기를 안할수가 없죠.
  17. 17. Google Developers Group #Incheon PHP의 동작 원리 1Request = 1Process
  18. 18. Google Developers Group #Incheon PHP의 동작 원리 Nginx Process PHP FPM Process Process PHP ScriptFast CGI
  19. 19. Google Developers Group #Incheon PHP의 동작 원리 Nginx Process PHP FPM Process Process PHP ScriptFast CGI 페이지 요청시 프로그램을 처음부터 실행해요.
  20. 20. Google Developers Group #Incheon PHP의 동작 원리 Nginx Process PHP FPM Process Process PHP ScriptFast CGI 왜 그럴까요?
  21. 21. Google Developers Group #Incheon 왜 그럴까요? - PHP는 Apache Module로서, 템플릿 엔진으로 시작된 언어.
  22. 22. Google Developers Group #Incheon 새로운 PHP가 필요 - 1Request = 1Process 특성상 느릴 수 밖에 없음. - 처음에는 가벼운 프로그램이었지만,
 프로그램이 거대해지면서 점점 느려짐.
  23. 23. Google Developers Group #Incheon 새로운 PHP가 필요 - 이 문제 해결을 위해서 Facebook이 직접 HHVM 이라는 것을 만듦. - HHVM(Hiphop Virtual Machine) - hhvm.com
  24. 24. Google Developers Group #Incheon 새로운 PHP가 필요 - PHP그룹 에서도 문제의 심각성(?)을 느끼고 PHP7 개발 착수… - 2015, PHP7 등장! - (현재 최신 버전은 7.0.9)
  25. 25. Google Developers Group #Incheon PHP 버전별 워드프레스의 성능 www.php.technology/changes-in-php7-and-performance 0 175 350 525 700 PHP 5.3/APC PHP 5.3 PHP 5.4 PHP 5.5 PHP 5.6 PHP 7 HHVM 3.5 requestspersecond
  26. 26. Google Developers Group #Incheon PHP 버전별 워드프레스의 성능 www.php.technology/changes-in-php7-and-performance 0 175 350 525 700 PHP 5.3/APC PHP 5.3 PHP 5.4 PHP 5.5 PHP 5.6 PHP 7 HHVM 3.5 requestspersecond 튜닝한다고 애쓰지말고, 버전을 올려요.
  27. 27. Google Developers Group #Incheon 다른 언어와의 비교 PHP vs Python
  28. 28. Google Developers Group #Incheon 다른 언어와의 비교
  29. 29. Google Developers Group #Incheon PHP7 vs Python3 benchmarksgame.alioth.debian.org/u64q/php.html
  30. 30. Google Developers Group #Incheon PHP7 vs Python3 benchmarksgame.alioth.debian.org/u64q/php.html 언어 자체가 빠르다고 해도,
 PHP는 매 리퀘스트마다 프로그램을 처음부터 실행해야해서,
 서버 성능은 더 느려요 (아마도?).
  31. 31. Google Developers Group #Incheon 기존 PHP와 다른 패러다임의 프로젝트 - React PHP : Event Driven, Non Blocking - Icicle PHP : Coroutine - PocketMine-MP : Pthreads
  32. 32. Google Developers Group #Incheon 정리 - 성능에 문제가 되는 부분은 대부분 I/O(주로 Database). - 언어자체가 문제가 되는 경우는 거의 없음.
  33. 33. Google Developers Group #Incheon 2패키지매니저
  34. 34. Google Developers Group #Incheon 패키지매니저? - 설치, 업데이트, 삭제를 자동화 하는 도구. - 라이브러리 간의 의존성 및 버전을 관리.
  35. 35. Google Developers Group #Incheon 패키지매니저? - Ruby - Gem / Bundler - Python - PIP - Node.js - NPM - iOS - CocoaPads - Java - Maven
  36. 36. Google Developers Group #Incheon PHP 패키지매니저
  37. 37. <?php include_once '../../common/lib.php';
 include_once ‘../../common/func.php';
 include_once '../../common/site.php';
 include_once ‘../inc/starter.php'; 익숙한 옛날 소스…
  38. 38. Google Developers Group #Incheon “include_once” 구문은 이제 그만..
  39. 39. Google Developers Group #Incheon “include”는 한번만 하면 돼요.
  40. 40. <?php
 use WanduFoundationApplication;
 use WanduFoundationDefinitionsNeedInstallDefinition;
 use WanduFoundationKernelsConsoleKernel;
 
 require_once __DIR__ . '/vendor/autoload.php';
 
 $definePath = getcwd() . '/.wandu.php';
 $definition = require $definePath;
 
 $app = new Application(new ConsoleKernel($definition));
 $app->instance('base_path', __DIR__);
 exit($app->execute());
 index.php에서 한번!
  41. 41. <?php
 namespace WanduFoundationKernels;
 
 use SymfonyComponentConsoleApplication as SymfonyApplication;
 use WanduConfigConfig;
 use WanduConfigContractsConfigInterface;
 use WanduConsoleDispatcher;
 use WanduDIContainerInterface;
 use WanduFoundationApplication;
 use WanduFoundationContractsDefinitionInterface;
 use WanduFoundationContractsKernelInterface;
 
 class ConsoleKernel implements KernelInterface
 {
 /** @var WanduFoundationContractsDefinitionInterface */
 protected $definition;
 
 public function __construct(DefinitionInterface $definition)
 {
 $this->definition = $definition;
 }
 
 /**
 * {@inheritdoc}
 */
 public function boot(ContainerInterface $app)
 {
 $app->instance(Config::class, new Config($this->definition->configs()));
 $app->alias(ConfigInterface::class, Config::class);
 $app->alias('config', Config::class);
 $this->definition->providers($app);
 }
  42. 42. Google Developers Group #Incheon Composer - 남들이 만든 다양한 라이브러리를 제공. - Packagist라는 웹사이트를 운영. - packagist.org
  43. 43. Google Developers Group #Incheon Packagist
  44. 44. Google Developers Group #Incheon 바퀴는 그만 만들고,
 이제는 필요한 것만 가져다 사용해요.
  45. 45. Google Developers Group #Incheon PSR 3
  46. 46. Google Developers Group #Incheon PSR - PHP Standard Recommendation - www.php-fig.org/psr
  47. 47. Google Developers Group #Incheon PSR
  48. 48. Google Developers Group #Incheon 4설계방법
  49. 49. Google Developers Group #Incheon 설계방법, OOP
  50. 50. Google Developers Group #Incheon 설계방법 - Routing - Testable / Container
  51. 51. Google Developers Group #Incheon Routing
  52. 52. Google Developers Group #Incheon 옛날 방식의 PHP 사이트
  53. 53. Google Developers Group #Incheon 요즘 방식의 PHP 사이트
  54. 54. Google Developers Group #Incheon 요즘 방식의 사이트 RESTFul
  55. 55. use PsrHttpMessageServerRequestInterface as Request;
 use PsrHttpMessageResponseInterface as Response;
 
 $app = new SlimApp;
 $app->get('/hello/{name}', function (Request $request, Response $response) {
 $name = $request->getAttribute('name');
 $response->getBody()->write("Hello, $name");
 
 return $response;
 });
 $app->run();
 www.slimframework.com
  56. 56. Route::group(['prefix' => '/users'], function () {
 Route::get('', 'AdminUserController@index')->name('admin.users.index');
 
 Route::get('/create', 'AdminUserController@create')->name('admin.users.create');
 Route::post('', 'AdminUserController@store')->name('admin.users.store');
 
 Route::get('/{id}', 'AdminUserController@show')
 ->name('admin.users.show');
 Route::put('/{id}', 'AdminUserController@update')
 ->name('admin.users.update');
 Route::delete('/{id}', 'AdminUserController@destroy')
 ->name('admin.users.destroy');
 }); laravel.com
  57. 57. Google Developers Group #Incheon PHP에서 Routing - 확장자를 감출 수 있음. - 파일 한개 != 하나의 페이지. - RESTFul 하게 페이지 구성가능. - MVC 패턴 사용.
  58. 58. Google Developers Group #Incheon Testable / Container
  59. 59. Google Developers Group #Incheon 다들 잘 아는 얘기겠지만..
  60. 60. if ( $shake_error_codes && $wp_error->get_error_code() && in_array( $wp_error- >get_error_code(), $shake_error_codes ) )
 add_action( 'login_head', 'wp_shake_js', 12 );
 
 $separator = is_rtl() ? ' &rsaquo; ' : ' &lsaquo; ';
 
 ?><!DOCTYPE html>
 <!--[if IE 8]>
 <html xmlns="http://www.w3.org/1999/xhtml" class="ie8" <?php language_attributes(); ?>>
 <![endif]-->
 <!--[if !(IE 8) ]><!-->
 <html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>>
 <!--<![endif]-->
 <head>
 <meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<? php bloginfo('charset'); ?>" />
 <title><?php echo get_bloginfo( 'name', 'display' ) . $separator . $title; ?></title>
 <?php
 
 wp_enqueue_style( 'login' );
 
 /*
 * Remove all stored post data on logging out.
 * This could be added by add_action('login_head'...) like wp_shake_js(),
 * but maybe better if it's not removable by plugins
 */
 if ( 'loggedout' == $wp_error->get_error_code() ) {
 ?>
 <script>if("sessionStorage" in window){try{for(var key in sessionStorage) {if(key.indexOf("wp-autosave-")!=-1){sessionStorage.removeItem(key)}}}catch(e){}};</ script>
 <?php
 } 최악의 코드 스타일, Wordpress github.com/WordPress/WordPress/blob/master/wp-login.php
  61. 61. Google Developers Group #Incheon 왜 이렇게 되었는가? - PHP 태생적 한계. - 단순한 웹 템플릿 수준의 프로그램일 때는 괜찮았는데,
 복잡한 프로그램을 작성하게 되면서 발생한 문제.
  62. 62. Google Developers Group #Incheon 무엇이 문제인가? - 워드프레스 코드는 어떻게 테스트 할 수 있는가? - 테스트 코드 작성하기가 힘듦. - 유닛테스트 불가능. (물론, UI 테스트는 가능함)
  63. 63. Google Developers Group #Incheon 무엇이 문제인가? - 유닛테스트를 작성하려면 Mocking이 있으면 편함. - 그러려면 의존성을 주입 받아야함.
  64. 64. Google Developers Group #Incheon 의존성 주입 / Mocking - “프로그래밍에서 구성요소간의 종속성을 소스코드에서 설정하 지 않고 외부의 설정파일 등을 통해 컴파일 시점이나 실행 시점 에 주입하도록 하는 디자인 패턴 중의 하나이다.” - modernpug.github.io/php-the-right-way/#dependency_injection
  65. 65. Google Developers Group #Incheon 의존성 주입 / Mocking Database Connec>on Ar>cleRepository GrammarInterfaceMySqlGrammar
  66. 66. class Database
 {
 /** @var GrammarInterface */
 protected $grammar;
 
 /** @var Connection */
 protected $connection;
 
 public function __construct()
 {
 $this->connection = new Connection();
 $this->grammar = new MySqlGrammar(); 
 }
 }
  67. 67. class Database
 {
 /** @var GrammarInterface */
 protected $grammar;
 
 /** @var Connection */
 protected $connection;
 
 public function __construct( Connection $connection, GrammarInterface $grammar ) {
 $this->connection = $connection;
 $this->grammar = $grammar; 
 }
 } 의존성 주입
  68. 68. $connection = Mockery::mock(Connection::class);
 $connection->shouldReceive(‘connect') ->andReturn(true);
 
 $grammar = Mocker::mock(GrammarInterface::class);
 $grammar->shouldReceive(‘createSelectSyntax') ->with(‘articles') ->andReturn('SELECT * FROM `articles`')
 
 $database = new Database($connection, $grammar);
 Mocking
  69. 69. Google Developers Group #Incheon 의존성 주입 / Mocking - 쉽게 이야기 해서 주입을 받는 편이 프로그램 수정하기가 좋음. - (이거 다 설명하려면 하루종일 걸림…) - (자세한건 구글신님께 물어보시면 잘알려줘요.)
  70. 70. Google Developers Group #Incheon ArticleRepository 객체
 어떻게 만들 수 있을까?
  71. 71. Google Developers Group #Incheon Container Database Connec>on Ar>cleRepository GrammarInterfaceMySqlGrammar
  72. 72. $articleRepo = new ArticleRepository( new Database( new Connection, new MySqlGrammar() ) );
  73. 73. Google Developers Group #Incheon Container - 이걸 언제 다 할텐가. - 컨테이너를 사용하자. - 그래서, 각 객체에 대해서 생성 방식만 정의하자.
  74. 74. // GrammarInterface를 요청하면 MySqlGrammar를 반환
 $container->bind(GrammarInterface::class, MySqlGrammar::class);
 
 // Database 생성규칙
 $container->closure(Database::class, function ($app) {
 return new Database($app[Connection::class], $app[GrammarInterface::class]);
 });
 
 $articleRepo = $container->create(ArticleRepository::class);
  75. 75. Google Developers Group #Incheon Container? - 요즘 나온 프레임워크를 구성하는 기본단위. - 클래스를 생성하고 의존관계를 관리함. - 생성한 객체를 보관. - 의존성을 자동으로 해결해주기 때문에 비지니스 로직에 집중 가 능.
  76. 76. Google Developers Group #Incheon Container? - Android - Dagger - Spring
  77. 77. Google Developers Group #Incheon Container의 기능 - Auto Resolve : 의존성 자동 해결 - Auto Wiring : Annotation을 통해 객체 내부 변수에 직접 변 수 할당 - 현대 프레임워크에는 왠만하면 다 구현되어있음.
  78. 78. Google Developers Group #Incheon PHP Container Package - Pimple - Wandu Container - Laravel Container (단독으로 사용하기 어려움)
  79. 79. Google Developers Group #Incheon Framework
  80. 80. Google Developers Group #Incheon 잠깐 하소연.. - Ruby on Rails vs Python Django vs PHP
  81. 81. Google Developers Group #Incheon 잠깐 하소연.. - Ruby on Rails vs Python Django vs PHP - Ruby on Rails vs Python Django vs PHP Laravel
  82. 82. Laravel
  83. 83. Google Developers Group #Incheon Laravel - PHP에서는 가장 Hot 한 프레임워크.
  84. 84. Google Developers Group #Incheon Laravel - Full Stack Framework. - MVC Pattern. - MIT License.
  85. 85. Google Developers Group #Incheon Laravel 주요 기능 - Active Record 방식의 ORM 제공. - 가상 개발환경 Homestead 제공. - Front End Build 도구인 Elixir 제공. (Sass, Babel …) - Social Login 92개 제공. (Socialite) - Storage 지원. (Amazon S3, Rackspace …) - Queue 지원. (Beanstalkd, Amazon SQS, Redis …) - Mail 지원. (Mailgun, Mandril, Amazon SES …)
  86. 86. Google Developers Group #Incheon 그외에도 모던한 Framework - Full stack Framework - Symfony, Phalcon, League, Wandu … - Micro Framework - Slim, Lumen …
  87. 87. Google Developers Group #Incheon 결론
  88. 88. Google Developers Group #Incheon PHP 생각보다 나쁘지 않다.
  89. 89. Google Developers Group #Incheon 더 궁금하다면? - ModernPHP - Josh Lockhart 저, 정병열 역 - 한빛미디어
  90. 90. Google Developers Group #Incheon 더 궁금하다면? - Modern PHP User Group - www.modernpug.org - PHP : The Right Way 한글판 - modernpug.github.io/php-the-right-way - Composer 한국어 메뉴얼 - xpressengine.github.io/Composer-korean-docs
  91. 91. Google Developers Group #Incheon 광고 - Modern 한 프레임워크가 개발하고 싶다면.. - github.com/wandu
  92. 92. Google Developers Group #Incheon Q & A
  93. 93. Google Developers Group #Incheon 끝

×