티스토리 뷰


Laravel 의 새로운 major 버전인 5.6 버전이 한국시간 2018-02-08 새벽 0시 36분에 Release 되었습니다. 이번 버전에는 어떠한 변경사항들이 있는지 살펴보도록 하겠습니다. 모든 변경사항은 changelog(Github) 를 참고하시기 바랍니다.


또한 5.6 버전으로 업데이트를 하실 경우 Laravel 공식 홈페이지에 있는 마이그레이션 가이드를 참고하시기 바랍니다.

PHP 지원 버전 변경


Laravel 5.6 버전부터는 PHP 7.1.3 버전 이상만 지원하도록 변경되었습니다. 지난 Laravel 5.5 버전부터 PHP 7 버전 이상부터 지원하도록 변경되었으며, 버전 변경 이유는 뒤에 소개하겠지만 의존하는 sympony 프레임워크의 버전업데이트로 발생한듯 합니다.

의존성 패키지 변화


Laravel 프레임워크는 여러 패키지 의존하여 만들어졌습니다.

- Symfony ~4.0

대표적인 의존성 패키지로 Symfony 프레임워크가 있습니다. Laravel 에서 사용하는 Symfony 버전이 ~4.0 으로 변경되었습니다. 이러한 이유로 Laravel 5.6 으로 마이그레이션을 하실 때 프로젝트에서 Symfony 프레임워크를 직접 포함시켜 사용하고 있다면 버전을 변경해야합니다. Symfony 프레임워크 4.* 의 자세한 변경사항은 링크에서 확인가능합니다.

- PHPUnit ~7.0

PHPUnit 은 프레임워크에 상관없이 많은 프로젝트에서 테스트를 위해 사용하고 있습니다. Laravel 5.6 부터는 phpunit ~7.0 버전을 사용합니다.

- cron-expression ~2.0

cron-expression 은 PHP 에서 Crontab 설정을 읽어 이전에 실행한 시간과 다음에 실행될 시간을 계산하여 Cron의 실행여부 등을 판단 할 수 있도록 도와주는 패키지입니다. Laravel 에서 사용되던 cron-expression 이 1.* -> 2.* 으로 변경되었습니다.


그외에 Laravel 에서 관리하는 패키지들의 버전 변경사항이 아래와 같이 발생되었습니다.


- Dusk (~3.0 로 업그레이드)

- Passport (~5.0 로 업그레이드)

- Scout (~4.0 로 업그레이드)

Artisan Command


Laravel 에서 제공되는 Artisan 명령어에도 일부 변경사항이 있습니다.

- optimize 커맨드 삭제

아래의 그림처럼 Laravel 5.4 까지 존재하던 optimize 커맨드가 5.5 에서 deprecated 되었으며, 5.6 에서 완전히 삭제되었습니다.


만약 위와 같이 composer.jsonphp artisan optimize 명령어가 포함되어 있으면 삭제를 하셔야합니다.

- make:controller 커맨드에 --api 옵션 추가

controller 생성 커맨드에 --api 옵션이 추가되었습니다. 이전에 사용되던 --resource 옵션 대신 생겼으며, 해당 옵션으로 생성시 아래와 같이 controller가 생성됩니다.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ApiController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}

Blade


Blade 는 라라벨에서 제공되는 View 용 template 입니다. Blade 는 총 3가지의 변경사항 있습니다.

- @csrf / @method directive 추가

Laravel 5.5 까지는 제공되는 csrf 토큰과 form 전송시 hidden 값으로 method 명을 보내기 위해 아래와 같이 사용했었습니다.

<form>
  {{ csrf_field() }}
  {{ method_field('PUT') }}
  <!-- ... -->
</form>
하지만 Laravel 5.6 부터는 아래와 같이 사용이 가능합니다.

<form>
  @method('put')
  @csrf
  <!-- ... -->
</form>

- component aliases 추가

컴퍼넌트를 쉽게 불러올 수 있도록 별칭기능이 추가되었습니다. resources/views/components/alert.blade.php 에 Blade 파일이 존재할때 AppServiceProviderboot 메서드 안에 아래와 같이 작성할 경우 components.alertalert 지정하여 불러올 수 있습니다.

Blade::component('components.alert', 'alert');
지정된 별칭을 이용하여 렌더링이 가능합니다.

@component('alert')
    You are not allowed to access this resource!
@endcomponent
// 혹은 component 안에 slot 이 없는 경우는 아래와 같이 directive로 사용이 가능합니다.
@alert
    You are not allowed to access this resource!
@endalert

- double_encode 기본값 true 로 변경

`e` helper method 와 Blade 표현식에서 htmlspecialchars 함수 double_encode 설정의 기본값을 false에서 true 로 변경하였습니다. 이 내용은 이중 인코딩이 된다는 의미이며, 아래의 코드를 보시면 htmlspecialchars 함수의 double_encode 값에 따라 어떻게 인코딩되는지 확인 가능합니다.

만약 이전버전 처럼 double encode 를 안하길 원하면 서비스프로바이더에 아래와 같이 Blade::withoutDoubleEncoding()를 실행시켜주시면 됩니다.

<?php

namespace App\Providers;

use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Blade::withoutDoubleEncoding();
    }
}

Logging


이번 Laravel 5.6 변경사항 중 가장 큰 변경사항이라고 생각듭니다.  laravel/framework 에서 Log 디렉토리를 살펴보면 아래와 같이 버전간의 차이점이 존재합니다.


5.5


5.6

- config/logging.php 추가

Laravel 5.5 까지 log에 대한 설정은 config/app.php 위치에 있는 log 와 log_level 설정뿐이였습니다. Laravel 5.6 부터는 config/logging.php 파일로 별도로 설정하도록 변경되었습니다. logging.php 파일은 기본적으로 다음과 같습니다.


- Illuminate\Log\Writer 클래스 변경

Illuminate\Log\Writer 클래스가 Illuminate\Log\Logger 클래스로 변경되었습니다. 만약 기존에 Writer 클래스를 Type Hint로 사용하고 있었다면 Psr\Log\LoggerInterface 클래스로 변경하셔야합니다.

- Illuminate\Contracts\Logging\Log Interface 제거

Illuminate\Contracts\Logging\Log Interface 가 제거되었습니다. 만약 기존에 Log InterfaceType Hint 로 사용하고 있었다면, Psr\Log\LoggerInterface 클래스로 변경하셔야합니다.

Argon2i 암호 Hash 기능 추가


Argon2 은 2015 년 PHC(Password Hashing Competition) 우승 알고리즘입니다. Argon2 은 아래의 3가지 버전이 존재한다고 합니다.


- Argon2d : GPU 크래킹 공격에 초첨을 맞춘 버전입니다.

- Argon2i : 측면 채널 공격에 저항 할 수 있도록 최적화되어 있습니다.

- Argon2id : Argon2dArgon2i 의 하이브리드 버전입니다.


2017 년 11월 Release 된 PHP 7.2Argon2dArgon2i 가 추가되었으나, Laravel 5.6 에서는 Argon2d 가 Password Hash 기능으로는 적합하지 않아 Argon2i 만 Password Hash 기능으로 추가되었다고 합니다.


Argon2 Hash 를 사용할려면 새로 추가된 config/hashing.php 에서 설정을 변경하시면 됩니다.


그외의 변경사항들


그 외에 여러가지 변경사항이 존재합니다. 자세한 사항은 Laravel CHANGELOGLaravel 5.6 Upgrade Guide 그리고 Laravel News 에서 확인 가능합니다.



댓글