98호. 라라벨 6.6.x 새 기능 free

2019-12-19


안녕하세요. 오늘은 라라벨 6.6.x에 새로 추가된 기능을 알아보도록 하겠습니다.


6.6.0에 추가된 기능


데이터베이스에 존재하는지 검사하는 유효성 검사 규칙에 모델 사용 가능


exists 유효성 검사 규칙을 사용하면 데이터베이스에 존재하는 값인지 확인할 수 있습니다. 기존까지는 테이블명을 사용했는데요, 테이블명 대신 모델을 사용할 수 있게 됐습니다.


'user_id' => 'exists:App\User,id'

unique 규칙에도 사용할 수 있습니다.


'user_id' => 'required|unique:'.User::class.',id'

테이블명이 바뀌어도(발생할 가능성이 낮지만 ^^) 유효성 검사 규칙을 수정하지 않아도 되는 장점이 있다고 합니다.


응답에 first view 기능 추가


View에 사용 가능한 첫번째 뷰를 반환하는 first() 매서드가 있습니다.


return view()->first(['my/view1', 'my/view2'], ['data']);

response()->view()도 first() 매서드와 같은 기능을 할 수 있도록 허용했습니다. 첫 번째 파라미터로 문자열을 넘겨주면 기존과 같은 방식으로 동작하고, 배열을 넘겨주면 first()와 같은 방식으로 동작합니다.


return response()->view(['my/view1', 'my/view2'], ['data'], 404, ['headers']);

또한 명확하게 구분해서 쓰고 싶어하는 사람들을 위해 ResponseFactory에 viewFirst() 매서드도 추가했다고 하네요.


return response()->viewFirst(['my/view1', 'my/view2'], ['data'], 404, ['headers']);

데이터베이스 테스트에 assertDeleted 추가


기존에는 assertDatabaseMissing()을 이용해서 삭제됐는지를 확인했는데


$this->assertDatabaseMissing('posts', [
'id' => $post->id
]);

삭제 확인 전용 매서드가 추가되었습니다. 기본 매서드 시그니처는 테이블을 이용하도록 되어 있지만


$this->assertDeleted($table, array $data);	

첫 번째 파라미터에 모델을 넘겨서 더 쉽게 사용할 수도 있습니다.


public function testDatabase()
{
$user = factory(App\User::class)->create();

// Make call to application...

$this->assertDeleted($user);
}

라우터에 head() 매서드 추가


HTTP HEAD 요청을 보내는 Route::head()를 사용할 수 있게 되었습니다.


wherePivotNotIn, orWherePivotNotIn 매서드 추가


기존에는 wherePivotNotIn과 같은 결과를 얻어오기 위해 아래와 같은 코드를 사용했다고 합니다.(매뉴얼에는 안나와요.)


$post->wherePivotIn('flag',['foo','bar'],'and',true);

위의 코드를 내부에서 호출하는 wherePivotNotIn() 매서드를 추가했다고 하네요. orWherePivotNotIn()도 추가했고요.


SqlServerConnector에 Azure Key 볼트로 암호화하는 옵션 추가


내곧제.


6.6.1에 추가된 기능


커맨드의 인풋, 아웃풋 핸들러를 덮어쓸 수 있게 됨


Illuminate\Console\CommandsetInput()setOutput() 매서드를 이용하면 됩니다. 테스트 할 때 목킹하는 것보다 더 편리할 수 있다고 하네요.


6.6.2에 추가된 기능


파사드를 부분 목킹 할 수 있게 됨


목은 사용될 모든 매서드를 선언해야하는 단점이 있습니다.


SomeService::shouldReceive('foo')->once();
SomeService::foo();
SomeService::bar();

그래서 일부만 목킹을 하고 나머지는 원래대로 사용하는 부분 목킹(partial mocking)을 사용하는데요. 이전에도 문서에는 없지만 부분 목킹하는 방법이 있었다고 합니다. 아래와 같이 makePartial()을 이용하면 됩니다.


SomeService::shouldReceive('foo')->once();
SomeService::makePartial();
SomeService::foo(); // this call is mocked
SomeService::bar(); // this call is deferred to it's parent

아래와 같이 사용할 순 없었다고 해요.


SomeService::makePartial()->shouldReceive('foo')->once(); // Error : Call to undefined method SomeService::makePartial()

이 업데이트로 partialMock() 매서드가 추가되었는데, 전 보다 좀 더 유연하게 부분 목킹을 할 수 있게 되었습니다. 아래 두 가지 방법을 모두 허용합니다.


SomeService::shouldReceive('foo')->once();
SomeService::partialMock();
SomeService::foo(); // this call is mocked
SomeService::bar(); // this call is deferred to it's parent

SomeService::partialMock()->shouldReceive('foo')->once();
SomeService::foo(); // this call is mocked
SomeService::bar(); // this call is deferred to it's parent

IDE 지원도 더 잘된다고 하네요.


Queued 이벤트 리스너에 retryAfter 옵션 추가


retryAfter 옵션으로 재시도를 원하는 시간 동안 지연시킬 수 있게 됐습니다. 이미 잡과 노티피케이션, 메일러블(Mailable)에는 추가되어 있던 옵션이라고 하네요. retryAfter 속성에 초 단위로 시간을 입력하면 됩니다.


public $retryAfter = 10;

마치며


원래는 6.6.0에만도 추가된 기능이 네 개나 되서 6.6.0만 정리하려 했는데, 6.6.1, 6.6.2에 내용이 많지 않아서 한꺼번에 정리해봤습니다. 새 기능 정리할 때마다 느끼는 거지만 기존 기능 중에 모르고 있는 기능이 참 많아요 ㅠ


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


1일 1식 라라벨 98호

2019년 12월 19일


이현석

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