Tick Tick Boom

시간이 다 가기 전에

개발/라라벨

tap, tap, tap

bbingle 2023. 9. 27. 13:54

Tap, Tap, Tap

회사에서 phppresentation 라이브러리를 이용해, 사용자의 요청에 따라 ppt를 생성해주는 플러그인을 구현하던 중, 사수중 한분의 코드리뷰를 받았다.
리뷰 내용은 $shape 객체를 연속적으로 생성하여 사용하는 코드 부분에서 tap 헬퍼를 사용하여 가독성을 높여보는게 좋겠다는 내용이었다.

그렇다면, tap헬퍼란 무엇일까

<?php

function tap($value, $callback){
    $callback($value);

    return $value;
}

tap 헬퍼는 라라벨에서 제공하는 헬퍼 함수중에 하나로, 다름아닌 오트웰 아저씨 (라라벨 창작자)가 가장 좋아하는 헬퍼 함수중에 하나라고 한다.

기능은 심플하게, argument 하나와 callback 함수 하나를 넘겨 준 후 해당 argument로 하여금 콜백함수를 실행하게 해주는 것이다.

단순해보이는 기능이지만, 해당 헬퍼가 빛을 발할 때는 모델에서 체이닝이 끝도 없이 길어질 때이다.

$shape = $currentSlide->createRichTextShape();
$this->setShapeTransform($shape, 124, 128, 110, 19);
$shape->getActiveParagraph()
    ->getAlignment()
    ->setMarginLeft(0)
    ->setVertical(Alignment::VERTICAL_CENTER)
    ->setHorizontal(Alignment::HORIZONTAL_LEFT);

위 코드는 php 언어 환경에서 phpoffice/phppresentation 라이브러리를 통해 ppt를 생성하는 코드중 일부이다.

$shape$currentSlide 위에 생성한 RichTextShape 인스턴스이다.

해당 shape 을 생성한 후에 관련되어 $shape 객체에 대한 상태 변화 메서드를 tap 헬퍼의 클로져 안에서 한번에 처리할 수 있다.

$shape = tap($currentSlide->createRichTextShape(),function(shape){
    $this->setShapeTransform($shape, 124, 128, 110, 19);
    $shape->getActiveParagraph()
        ->getAlignment()
        ->setMarginLeft(0)
        ->setVertical(Alignment::VERTICAL_CENTER)
        ->setHorizontal(Alignment::HORIZONTAL_LEFT);
});

이와 관련해서, laravel의 창조자 테일러 오트웰(Taylor Otwell)이 쓴 글을 읽어보면, tap 헬퍼에 사용에 대해 더 자세하게 알 수 있다.

<?php

return tap($user)->update([
    'name' => $name,
    'age' => $age,
])

위와 같은 코드에서, Eloquent\Model 의 메서드 update의 return 타입은 bool type이지만, tap 헬퍼를 사용함으로써 업데이트된 $user 모델을 return 받을 수 있다.

정리

정리해보면, laravel tap 헬퍼의 장점은 아래와 같다고 할 수 있다.

  • 특정 객체와 관련된 처리를 한 코드 블록안에 모을 수 있기 때문에 코드 가독성이 올라간다.
  • 객체의 메서드의 return 타입과 관련없이, 메서드 체이닝을 통해 변경된 객체를 return 받을 수 있다.

참고: https://medium.com/@taylorotwell/tap-tap-tap-1fc6fc1f93a6