728x90
반응형

Homestead 는 라라벨 버전 4.2부터 공식적으로 지원하는 방식으로 가상 머신 기반하에 개발 환경을 구성할 수 있게 해주는 vagrant를 이용하여 라라벨 개발 환경을 만들수 있도록 한 프로젝트입니다.

 

그러면 vagrant 란 무엇인지 간략하게 알아보고 Homestead 를 구성하는 방법에 대해서 알아봅시다.


Vagrant 란

가상화(Virtualization)는 실제 운영체제 위에 가상화 소프트웨어를 설치한 후에 소프트웨어를 통해 하드웨어(CPU, Memory, Disk, NIC 등)를 에뮬레이션한 후에 이 위에 운영체제(Guest OS)를 설치하는 것을 의미합니다. 가상화를 해 주는 소프트웨어를 하이퍼바이저(Hypervisor) 라고 하며 종류로는 이 책에서 사용하는 VirtualBox, 그리고 VMWare, Xen 등이 있습니다.

하이퍼바이저를 설치하는 실제 운영체제(윈도, OS X, 리눅스 등)를 호스트(Host) OS 라 하고 하이퍼바이저 위에 만든 가상 머신에 설치된 운영체제를 게스트 OS 라고 부릅니다.

 

 

가상화는 다양한 운영체제와 애플리케이션을 논리적으로 분리할 수 있으므로 여러 운영제체와 애플리케이션을 구동하는 개발 환경등 복잡한 환경을 추상화할 수 있는 좋은 방법이지만 가상 머신을 통해 개발환경을 구성하려면 부딪히는 중요한 문제가 있습니다.

가상 머신에 운영체제를 설치하고 웹 서버, DBMS, PHP 를 설치하는 것은 개발 환경 구성 대상이 PC 에서 가상 머신으로 옮겨졌을 뿐이지 기존 작업과 난이도 측면에서 차이가 없으며 오히려 가상 머신을 설치하고 관리해야 하는 부담이 더 늘었습니다.

다음 그림에서 보이는 가상화 부분에 해당하는 하이퍼바이저 설치, 운영체제(Guest OS) 설치, 애플리케이션 설치 및 설정은 모든 개발자가 다 똑같이 해줘야 하는 작업입니다.

가상화의 개념

 

Vagrant 는 이런 문제를 해결하기 위한 솔루션으로 설정 스크립트를 기반으로 특정 환경의 가상 머신을 만들어서 신속하게 개발 환경을 구축하고 공유할 수 있게 만들어진 솔루션입니다.

 

Vagrant 는 VirtualBox, VMWare 등을 지원하고 있으나 VMWare 에서 사용하려면 별도의 드라이버를 구매해야 하므로 이 책에서는 VirtualBox 를 기반으로 라라벨 개발 환경을 구성하겠습니다.

이 책에서는 VirtualBox 5.0.4, Vagrant 1.7.4, git 1.9.5 를 사용하였습니다.

 

홈스테드(Homestead)는 vagrant 의 설정 스크립트를 사용하여 라라벨 애플리케이션을 작성하는데 필요한 모든 구성 요소를 자동으로 설치하는 프로젝트로 홈스테드를 사용하면 가상 머신에 다음과 같이 우분투 운영체제, 웹서버, DBMS, PHP 스택이 자동으로 설치 및 설정이 완료됩니다.

  • Ubuntu 14.04
  • PHP 7.0
  • Git 1.9
  • HHVM (HipHop Virtual Machine) 3.11
  • Nginx 1.9
  • MySQL 5.7
  • Postgres
  • Node (With PM2, Bower, Grunt, and Gulp)
  • Redis
  • Memcached
  • Beanstalkd
  • Laravel Envoy
  • Blackfire Profiler

 

 
홈스테드

윈도 사용자는 VirtualBox 를 사용하려면 하드웨어 가상화(인텔의 경우 VT-x, AMD 는 AMD-V) 를 활성화 시켜야 합니다. 하드웨어 가상화 활성화는 바이오스에서 설정할 수 있습니다.


출처 : https://www.lesstif.com/display/LIFE

