SlideShare uma empresa Scribd logo
1 de 94
Baixar para ler offline
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
2012 Composer Release
2013 PHP 5.5
2014 PHP 5.6
2015 PHP 7.0
…
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)
- hhvm.com
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
PHP 5.3/APC PHP 5.3 PHP 5.4 PHP 5.5 PHP 5.6 PHP 7 HHVM 3.5
requestspersecond
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
튜닝한다고 애쓰지말고, 버전을 올려요.
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
- PocketMine-MP : Pthreads
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 - Maven
Google Developers Group
#Incheon
PHP 패키지매니저
<?php

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

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

include_once '../../common/site.php';

include_once ‘../inc/starter.php';

익숙한 옛날 소스…
Google Developers Group
#Incheon
“include_once” 구문은 이제 그만..
Google Developers Group
#Incheon
“include”는 한번만 하면 돼요.
<?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에서 한번!
<?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);

}
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 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
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
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 ) )

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

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

{

/** @var GrammarInterface */

protected $grammar;



/** @var Connection */

protected $connection;



public function __construct()

{

$this->connection = new Connection();

$this->grammar = new MySqlGrammar(); 

}

}
class Database

{

/** @var GrammarInterface */

protected $grammar;



/** @var Connection */

protected $connection;



public function __construct(

Connection $connection,

GrammarInterface $grammar

) {

$this->connection = $connection;

$this->grammar = $grammar; 

}

}
의존성 주입
$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
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 생성규칙

$container->closure(Database::class, function ($app) {

return new Database($app[Connection::class], $app[GrammarInterface::class]);

});



$articleRepo = $container->create(ArticleRepository::class);
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
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 도구인 Elixir 제공. (Sass, Babel …)
- Social Login 92개 제공. (Socialite)
- Storage 지원. (Amazon S3, Rackspace …)
- Queue 지원. (Beanstalkd, Amazon SQS, Redis …)
- Mail 지원. (Mailgun, Mandril, Amazon SES …)
Google Developers Group
#Incheon
그외에도 모던한 Framework
- Full stack Framework
- Symfony, Phalcon, League, Wandu …
- Micro Framework
- Slim, Lumen …
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 한글판
- modernpug.github.io/php-the-right-way
- Composer 한국어 메뉴얼
- xpressengine.github.io/Composer-korean-docs
Google Developers Group
#Incheon
광고
- Modern 한 프레임워크가 개발하고 싶다면..
- github.com/wandu
Google Developers Group
#Incheon
Q & A
Google Developers Group
#Incheon
끝

Mais conteúdo relacionado

Mais procurados

파이콘 2017 그만퇴근합시다_이지호
파이콘 2017 그만퇴근합시다_이지호파이콘 2017 그만퇴근합시다_이지호
파이콘 2017 그만퇴근합시다_이지호Jiho Lee
 
