97호. 라라벨 6.5.x 새 기능 free

2019-12-18

안녕하세요! 오늘은 6.8이 릴리즈 됐네요. 어서어서 따라잡아야 겠습니다. 오늘은 6.5.0, 6.5.1, 6.5.2에 추가된 기능을 한꺼번에 소개합니다.


6.5.0 새 기능


LazyCollection에 remember() 매서드 추가


레이지 컬렉션에서 remember()를 호출하면 한 번 DB에서 가져온 데이터는 기억하고 있다가 다시 DB에 요청하지 않습니다.


예제 1


$users = User::cursor()->remember();

// 아직 아무 쿼리도 실행되지 않음.

$users->all();

// 모든 값을 DB에서 가져옴.

$users->all();

// DB를 다시 조회하지 않고 캐시에서 데이터를 가져옴.

예제 2


$users = User::cursor()->remember();

// 아직 아무 쿼리도 실행되지 않음.

$users->take(5)->all();

// 쿼리가 실행되고 처음 5명의 유저를 DB에서 가져옴.

$users->take(20)->all();

// 처음 5명의 유저는 캐시에서 가져오고, 나머지는 DB에서 가져옴.

Str 헬퍼에 afterLast(), beforeLast() 매서드 추가


마지막으로 나타난 위치를 기준으로 그 이전 값을 반환하는 beforeLast()와 그 이후 값을 반환하는 afterLast()가 Str 헬퍼에 추가되었습니다.


$type = 'App\Notifications\Tasks\TaskUpdated';
Str::afterLast($type, '\\'); // TaskUpdated

$filename = 'photo.2019.11.04.jpg';
Str::beforeLast($filename, '.'); // photo.2019.11.04

쿼리빌더에 existsOr와 doesntExistOr 추가


쿼리 결과가 있거나 없을 때 임시 변수를 사용하지 않고 추가 행동을 연결해서 작성할 수 있게 되었습니다.


Before


$hasOpenDossier = $user->dossiers()
->whereNull('closed_at')
->exists();

if ($hasOpenDossier) {
abort(422, 'User already has an open dossier');
}

After


$user->dossiers()
->whereNull('closed_at')
->doesntExistOr(function () {
abort(422, 'User already has an open dossier');
});

Added LazyCollection::remember() method (#30443)

Added Str::afterLast() and Str::beforeLast() methods (#30507)

Added existsOr() and doesntExistOr() methods to the query builder (#30495)

Added unless condition to Blade custom if directives (#30492)


블레이드 커스텀 if 지시자에 unless 상태 추가


6.4.x 버전까지는 커스텀 if 지시자를 만들면 아래의 지시자만 사용할 수 있었습니다.



  • @custom

  • @elsecustom

  • @endcustom


반대의 경우를 확인하려면 아래와 같이 불필요한 코드를 작성해야했는데요.


@env('production')
@else
// production 환경이 아닌 경우 실행할 코드
@endenv

6.5.0 부터는 unless를 이용하여 아래와 같이 할 수 있게 되었습니다.


@unlessenv('production')
// production 환경이 아닌 경우 실행할 코드
@endenv

6.5.1 새 기능


includeUnless 지시자 추가


Before


@includeWhen(! $headless, 'dashboard/partials/nav')

After


@includeUnless($headless, 'dashboard/partials/nav')

6.5.2 새 기능


잡(Jobs) 모델 직렬화가 타입이 지정된 프로퍼티를 지원


PHP 7.4에 타입이 지정된 프로퍼티가 추가됨에 따라, 잡에서의 모델 직렬화가 이를 처리할 수 있게 바뀌었습니다.


파사드 루트 접근자가 이미 해석되어 있으면 이를 사용하도록 fallback 추가


냉무.


Postgres에 geometry와 geography 타입 구분 추가


죄송합니다. Postgres를 아직 안써봐서 뭔 말인지 잘 모르겠어요 ㅠ Postgres에 PostGis가 만들어주는 데이터 타입이 있는데, 이전에는 geometry와 geography를 구분하지 않고 썼었나봐요. 이번에 geography를 구분해서 사용할 수 있다고 하는 것 같습니다.


Postgres는 공간에 대한 데이터 타입도 지원하는구나 싶어 찾아보니 MySQL도 마찬가지로 지원하고 있네요. 이 글의 실험 결과는 공간 정보를 다루는데 있어서는 Postgres가 MySQL보다 10배 더 성능이 좋다고 합니다.


테스트용 파일 만들 때 내용을 넣어서 만드는 기능 추가


테스트용 가짜 파일을 만들 때 내용을 넣어서 만들 수 있도록 Illuminate\Http\Testing\FileIlluminate\Http\Testing\FileFactorycreateWithContent() 매서드를 추가했다고 합니다. 첫 번째 파라미터로 파일 이름, 두 번째 파라미터로 내용을 넘겨줍니다.


마치며


패치 업데이트에 새로운 기능 추가하지 말란 말야 후... 뭐 어쨋든 패치에 안들어갔어도 언젠가는 마이너 업데이트에 추가됐을거니 불평할 건 아니네요 ^^


오늘도 즐거운 하루 되세요!


1일 1식 라라벨 97호

2019년 12월 18일


이현석

메쉬 코리아 개발자. 바쁜 팀장님 대신 알려주는 신입 PHP 개발자 안내서를 쓰고, 클린 아키텍처 인 PHP를 번역했습니다. 2020년에 출간될 Laravel Up & Running 2nd Edition을 번역하고 있습니다.