728x90
반응형
728x90
반응형

웹 어플리케이션을 만들기 위해서는 프로그래밍 언어와 웹(Web) 서버 또는 WAS(Web Application Server), 그리고 데이타를 저장하고 처리하기 위한 DBMS가 필요합니다.

오픈 소스를 사용하여 웹 개발 프로젝트를 진행할 때 가장 많이 사용되는 웹 서버는 Apache HTTP 서버이며 DBMS는 MySQL, 그리고 프로그래밍 언어인 PHP 의 앞 글자를 따서 AMP 라고 부르며

맨 앞에서 사용하는 OS 의 첫 단어를 붙여서 구분하기도 합니다.


예를 들어 리눅스(Linux)에서 Apache http, MySQL, PHP 를 사용할 경우 LAMP 이며 윈도(Windows) 에서는 WAMP 라고 부릅니다.


라라벨 5는 최신 PHP 의 기능을 사용하므로 5.5.9 이상의 PHP 가 필요하며 다음 표와 같은 PHP 확장 모듈이 설치되어 있어야 하며 DBMS 를 사용할 경우 PDO 모듈과 해당 DBMS 의 PDO 드라이버(PDO_MYSQ, PDO_PGSQL 등)가 설치되어 있어야 합니다.

PHPPHP >= 5.5.9
Extension


Mcrypt
OpenSSL 
Mbstring 
tokenizer
라라벨 요구사항

특히 PHP 5.5 부터는 PHP 코드를 byte 코드로 컴파일하여 메모리에 캐싱하는 제품인 Zend opcache 가 정식 포함되어 있으므로 5.5 이상 버전을 사용하는 것이 좋습니다.


하지만 웹 서버, DBMS, PHP 를 기반으로 개발 환경을 설정하는 것은 경험이 많지 않다면 매우 시간이 많이 들고 귀찮은 작업입니다.


개발자마다 다른 OS를 사용할 수도 있고 같은 OS라 하더라도 버전이 다를수 가 있습니다. 사용할 수 있는 웹 서버는 아파치 웹 서버와 엔진엑스 크게 두 제품이 있으며 아파치의 경우 2.2와 2.4의 설정 문법이 다른 부분이 많습니다. 

또 개발자의 PC 에 기존에 수행했던 프로젝트가 특정 버전의 PHP 나 특정 버전의 MySQL 을 사용해서 새로 설치하는게 부담스러울 수도 있습니다.


이런 다양하고 복잡한 환경을 넘어설 수 있는 가장 좋은 방법중에 하나는 바로 가상 머신위에 개발 환경을 꾸미는 것입니다. 



출처 : https://www.lesstif.com/display/LIFE

728x90
반응형
728x90
반응형

작성한 소프트웨어를 테스트 하는 것은 조기에 문제를 식별하고 최소의 비용으로 해결하기 위한 중요한 프로세스입니다.

 

하지만 PHP 로 개발할 경우 단위 테스트(unit test)나 기능 테스트(function test)는 어려워서 별도로 하지 못했고 웹 브라우저를 통해 웹 사이트의 메뉴별 기능을 직접 테스트 하는 경우가 많았습니다.

잘 실행되면 상관없지만 에러가 발생할 경우 어느 단계에서 발생한 문제인지 원인을 찾고 해결하는데 많은 시간을 쏟아야 했습니다.

 

예를 들어 쇼핑몰에서 사용자의 구매 목록을 표시해 주는 기능을 테스트할 경우 다음과 같은 프로세스에서 출력된 화면이 이상하다고 가정해 보겠습니다.

업무 흐름 예제

이 경우 화면 출력 기능이 이상일수도 있지만 그전 프로세스에서 문제가 발생한 게 화면 출력 단계로 전이되었을 수 있습니다. 단위 테스트가 작성되어 있지 않다면 매번 브라우저로 연결하여 위 단계를 수행하면서 테스트를 진행해야 합니다.

 

각 단계별로 분리하여 단위 테스트를 할수 있다면 각각의 개별 프로세스를 분리하여 테스트를 하면 원인을 좁힐 수 있고 이를 통해 조기에 조치가 가능해 질 것입니다.

 