[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱NAVER D2
 
처음 시작하는 라라벨
처음 시작하는 라라벨처음 시작하는 라라벨
처음 시작하는 라라벨KwangSeob Jeong
 
장고로 웹서비스 만들기 기초
장고로 웹서비스 만들기   기초장고로 웹서비스 만들기   기초
장고로 웹서비스 만들기 기초Kwangyoun Jung
 
Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나JeongHun Byeon
 
막하는 스터디 네 번째 만남 AngularJs (20151108)
막하는 스터디 네 번째 만남 AngularJs (20151108)막하는 스터디 네 번째 만남 AngularJs (20151108)
막하는 스터디 네 번째 만남 AngularJs (20151108)연웅 조
 
Resource Handling in Spring MVC
Resource Handling in Spring MVCResource Handling in Spring MVC
Resource Handling in Spring MVCArawn Park
 
Python 으로 Slackbot 개발하기
Python 으로 Slackbot 개발하기Python 으로 Slackbot 개발하기
Python 으로 Slackbot 개발하기성일 한
 
Tech Update - The Future of .NET Framework (김명신 부장)
Tech Update - The Future of .NET Framework (김명신 부장)Tech Update - The Future of .NET Framework (김명신 부장)
Tech Update - The Future of .NET Framework (김명신 부장)Eunbee Song
 
반복적인 코드 작업 자동화, Codebone으로 손쉽게
반복적인 코드 작업 자동화, Codebone으로 손쉽게반복적인 코드 작업 자동화, Codebone으로 손쉽게
반복적인 코드 작업 자동화, Codebone으로 손쉽게Sungju Jin
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기현철 조
 
Springcamp spring boot intro
Springcamp spring boot introSpringcamp spring boot intro
Springcamp spring boot introJae-il Lee
 
메이븐 기본 이해
메이븐 기본 이해메이븐 기본 이해
메이븐 기본 이해중선 곽
 
XECon2015 :: [1-3] 김덕홍 - Git Workflow with GitHub
XECon2015 :: [1-3] 김덕홍 - Git Workflow with GitHubXECon2015 :: [1-3] 김덕홍 - Git Workflow with GitHub
XECon2015 :: [1-3] 김덕홍 - Git Workflow with GitHubXpressEngine
 
201803 파이썬 세미나
201803 파이썬 세미나201803 파이썬 세미나
201803 파이썬 세미나JeongHwan Kim
 
Universal Rendering
Universal RenderingUniversal Rendering
Universal RenderingTaegon Kim
 
Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012Daum DNA
 
RESTful API 설계
RESTful API 설계RESTful API 설계
RESTful API 설계Jinho Yoo
 
[124] 하이브리드 앱 개발기 김한솔
[124] 하이브리드 앱 개발기 김한솔[124] 하이브리드 앱 개발기 김한솔
[124] 하이브리드 앱 개발기 김한솔NAVER D2
 

Mais procurados (20)

파이콘 2017 그만퇴근합시다_이지호
파이콘 2017 그만퇴근합시다_이지호파이콘 2017 그만퇴근합시다_이지호
파이콘 2017 그만퇴근합시다_이지호
 
[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱[114]angularvs react 김훈민손찬욱
[114]angularvs react 김훈민손찬욱
 
처음 시작하는 라라벨
처음 시작하는 라라벨처음 시작하는 라라벨
처음 시작하는 라라벨
 
장고로 웹서비스 만들기 기초
장고로 웹서비스 만들기   기초장고로 웹서비스 만들기   기초
장고로 웹서비스 만들기 기초
 
Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나Front-end Development Process - 어디까지 개선할 수 있나
Front-end Development Process - 어디까지 개선할 수 있나
 
막하는 스터디 네 번째 만남 AngularJs (20151108)
막하는 스터디 네 번째 만남 AngularJs (20151108)막하는 스터디 네 번째 만남 AngularJs (20151108)
막하는 스터디 네 번째 만남 AngularJs (20151108)
 
Resource Handling in Spring MVC
Resource Handling in Spring MVCResource Handling in Spring MVC
Resource Handling in Spring MVC
 
Python 으로 Slackbot 개발하기
Python 으로 Slackbot 개발하기Python 으로 Slackbot 개발하기
Python 으로 Slackbot 개발하기
 
Tech Update - The Future of .NET Framework (김명신 부장)
Tech Update - The Future of .NET Framework (김명신 부장)Tech Update - The Future of .NET Framework (김명신 부장)
Tech Update - The Future of .NET Framework (김명신 부장)
 
반복적인 코드 작업 자동화, Codebone으로 손쉽게
반복적인 코드 작업 자동화, Codebone으로 손쉽게반복적인 코드 작업 자동화, Codebone으로 손쉽게
반복적인 코드 작업 자동화, Codebone으로 손쉽게
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
 
Springcamp spring boot intro
Springcamp spring boot introSpringcamp spring boot intro
Springcamp spring boot intro
 
메이븐 기본 이해
메이븐 기본 이해메이븐 기본 이해
메이븐 기본 이해
 
XECon2015 :: [1-3] 김덕홍 - Git Workflow with GitHub
XECon2015 :: [1-3] 김덕홍 - Git Workflow with GitHubXECon2015 :: [1-3] 김덕홍 - Git Workflow with GitHub
XECon2015 :: [1-3] 김덕홍 - Git Workflow with GitHub
 
Django beginning
Django beginningDjango beginning
Django beginning
 
201803 파이썬 세미나
201803 파이썬 세미나201803 파이썬 세미나
201803 파이썬 세미나
 
Universal Rendering
Universal RenderingUniversal Rendering
Universal Rendering
 
Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012Javascript everywhere - Node.js | Devon 2012
Javascript everywhere - Node.js | Devon 2012
 
RESTful API 설계
RESTful API 설계RESTful API 설계
RESTful API 설계
 
[124] 하이브리드 앱 개발기 김한솔
[124] 하이브리드 앱 개발기 김한솔[124] 하이브리드 앱 개발기 김한솔
[124] 하이브리드 앱 개발기 김한솔
 

Semelhante a Modern PHP

PHP Slim Framework with Angular
PHP Slim Framework with AngularPHP Slim Framework with Angular
PHP Slim Framework with AngularJT Jintae Jung
 
2023 GDG Sondo DevFest - Flutter/ Flavor, PlatformChannel, Environment variab...
2023 GDG Sondo DevFest - Flutter/ Flavor, PlatformChannel, Environment variab...2023 GDG Sondo DevFest - Flutter/ Flavor, PlatformChannel, Environment variab...
2023 GDG Sondo DevFest - Flutter/ Flavor, PlatformChannel, Environment variab...MaRoKim4
 
N02 app engineseminar
N02 app engineseminarN02 app engineseminar
N02 app engineseminarSun-Jin Jang
 
자바_웹_개발자를_위한_c#_핵심_기능
자바_웹_개발자를_위한_c#_핵심_기능자바_웹_개발자를_위한_c#_핵심_기능
자바_웹_개발자를_위한_c#_핵심_기능Dexter Jung
 
Hoodpub 기술 발표
Hoodpub 기술 발표Hoodpub 기술 발표
Hoodpub 기술 발표Hyun-min Choi
 
오픈소스 개발참여한 이야기 (NIPA 오픈프론티어 3기 송태웅)
오픈소스 개발참여한 이야기 (NIPA 오픈프론티어 3기 송태웅)오픈소스 개발참여한 이야기 (NIPA 오픈프론티어 3기 송태웅)
오픈소스 개발참여한 이야기 (NIPA 오픈프론티어 3기 송태웅)Taeung Song
 
Eclipse RAP - Single Source
Eclipse RAP - Single SourceEclipse RAP - Single Source
Eclipse RAP - Single Sourcecho hyun jong
 
Vim for php
Vim for phpVim for php
Vim for phpSol Kim
 
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발Jinuk Kim
 
LetsSwift(강민규스피커,안정민서포터).pptx
LetsSwift(강민규스피커,안정민서포터).pptxLetsSwift(강민규스피커,안정민서포터).pptx
LetsSwift(강민규스피커,안정민서포터).pptxssuser2601f7
 
Progressive Web Apps
Progressive Web AppsProgressive Web Apps
Progressive Web Appsjungkees
 
20221131_레츠스위프트_2022_iOS개발에서_알아두면_좋은것들.pdf
20221131_레츠스위프트_2022_iOS개발에서_알아두면_좋은것들.pdf20221131_레츠스위프트_2022_iOS개발에서_알아두면_좋은것들.pdf
20221131_레츠스위프트_2022_iOS개발에서_알아두면_좋은것들.pdf정민 안
 
Angular2를 활용한 컴포넌트 중심의 개발
Angular2를 활용한 컴포넌트 중심의 개발Angular2를 활용한 컴포넌트 중심의 개발
Angular2를 활용한 컴포넌트 중심의 개발Jin wook
 
[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rd[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rdPark Jonggun
 
도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: Yeoman도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: YeomanJae Sung Park
 
웹 Front-End 실무 이야기
웹 Front-End 실무 이야기웹 Front-End 실무 이야기
웹 Front-End 실무 이야기JinKwon Lee
 
[OpenInfra Days Korea 2018] K8s workshop: Kubernetes for Beginner
[OpenInfra Days Korea 2018] K8s workshop: Kubernetes for Beginner[OpenInfra Days Korea 2018] K8s workshop: Kubernetes for Beginner
[OpenInfra Days Korea 2018] K8s workshop: Kubernetes for BeginnerOpenStack Korea Community
 

Semelhante a Modern PHP (20)

PHP Slim Framework with Angular
PHP Slim Framework with AngularPHP Slim Framework with Angular
PHP Slim Framework with Angular
 
2023 GDG Sondo DevFest - Flutter/ Flavor, PlatformChannel, Environment variab...
2023 GDG Sondo DevFest - Flutter/ Flavor, PlatformChannel, Environment variab...2023 GDG Sondo DevFest - Flutter/ Flavor, PlatformChannel, Environment variab...
2023 GDG Sondo DevFest - Flutter/ Flavor, PlatformChannel, Environment variab...
 
N02 app engineseminar
N02 app engineseminarN02 app engineseminar
N02 app engineseminar
 
요즘웹개발
요즘웹개발요즘웹개발
요즘웹개발
 
자바_웹_개발자를_위한_c#_핵심_기능
자바_웹_개발자를_위한_c#_핵심_기능자바_웹_개발자를_위한_c#_핵심_기능
자바_웹_개발자를_위한_c#_핵심_기능
 
Hoodpub 기술 발표
Hoodpub 기술 발표Hoodpub 기술 발표
Hoodpub 기술 발표
 
오픈소스 개발참여한 이야기 (NIPA 오픈프론티어 3기 송태웅)
오픈소스 개발참여한 이야기 (NIPA 오픈프론티어 3기 송태웅)오픈소스 개발참여한 이야기 (NIPA 오픈프론티어 3기 송태웅)
오픈소스 개발참여한 이야기 (NIPA 오픈프론티어 3기 송태웅)
 
Eclipse RAP - Single Source
Eclipse RAP - Single SourceEclipse RAP - Single Source
Eclipse RAP - Single Source
 
Vim for php
Vim for phpVim for php
Vim for php
 
(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
(스프링프레임워크 강좌)스프링부트개요 및 HelloWorld 따라하기
 
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발
NDC13: DVCS와 코드리뷰 그리고 자동화를 통한 쾌속 개발
 
LetsSwift(강민규스피커,안정민서포터).pptx
LetsSwift(강민규스피커,안정민서포터).pptxLetsSwift(강민규스피커,안정민서포터).pptx
LetsSwift(강민규스피커,안정민서포터).pptx
 
Progressive Web Apps
Progressive Web AppsProgressive Web Apps
Progressive Web Apps
 
20221131_레츠스위프트_2022_iOS개발에서_알아두면_좋은것들.pdf
20221131_레츠스위프트_2022_iOS개발에서_알아두면_좋은것들.pdf20221131_레츠스위프트_2022_iOS개발에서_알아두면_좋은것들.pdf
20221131_레츠스위프트_2022_iOS개발에서_알아두면_좋은것들.pdf
 
Introduce php7
Introduce php7Introduce php7
Introduce php7
 
Angular2를 활용한 컴포넌트 중심의 개발
Angular2를 활용한 컴포넌트 중심의 개발Angular2를 활용한 컴포넌트 중심의 개발
Angular2를 활용한 컴포넌트 중심의 개발
 
[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rd[IoT] MAKE with Open H/W + Node.JS - 3rd
[IoT] MAKE with Open H/W + Node.JS - 3rd
 
도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: Yeoman도구를 활용한 더 나은 웹 개발: Yeoman
도구를 활용한 더 나은 웹 개발: Yeoman
 
웹 Front-End 실무 이야기
웹 Front-End 실무 이야기웹 Front-End 실무 이야기
웹 Front-End 실무 이야기
 
[OpenInfra Days Korea 2018] K8s workshop: Kubernetes for Beginner
[OpenInfra Days Korea 2018] K8s workshop: Kubernetes for Beginner[OpenInfra Days Korea 2018] K8s workshop: Kubernetes for Beginner
[OpenInfra Days Korea 2018] K8s workshop: Kubernetes for Beginner
 

Modern PHP