PHP 세계에도 PHPUnit 이라는 훌륭한 단위 테스트 프레임워크가 존재하지만 이를 설치하고 테스트 케이스를 만들고 테스트 하는 것은 익숙한 개발자가 아니면 힘들었습니다.

 

라라벨은 PHPUnit 과 유기적으로 통합되어 있으며 단위 테스트를 할 수 있도록 편리한 기능과 템플릿을 제공하고 있으므로 손쉽게 단위 테스트를 만들고 실행할 수 있게 도와줍니다.

 

테스팅 프로세스가 잘 정착되면 코드가 변경되어 형상 관리에 커밋될 때마다 자동으로 단위 테스트를 실행하고 검증되었을 경우 다른 환경에 배포하는 등 개발과 변경 업무를 자동화할 수 있는 기반이 됩니다.

 

이제부터는 라라벨 프레임워크를 사용하기 위한 환경 구성에 대해서 알아 보겠습니다.


출처 : https://www.lesstif.com/display/LIFE

728x90
반응형
728x90
반응형

다양한 언어의 사용자들을 대상으로 웹 애플리케이션을 개발할 경우 국제화(Internationalization, i18n) 를 고려한 설계와 개발이 필요합니다.

 

국제화시 중요한 부분중에 하나는 사용하는 언어와 환경에 맞게 다양한 언어로 서비스를 제공하는 것입니다.

라라벨은 이를 위해 locale 환경 변수를 설정하고 번역된 메시지 파일을 만들어 주면 설정된 언어에 맞는 메시지 파일을 로딩하여 다개국어 애플리케이션을 제공할 수 있도록 지원하고 있습니다.

 

개발자는 다음과 같이 언어별 메시지 파일(기본 설정 - resources/lang/en/) 을 언어명(한글의 경우 ko) 폴더에 복사한 후에 해당 파일을 수정하면 되며 언어별 메시지 파일은 전 세계의 다양한 공헌자들에 의해 번역되어 있습니다.

/resources
 /lang
    /en
      messages.php 
    /ko 
      messages.php

 

예를 들어 프랑스어로도 서비스를 제공할 경우 검증 실패시 표시할 메시지 파일을 resources/lang/fr/messages.php 에 만들고 번역한 내용을 key/value 형식의 배열로 기술해 주면 되며 해당 메시지는 Lang::get($key) 메소드, 또는 이를 간략화된 trans($key) 메소드를 사용하여 로딩할 수 있습니다.

 

다음은 정해진 사이즈보다 큰 데이타가 입력되었을 경우 에러 메시지를 로딩하는 예제입니다.

public function getMaxFailedMessage()
{
    return Lang::get('messages.max.numeric', ['max'=>50'attribute' => 'username']);
}

실제 에러 메시지는 resources/lang/fr/messages.php 파일에 다음과 같이 배열로 기술되어 있으므로 언어별로 손쉽게 관리할 수 있으며 신규 언어가 필요할 경우 해당 메시지 파일만 번역하면 됩니다.

<?php
     
return [
    'max'                  => [
        'numeric' => 'The :attribute may not be greater than :max.',
    ],
];

메시지 파일중 런타임에 변경되어야 하는 부분이 있으므로 이는 위치 표시기(place-holders) 를 통해 지원하고 있으며 표시기는 :뒤에 속성 이름을 넣어주면 되며 위에서는 :max 와 :attribute 가 런타임에 동적으로 변경될 파라미터가 되며 최종 에러 메시지는 다음과 같이 변환됩니다.

The username may not be greater than 50.


출처 : https://www.lesstif.com/display/LIFE

728x90
반응형
728x90
반응형

초기의 PHP 는 사용자들의 요구에 맞게 다양한 C 라이브러리를 언어에 포함시켰으며 C 라이브러리 사용자를 고려하여 함수 이름 일치, 파라미터의 순서 일치등 최대한 호환성 확보에 노력을 기울였습니다.

 

이런 점은 기존 C 라이브러리 사용자들이 쉽게 PHP 에 적응할 수 있게 하는 장점이 있었지만 반대로 일관성이 없다는 단점을 만들게 되었습니다.

실제로 PHP 를 싫어하는 개발자들의 주요 이유중에 하나는 일관성 없는 문법과 라이브러리 사용이기도 합니다.

 

예로 html_entity_decode 함수와 쌍을 이루는 함수는 htmlentities 이며 문자를 소문자로 바꾸는 함수는 to 를 사용하여 strtolower이지만 헥사 문자열을 바이너리로 바꾸는 함수는 hex2bin 입니다.

파일이 있는지 확인하는 함수는 file_exist 이지만 파일을 여는 함수는 fopen 입니다.

 

이런 일관성 결여는 PHP 를 사용할 때 개발자를 혼란스럽게 하고 생산성이 떨어지며 자주 쓰지 않는 함수를 사용할 경우 매번 매뉴얼을 찾게 만들고 코딩 실수를 유발하는 원인이 되었습니다.

 

라라벨은 기존 PHP 함수에 대해 일관성있는 이름의 래퍼를 제공하고 기능을 확장 시켰습니다. 예로 파일 시스템을 다루는 함수는 Storage 클래스에 통합하고 이를 통해 파일이 로컬에 있든 아마존 클라우드에 있든 상관없이 일관성있게 사용할 수 있습니다.

<?php
// 아마존 S3 클라우드 디스크 객체 반환
$s3disk = Storage::disk('s3');
 
// 로컬 디스크 객체 반환
$localDisk = Storage::disk('local');
  
// 로컬 디스크에서 file.jpg 존재 여부 확인
$exists = $localDisk ->exists('file.jpg');
  
// 아마존 스토리지 파일의 마지막 변경 일시 확인
$time = $s3disk->lastModified('file1.jpg');

 

또 사용할 때마다 혼란스러운 PHP 의 배열에 대해서 헬퍼 함수를 제공하고 있으므로 편리하게 사용할 수 있습니다. 기존 PHP 에서 배열에 요소를 추가할 경우 array_push() 를 사용하지만 key/value 구조를 바로 넣을 수는 없습니다.

array_add1.php
1
2
3
4
5
6
7
<?php
$array = ['foo' => 'bar'];
  
// 배열에 key => value 형식으로 요소 추가
array_push($array, 'key''value');
  
var_dump($array);

위 소스를 실행하면 의도와는 달리 key와 value 라는 값이 각각 배열의 요소로 들어간 것을 확인할 수 있습니다.

php array_add1.php

 

.array(3) {
'foo' =>
string(3) "bar"
[0] =>
string(3) "key"
[1] =>
string(5) "value"
}

의도대로 동작하도록 코딩하려면 $array['key'] = 'value';  구문을 사용해야 합니다. 

이렇게 배열에 요소를 추가할 경우 array_push 를 사용하지만 배열에 key/value 요소를 추가할 경우 다른 문법을 사용해야 하는 건 코딩의 일관성을 떨어뜨리고 코딩 실수를 유발할수 있는 문제가 있습니다.

 

라라벨은 PHP 의 기본 함수중 일관성이 떨어지는 함수들에 대해 헬퍼(Helper) 함수를 제공하고 있습니다.

배열내 키가 존재하지 않을 경우 요소를 추가하는 array_add 헬퍼를 제공하므로 배열에 요소를 추가할 경우 다음과 같이 일관성 있게 코딩할 수 있습니다.

<?php
  
$array = ['foo' => 'bar'];
/**
array:2 [
  "foo" => "bar"
  "key" => "value"
]
*/
$array = array_add($array, 'key''value');

 

클래스와 메소드에 대해서는 언더바(_) 를 지양하고 카멜케이스(camelCase) 를 권장하고 있으므로 이에 익숙해지면 다른 개발자와 협업이 쉬워지며 가독성있고 간결한 코드를 작성할 수 있으며 이를 통해 생산성을 높이고 버그 발생 가능성을 줄일 수 있습니다.


출처 : https://www.lesstif.com/display/LIFE

728x90
반응형

+ Recent posts