unknown error: session deleted because of page crash

라즈베리파이에서 잘 돌던 크롤러가 갑자기 동작하지 않아서 로그를 보니 unknown error: session deleted because of page crash 가 남아 있었다.

삽질을 좀 했는데 결론적으로 문제의 원인은 공유 메모리 공간(/dev/shm)이 부족한 것이었다. (참고: 크롤링 Selenium Chrome 에러)

ps로 프로세스를 목록을 보니 chromedriver가 엄청 많이 떠 있었다.

pkill chrome 으로 프로세스를 모두 죽이니 정상 동작했다.

chromedriver가 많이 떠 있었던 원인은 selenium webdriver를 닫을 때 quit()으로 닫지 않고 close()로 닫았기 때문이었다. (참고: [python] selenium close와 quit 차이점)

라라벨 인증 시험 통과했어요

지난 주말에 시험을 쳤는데 결과가 빨리 나왔네요.

아리송한 문제들이 많아서 재수하겠다 싶었는데, 한 번에 통과해서 다행이에요. ㅎㅎ

+ 후기를 보고 싶단 코멘트가 있어서 추가로 남겨봅니다.

결제

결제는 작년 11월 말에 했어요. 2020년 내에 응시하자는 마음으로 미리 결제했어요. 결제하고 바로 보는건 아니고 3달 이내에 응시하면 되거든요. 돈을 내 놓으면 돈 아까워서라도 봐야하니까 ㅎㅎ 비용은 163.9 유로였습니다.

결제하고나면 로그인 할 수 있는 계정을 안내받는데, 요 메일이 바로바로 오지 않아서 조금 답답했습니다.

결제를 했는데 메일이 안오다니! 바쁘다바빠 현대인에게 있을 수 없는 일!! 못 참고 막 이메일 보내벌임. ㅎㅎ

몇시간 지났나 하루가 지났나 기억이 잘 안나는데 암튼 메일이 오긴 왔습니다. 독촉해서 보내준건 아닌거 같고 걍 느긋하게 처리하는거 같아요.

준비

당시에 처음부터 제대로 배우는 라라벨 원고를 퇴고하고 있었기 때문에 따로 준비는 하지 않았습니다. 어차피 공부하는거 자격증까지 딸 수 있으면 좋겠단 생각이었어요. 떨어지면 쪽팔리니까 몰래보고 떨어지면 없었던 일로 하려고 했죠. ㅎㅎㅎ

원래 계획과 달리 번역서 출시 후 바로 시험을 치루진 못했어요. 어영부영 두 달이 지나버려서 시험 치를 기회를 노리고 있었는데, 지난 주말에 아이들이 처가에 가서 자고 오는 덕에 시험을 치렀습니다. 책 읽은 기억도 흐려지고 준비도 따로 안해서 자신은 없었는데 떨어지면 나만 알면 되니까 ㅋ

시험

시험에 대해서는 자세한 내용은 말하지 못하게 되어있어요.(아마? 시험 전에 안내가 나왔는데 대충 읽어서 ㅎㅎ) 그러니 간단히 소감 정도만 쓰겠습니다.

시험은 저한테는 좀 어려웠어요. 알쏭달쏭한 문제가 많았습니다. 평소에 잘 알던 부분도 ‘그래서 정확히 이거야? 저거야?’ 요런식으로 물으니 쫄리더라고요 ㅋ 게다가 틀리면 더 감점이 되는 구조라, 모르면 차라리 답 안하고 넘어가는게 낫거든요. 참 모든 문제는 4지선다형 입니다.

문제는 45문제 시험 시간은 1시간 입니다.(50분이었나? 가물가물) 문제 내는 알고리즘은 좀 별론지 같은 문제가 중복으로 나오기도 했습니다. 같은 문제가 지문만 살짝 다르게 나온 경우도 있어서 주의해야 합니다.

시험 볼 때는 부정 행위를 방지하기 위해서 제 모습과 화면을 녹화해갑니다. 밝은 방에 혼자 있어야하고, 시험보는 브라우저 외에 다른 브라우저나 탭을 띄우면 안되요. 책이나 기타 자료를 참고하는 것도 안됩니다.

결과

결과 통보는 일주일 정도 걸린다고 본 것 같은데, 의외로 하루 만에 오더군요.

결과는 붙었다고만 나오고 몇개 맞았는지, 뭘 틀렸고 답이 뭔지는 안 알려줍니다. 혹시 다 통과 시켜주는 건 아닌가하는 의심이…

별로 쓸 얘기 없을 거 같았는데 막상 쓰다보니 길어졌네요. 🙂

라라벨 라우트 그룹 사용시 유의사항

라라벨 코리아 페이스북 그룹에 질문이 하나 올라왔습니다.

https://www.facebook.com/groups/laravelkorea/permalink/1862353923927678

처음부터 제대로 배우는 라라벨의 예제 코드 처럼 라우트 그룹을 작성하면 에러가 나는데, 책에 나온 코드 처럼 사용하는 방법은 없느냐 하는 것 입니다.

질문해주신 분이 언급한 예제는 79 페이지의 예제 3-10 이며 내용은 아래와 같습니다.

Route::group(function () {
    Route::get('hello', function () {
        return 'Hello';
    });
    Route::get('world', function () {
        return 'World';
    });
});

위의 코드를 실행하면 질문자분께서 말씀하신 것 처럼 에러가 납니다.

“Illuminate\Routing\Router::group(): Argument #1 ($attributes) must be of type array, Closure given, called in …”

group() 메서드의 첫번째 인자로 배열이 들어와야하는데 클로저가 들어왔다는 내용입니다.

결론부터 말씀드리면 책의 예제 코드가 잘못된 게 맞습니다. ㅠ

Illuminate\Routing\Router::group() 메서드의 시그너처가 아래와 같기 때문에 첫번째 인자로 반드시 배열을 넘겨줘야 합니다.

public function group(array $attributes, $routes)

따라서 예제 코드는 아래와 같이 바뀌어야 정상 동작합니다.

Route::group([], function () {
    Route::get('hello', function () {
        return 'Hello';
    });
    Route::get('world', function () {
        return 'World';
    });
});

클로저만 넘기는 경우도 있던데요?

Route::middleware(['throttle:uploads'])->group(function () {
    Route::post('/photos', function() {
        //
    });
});

위 코드는 81 페이지의 예제 3-12 입니다.

group() 메서드에 클로저 하나만 넘겨주고 있습니다. 어떻게 된거죠?

group(), 동명이인

이유는 Route::group() 과 Route::middleware()->group() 에 쓰인 group()이 서로 다른 클래스의 메서드이기 때문입니다.

Route::middleware()는 Illuminate\Routing\Router가 아닌 Illuminate\Routing\RouteRegistrar를 반환합니다. 따라서 middleware() 메서드에 체이닝된 group() 메서드는 Illuminate\Routing\Router의 group() 메서드가 아닌 Illuminate\Routing\RouteRegistrar의 group() 메서드인 것이죠.

public function group($callback)

Illuminate\Routing\RouteRegistrar의 group() 메서드 시그너처가 위와 같기 때문에 클로저만 넘겨주면 됩니다.

권장사항

위의 내용을 종합해보면 라우트 그룹을 사용하는 방법이 두 가지인 셈입니다.

  1. Route 퍼사드에서 group() 메서드를 바로 호출하는 방법
  2. Route 퍼사드에서 middleware(), domain(), prefix(), name() 등의 메서드에 체이닝하여 group() 메서드를 호출하는 방법

저는 2번 방식을 권장합니다. 첫째, 1번은 메뉴얼에 안내되지 않는 사용법입니다. 둘째, 그룹을 묶는다는 것은 언제나 목적이 있을 것입니다. 따라서 위에 수정된 예제 3-10의 코드 처럼 빈 배열을 이용해서 그룹을 만드는 건 의미가 없습니다. 그룹을 묶는 목적에 따른 메서드를 모두 제공하고 있으니, 각 메서드를 활용해서 그룹을 만드는게 보기에도, 관리하기에도 더 나을 겁니다.

[1일 1식 라라벨 47호] 라라벨 6.0 릴리즈!

1일 1식 라라벨 2019년 9월 구독자를 모집 중입니다. 여기에서 신청하실 수 있습니다.

라라벨 6.0이 릴리즈되었습니다! 이번 버전은 LTS 입니다. 직전 LTS는 5.5 였습니다. 버그 수정은 2021년 9월 3일까지, 보안 수정은 2022년 9월 3일까지 지원합니다.

시맨틱 버저닝

이번 버전에 들어서면서 가장 큰 변화라고 할 수 있는 건 역시 시맨틱 버저닝을 채택한 것이라고 할 수 있습니다. 이전까지 라라벨은 독자적인 버전 체계를 가지고 있었습니다. (참고, 라라벨은 시맨틱 버저닝을 사용하지 않는다 – 이현석의 우체통) 버전 넘버 x.y.z 중 x를 패러다임 변화, y를 메이저(하위호환성이 지켜지지 않을 수 있음), z를 마이너 변화로 관리해왔는데요, 6.0 버전부터는 x-메이저, y-마이너, z-버그패치가 됩니다. 전과달리 y까지는 하위호환성이 유지되니 안심하고 업데이트하시면 됩니다.

라라벨 Vapor 호환

6.0 Vapor와 호환이 됩니다. 오늘 모던 PHP 유저 그룹에서 Vapor 관련 발표를 하기로 되어있었어요. 6.0으로 업데이트해야 Vapor를 쓸 수 있는 줄 알고 부랴부랴 업데이트를 했는데, 해보니 5 버전에서도 사용 가능하더군요.

Ignition

어제 소개해드렸던 에러/예외 페이지 패키지 Ignition이 내장되어있습니다. composer.json 파일을 보면 이전 에러 페이지 패키지인 Whoops가 제거된걸 볼 수 있는데, 완전히 대체된건 아닙니다. Ignition이 Whoops에 의존한다는 것 같네요.

향상된 인가 리스폰스

지금까지는 권한 확인 결과를 확인하고 그 결과에 따라 다른 메시지를 보여주기가 어려웠습니다. 6 버전 부터는 Gate::inspect() 매서드로 쉽게 결과를 확인할 수 있고, 컨트롤러에서 인가 헬퍼 매서드를 써도 결과에 따라 메시지가 다르게 나타난다고 합니다.

잡 미들웨어

HTTP 리퀘스트는 미들웨어가 있었지만, 잡에는 미들웨어가 없었습니다. 특정 시간 동안 너무 많이 실행되는지 검사하는 등의 로직을 미들웨어로 빼서 잡의 handle() 매서드를 더욱 명료하게 유지할 수 있게 되었습니다.

레이지 컬렉션

제너레이터를 이용해서 더 적은 리소스를 사용하는 컬렉션인 레이지 컬렉션이 추가되었습니다. 며칠전 대량의 엘로퀀트 모델을 다루는 방법에서 소개했던 cursor() 매서드가 레이지 컬렉션을 반환하도록 변경되었습니다.

향상된 엘로퀀트 서브쿼리

조나단 리인잉크가 라라콘 US 2019에서 발표했던 내용이 6.0에 정식으로 포함되었습니다. 리인잉크가 관련하여 글을 쓴 것 같더군요. 조만간 공부해서 소개하도록 하겠습니다.

라라벨 UI

라라벨 기본 프론트 엔드 스캐폴드가 laravel/ui 라는 별도 패키지로 분리되었습니다. 이제 라라벨의 기본 스케폴딩은 부트스트랩도 Vue도 적용되지 않는다고 하네요. 패키지를 설치하고 간단한 아티즌 커맨드로 기존 스타일의 UI를 적용할 수 있다고 합니다.

마치며

뭐랄까 새로 추가된 기능들을 통해 더 강력하고 더 깔끔해진 느낌이네요. 앞으로 기회 되는대로 새로 추가된 기능을 하나씩 자세히 소개해보도록 하겠습니다.

1일 1식 라라벨 47호

2019년 9월 4일

1일 1식 라라벨 9월호 구독자 모집!

어쩌다 보니 벌써 8월이 하루 밖에 안남았네요. 늦게나마 9월호 구독자 모집을 시작합니다.

7,8월과 마찬가지로 9월 한 달간 매일 한 편씩 라라벨 관련 글을 메일로 보내드립니다. 주말과 휴일엔 쉽니다.

다행히 아직까지는 한 번도 펑크를 내지 않았어요. 날짜를 넘겨서 보내드린 날은 며칠 됩니다 ㅠ 8월호에는 아래와 같은 글들을 보내드렸습니다.

  • 클래스에 final을 선언해야할 때는 언제인가?
  • 라라벨 5.8.30 새기능
  • 라라벨 서비스 컨테이너 언제, 왜 쓰는가?
  • 라라벨 Vapor 비용 & 성능 최적화
  • 액션으로 리팩토링하기
  • 패키지스트 한국 미러
  • 라라벨 백업 패키지 spatie/laravel-backup
  • PHPUnit 실행 결과를 예쁘게, PHPUnit Pretty Result Printer
  • 라라벨 제너레이터로 프로젝트 시작하기
  • 라라벨 제너레이터 사용기 1
  • TailwindCSS용 온라인 코드 에디터 Tailwind.run()
  • 라라벨 시프트와 테스트 제너레이터 사용기 1편
  • 라라벨 시프트와 테스트 제너레이터 사용기 2편
  • 라라벨로 만든 애플리케이션을 자가진단 해보자
  • 라라벨 웹 팅커
  • 테스트 속도를 향상시키는 비법
  • 엘로퀀트 모델로 대량의 데이터 처리하기 chunk(), cursor(), each()
  • 여러분의 코드 품질은 어떤가요?
  • Policy 자동 적용
  • 파사드는 어떻게 동작하는가?

위와 같은 글들에 관심있으신 분들은 아래 링크로 이동해서 구독 신청해주세요.

지나간 글들을 읽을 수 있도록 준비중입니다. 아마 9월부터는 7~8월 글도 읽으실 수 있을 겁니다.

그럼 많은 구독과 공유 부탁드립니다~

[1일 1식 라라벨] 라라벨 Vapor

이 글은 2019년 7월 29일에 1일 1식 라라벨에 발행된 글입니다. 일부 시점이나 버전 정보가 블로그 발행시점과 다를 수 있습니다.

지난 주 라라콘에서 라라벨이 새로운 서비스를 소개했습니다. 바로 Vapor 입니다. “서버는 우리가 다 알아서 해줄게요, 여러분은 라라벨 애플리케이션에만 신경쓰세요”라고 이야기하는 것 같습니다. 매트 스타우퍼가 라이브 블로깅으로 정리한 라라벨 Vapor 소개(Introducing Laravel Vapor)와 모하메드 새드의 AWS 람다란 무엇이고, 라라벨 Vapor가 이를 어떻게 사용하는가(What is AWS Lambda, and how Laravel Vapor uses it)를 요약해서 소개하겠습니다.

동기

라라벨은 포지(Forge)라는 배포 서비스를 가지고 있습니다. 포지를 사용하면 AWS, DigitalOcean, Linode 같은 클라우드 서버에 애플리케이션을 쉽게 배포할 수 있습니다. 편리한 서비스이지만 사람들이 오토 스케일링 같은건 어떻게 해야하는지 문의했나봅니다. 이에 대해 라라벨팀은 포지에 오토스케일링 기능을 추가하는 대신 새로운 접근 방법을 택했습니다. 바로 서버리스입니다.

서버리스 (Serverless)

서버리스는 말그대로 서버가 없다는 뜻입니다. 하지만 정말로 서버가 없는건 아니죠. 실제로 어딘가에 서버가 존재는 하지만 나는 그 존재를 알 필요가 없다는 것입니다.

라라벨의 index.php 파일을 열어보면 아래 내용을 볼 수 있습니다. (전에 리퀘스트 라이프 사이클에서도 다뤘던 내용이죠! ^^)

$response = $kernel->handle(
  $request = Illuminate\Http\Request::capture()
);

$response->send();

애플리케이션에 리퀘스트를 보내면 Kernel::handle 메소드가 처리하고 브라우저에게 리스폰스를 되돌려줍니다. 그동안은 이를 위해 서버를 마련하고 어떤 요청이 들어오던 index.php를 실행하도록 준비하고 기다리고 있었습니다.

Kernel::hanle 메서드만 똑 떼어내서 어떤 서비스에 올려놓고, 메서드가 실행되는 횟수만큼만 비용을 낸다면 어떨까요? 서버에 배포하거나, 라이브러리를 업그레이드하거나, 저장공간을 관리하는데 전혀 신경안써도 됩니다. 단지 기능을 업로드하고 기능이 동작하는만큼만 돈을 내는 것이죠.

이게 기본적인 서버리스입니다.

AWS 람다(Lambda)

람다는 AWS의 FaaS(Function as a Service)입니다. 람다는 주로 마이크로서비스 아키텍처의 일부로 사용되며, 한 번에 한 가지 일을 처리합니다.

  • 이미지를 S3에 올리면 섬네일을 만든다.
  • 큐에 잡을 전송하면, 람다가 실행되고 잡을 처리한다.
  • HTTP 리퀘스트를 엔드포인트로 전송하면, 람다가 실행되고 응답을 생성한다.

이런 식입니다. 이는 일반적으로 애플리케이션을 애플리케이션을 여러개의 서로 다른 서비스로 쪼개고, 각 서비스는 개별 코드 베이스를 갖는 것을 의미합니다.

마이크로서비스는 장점이 많지만 여러 서비스를 엮는게 어렵습니다.

Vapor는 여러분의 라라벨 애플리케이션을 AWS 람다로 변환합니다. 람다를 실행한 이벤트에 따라 Vapor가 애플리케이션의 특정 기능을 수행해줍니다. 사용자가 엔드포인트를 방문하면 라우터로 보낸 후 응답을 되돌려주고, 잡이 추가되면 워커를 작동시키는 식입니다. 이런식으로 라라벨 애플리케이션 작성 방법은 그대로 유지한채 서버리스의 장점을 취할 수 있습니다. Vapor가 라라벨 애플리케이션을 서버리스로 변환하는데 필요한 모든 일을 해줍니다.

마치며

그냥 단순히 배포와 오토스케일링을 처리해주는 서비스인가?라고 생각했는데 라라벨을 서버리스로 변환해주고 편하게 관리할 수 있게 해주는 서비스였네요. 정말 엄청나네요! AWS 비용이 얼마나 나올지 가늠이 안되긴하는데 저는 서비스가 정식 오픈 하는대로 한 번 써볼까 합니다. Vapor 자체는 프로젝트 수에 상관없이 한달에 39$라서 크게 부담은 안되는 듯 합니다.

[1일 1식 라라벨] 라라콘 US 2019 발표자들

이 글은 2019년 7월 25일과 26일에 1일 1식 라라벨에 발행된 글입니다. 일부 시점이나 버전 정보가 블로그 발행시점과 다를 수 있습니다.

라라벨 진영의 가장 큰 행사인 LARACON US 2019가 오늘 시작됐습니다. 올해 8월에 라라벨 6가 나온다는 발표도 있었고 Vapor 라는 서버리스 플랫폼을 새로 출시했네요. 아직 자료나 동영상 등이 많이 공유되진 않고 있어서, 좀 더 자세히 알게되면 다시 공유하겠습니다. 대신 오늘은 LARACON US 2019 발표자들을 간단히 소개해볼까해요. 원래는 발표 주제도 공유하고 싶었는데, 이번 LARACON은 발표 제목이 공개되지 않았어요. 아쉽지만 어떤 인물들이 등장했는지만 알아보겠습니다. 인물이 꽤 많으니 컨펀런스 일정에 따라 첫째 날 둘째 날로 두 편에 나누어 쓰겠습니다.

LARACON US 2019 연사 Day 1

아담 와든 Adam Wathan

7월 20일자 1일 1식 라라벨에 등장했던 인물이군요. TailwindCSS를 만든 사람입니다. 작년 재작년 발표 모두 좋았는데, 올해 또 등판했네요. 홈페이지에서도 확인할 수 있겠지만 TailwindCSS 뿐만 아니라 라라벨과 뷰 관련 강좌와 도서도 많이 만들었습니다. Full Stack Radio라는 팟캐스트도 운영하고 있어요. 프론트엔드, 백엔드 모두 능통하고 발표까지 잘하는 난 사람이네요.

프릭 반 더 허르텐 Freek Van Der Herten


스파티 Spatie의 공동대표입니다. 스파티는 벨기에에 있는 웹 에이전시인데, 라라벨용 패키지를 엄청 많이 만들어 공개하고 있고, 구성원들로 하여금 지식 공유를 적극 권장하는 것으로 보입니다. 스파티의 패키지는 테일러 오트웰도 종종 트위터에서 언급하곤 합니다. 라라벨에 관심있는 사람이라면 스파티가 내놓은 패키지들이 뭐가 있는지 살펴보는게 도움이 될 것입니다. 프릭은 블로그를 통해 지식을 활발히 공유하고 있고, 뉴스레터도 발행하고 있습니다. 최근에 Oh Dear!라는 웹사이트 모니터링 서비스를 오픈하기도 했습니다.

바비 엘리트 바우만 Bobby Elite Bouwmann

이번 LARACON에서는 라라벨 디자인 패턴에 대해 발표했나봅니다. 이전 LARACON에서 발표했던 디자인 패턴 1.0 발표는 여기(슬라이드 쉐어유튜브)에서 볼 수 있습니다. markdownmail.com를 운영하고 있습니다. 공식 메뉴얼에 없는 숨겨진 기능들을 소개하는 라라벨 시크릿이라는 책을 쓰고 있다고 하네요.

제이슨 맥크레리 Jason McCreary

약간의 비용만 내면 내 프로젝트의 라라벨 버전을 올려주는 서비스인 라라벨 시프트를 만든 사람입니다. 자본주의 만세! 물론 사람이 해주는건 아니고 자동화되어있습니다. GettingGit과 BaseCode라는 강좌를 판매하고 있습니다. BaseCode는 읽기 좋은 코드를 작성하는 10가지 비법을 알려준다는데 저도 흥미가 가네요.

케이스 대미아니 Keith Damiani

타이튼 Tighten 소속 개발자입니다. 타이튼도 스파티와 마찬가지로 오픈소스 활동과 지식 공유 활동을 활발히 하는 에이전시입니다. 요즘에는 그래프 데이터베이스와 모바일 앱개발에 관심이 많다고 합니다. 이번 라라콘에서도 라라벨과 그래프 데이터베이스라는 주제로 발표를 하는 것 같네요.

카야 토마스 Kaya Thomas

명상앱을 만드는 Calm에 소속된 iOS 개발자입니다. 사이드 프로젝트로 We Read Too를 개발했습니다. We Read Too는 2014년에 런칭됐고, 2018년 2월에 애플 스토어에 피쳐드 된 바 있다고 하네요. 이번 행사에서는 풀 타임으로 일하면서 사이드 프로젝트를 런칭하고 운영하기라는 주제로 발표를 한 듯 합니다.

조나단 레이닝크 Jonathan Reinink

PHP를 쓸 땐 라라벨을 주력 프레임워크로 사용하는(라라벨 행사의 연사니 당연한 얘긴가요 ^^;) 웹 개발자입니다. Church Social이라는 서비스를 운영하고 있습니다. 오픈소스 활동로 Glide라는 이미지 조작 라이브러리와 Plates라는 템플릿 엔진을 만들었습니다. 그리고 아담 와든과 함께 TailwindCSS를 만들었네요! 요즘에는 서버 주도 SPA를 만드는 InertiaJS라는 자바스크립트 프레임워크를 만들고 있다고 합니다. 최근에 엘로퀀트 퍼포먼스 패턴이라는 비디오 강좌를 만들었는데, 이번 행사에서는 이와 관련된 발표를 했나봅니다. 발표를 들은 테일러 오트웰이 “엘로퀀트에 대해선 레이닝크가 나보다 낫다”고 했네요. 위에 등장했던 프리크 반 더 허르텐도 레이닝크가 블로그로 소개한 테크닉을 써봤더니 좋더라는 트윗을 올린걸로 봐선 확실히 실력이 좋고 엘로퀀트를 더 좋은 성능으로 사용하는 노하우가 있나봅니다.

저스틴 잭슨 Justin Jackson

팟캐스트 플랫폼 Transistor.fm을 창업했습니다. MegaMaker라는 부트스트래퍼(투자 받지 않고 개발해서 제품으로 소득을 올리는) 커뮤니티도 운영 중입니다. 개발자를 위한 마케팅(Marketing for Developers)과 Jolt라는 책을 썼습니다.

LARACON US 2019 연사 Day 2

콜린 디카를로 Colin Decarlo

Vehikl 이라는 웹 에이전시 소속 개발자입니다. 이번 행사에서 발표한 주제는 “나는 웹 개발에 필요한 모든 것을 트위터 타임라인에서 배웠다”였다고 하네요.

스티브 쇼거 Steve Schoger

스티브 쇼거는 디자이너로서 아담 와든과 함께 RefactoringUI를 저술했습니다. UI에 요긴하게 쓸 수 있는 디자인용 에셋인 Hero PatternsHeroiconsZondicons 프로젝트를 진행하고 있습니다. Hero Patterns와 Zondicons는 무료, Heroicons는 유료인거 같네요. 이번 행사 발표 주제는 비쥬얼 디자이너 처럼 생각하는 법이었네요.

에반 유 Evan You

VueJS의 창시자입니다. 구글에서 일하면서 만든 VueJS가 대히트를 쳐서 현재는 풀타임 오픈 소스 개발자로 생활하고 있습니다. Patreon에서 밝힌 바에 따르면 Patreon에서 한 달에 16,000달러(한화로 약 2,000만원)를 번다고 하네요. 라라콘의 단골 연사 중 한 명입니다. 2016년부터 올해까지 한 해도 빠지지 않고 발표를 한 것 같습니다. 이번 행사에서는 Vue v3.0에 어떤게 추가될 건지 발표한 것 같네요.

마르셀 포시오트 Marcel Pociot

라라벨 전문 개발사인 Beyond Code에서 매니징 및 개발자로 일하고 있고 PHP 챗봇 프레임워크인 BotMan을 만들었습니다. 최근에 자신의 라라벨용 패키지들의 총 다운로드 수가 1,000만이 넘었다고 합니다. 굉장하네요. 최근에 패키지 개발 방법 동영상 강좌을 출시했습니다. 이번 라라콘 발표도 패키지 개발 방법에 관한 내용이었던 것 같아요. 이 강좌는 현재 오픈 기념 40% 세일 중이라고 하네요.

칼렙 포르지오 Caleb Porzio

Livewire 개발자 입니다. Livewire는 라라벨용 풀스택 프레임워크인데, 순수 PHP를 쓰듯 간단하게 동적 프론트 엔드를 만들어 준다고 합니다. 이번 행사에서 공개한 것 같은데, 트위터를 통해서 느껴지는 반응이 심상치 않네요.

카트리나 트라예브스카 Katerina Trajchevska

원격 근무 개발자이자 개발자 채용 서비스 Adeva의 공동 창업자 입니다. Time Driven Development라는 제목으로 발표했네요.

크리스토프 럼펠 Christoph Rumpel

라라벨 코어 어드벤처의 저자입니다. 말그대로 라라벨의 코어를 파헤치는 동영상 강좌입니다. 원래는 무료였는데, 막상 해보니 시간과 에너지가 너무 많이 들어서 유료로 전환했다고 합니다. 현재는 라이프 사이클, 파사드, 엘로퀀트, 서비스 컨테이너를 다루는 컨텐츠가 준비되어 있고, 알림과 테스팅은 준비 중이네요. 이번 행사에서는 자신의 컨텐트인 라라벨 코어 어드벤처를 소개했나 봅니다. 라라벨 코어 어드벤처는 그 전에는 챗봇 관련 도서를 쓰고 강좌도 만들었다고 합니다.

드라이스 빈츠 Dries Vints

2018년 9월에 라라벨에 입사했습니다. http://laravel.io 를 관리한다고 하네요. 벨기에 엔트워프에 살고 Full Stack Belgium과 Full Stack Europe 이라는 모임을 주관한다고 합니다. 이번 행사에서는 EVENT SAUCING IN LARAVEL WITH EVENTSAUSE라는 주제로 발표를 했나 봅니다. 이벤트소스(EventSauce)는 프랭크 드 종(Frank de Jonge)이라는 개발자가 만든 PHP용 이벤트 소싱 라이브러리라고 하는데, 저한테는 아직 생소한 개념이네요. 공부해야겠어요 ㅠ 스파티의 프리크 반 더 허르텐이 이미 라라벨용 이벤트 소스 패키지도 내놨더군요. 암튼 새로 대두되는 주요 개념인것 같은 느낌입니다.

매트 스타우퍼 Matt Stauffer

타이튼의 기술 분야 리더입니다. Laravel Up & Running이라는 책(저와 익명의 공동 번역자가 함께 번역 중입니다. 한빛미디어를 통해 내년 초에 출간 예정이에요 ^^)의 저자이고 라라벨 팟캐스트5분 긱 쇼 등을 진행하고 있습니다. 라라벨 뉴스를 발행하고 있기도 하고요. 이번 행사에서 Onramp라는 학습 가이드를 소개한 듯 합니다. 살짝 봤는데 좋네요. 컨텐츠가 영어인게 아쉽습니다.

이상으로 라라콘 US 2019 2일차 연사를 모두 소개했습니다. 많은 분들이 현업에 종사하기도 하지만 오픈 소스 활동과 지식/정보 사업을 주로 하는 분들도 많아서 부럽네요. 한국도 오픈소스 활동만으로, 혹은 컨텐트 생산 및 지식 전달 활동만으로도 잘 먹고 잘 살 수 있는 나라가 되면 좋겠어요. 여튼 화이팅 하는 걸로!

클린 아키텍처 인 PHP를 번역 출간했습니다

다른 언어들에 비해 유독 PHP는 중급자용 서적을 찾아보기가 어렵습니다. PHP가 워낙 쉬운 언어, 간단한 웹사이트 만들 때 쓰는 것이라는 이미지가 있기 때문인지, 아니면 중급자용 서적을 출간했다가 크게 실패를 해서인지는 모르겠습니다.

하지만 다른 언어들이 발달하는 만큼 PHP도 발전했고, 단순한 개인 홈페이지 뿐만 아니라 엔터프라이즈급 애플리케이션을 만드는데도 쓰입니다.

실제로 PHP로 자체 서비스를 운영하는 곳들은 대규모 처리, 대형 애플리케이션을 다룰 줄 아는 개발자들을 필요로 합니다. 그래서 PHP로 프로그래밍을 입문하는 사람들도 단순히 PHP를 다루는 방법을 익히는데 그치지 않고 더 좋은 소프트웨어를 만드는 방법을 배워야한다고 생각합니다.

그래서 현직 팀장들이 신입이 갖췄으면 하는 역량을 위주로 정리한 “바쁜 팀장님 대신 알려주는 신입 PHP 개발자 안내서”를 쓰기도 했습니다. “바쁜..”은 아키텍처, 디자인 패턴, 객체지향 프로그래밍 등은 다루지 않고 있어서 다소 아쉬운 마음이 있었어요. 그러던 와중에 유익하게 읽었던 클린 아키텍처 인 PHP를 번역 출판할 기회를 얻게되어 즐거운 마음으로 번역에 도전했습니다.

처음해보는 번역이라 생각보다 힘들었습니다 ㅠ 모쪼록 더 나은 애플리케이션을 작성하는데 관심있는 모든 PHP 개발자 여러분들께 조금이나마 도움이 되길 바랍니다.

아래 구매링크에서 전체 목차와 샘플 챕터를 보실 수 있습니다. 많은 관심과 정보 공유 부탁드려요 ^^

구매 링크 https://leanpub.com/cleanphp-korean

감사합니다!

[1일 1식 라라벨] ERD를 그려주는 Laravel ER Diagram Generator

이 글은 2019년 7월 15일에 1일 1식 라라벨에 발행된 글입니다. 일부 시점이나 버전 정보가 블로그 발행시점과 다를 수 있습니다. 8월호 구독자를 모집하고 있습니다. 월 1만원으로 최신 라라벨 소식을 받아보세요.

충분한 여유를 가지고 프로젝트를 진행한다면 코드를 작성하기 전에 설계도 하고, ERD(Entity Relation Diagram)도 그리고 할 것이다. 하지만 세상은 언제나 나에게 호의적이지만은 않다. 사전에 계획 문서를 충분히 작성할 시간이 부족한 프로젝트를 맡게 될 수도 있고, 처음엔 그리 복잡하지도 않고 혼자 진행해서 문서를 만들지 않고 진행했을 수도 있다. 그런데 이후에 클라이언트가 문서를 요구하거나, 혹은 동료가 더 생겨서 코드를 빠르게 파악하는데 도움이 되는 문서가 필요해지는 경우가 있다. Laravel ER Diagram Generator는 이런 경우에 요긴하게 쓸 수 있는 패키지이다.

Laravel ER Diagram Generator는 모델 파일에 정의된 관계를 분석해서 ERD를 생성한다. 다음은 Laravel ER Diagram Generator로 생성한 Laravel.io의 ERD이다.(출처:  공식 저장소)

설치

우선 PHP 7.1 이상이 필요하고, graphviz가 설치되어 있어야 한다.

brew install graphviz

홈스테드

sudo apt-get install graphviz

윈도우 환경이면 공식 웹사이트에서 다운로드 한다.

패키지는 컴포저로 설치한다.

composer require beyondcode/laravel-er-diagram-generator --dev

개발에만 필요하고 프로덕션 환경에는 필요 없다. --dev 옵션을 잊지 말자.

사용

아티즌 커맨드로 사용한다.

php artisan generate:erd

옵션과 커스텀 설정은 저장소 문서를 참고하자.

소감

트위터에 코드를 먼저 짜고 분석을 나중에 하냐는 조롱조의 글도 있다. 하지만 앞서 언급한 것 처럼 내 손에 넘어오는 시점에 어떠한 문서도 없이 코드만 달랑 넘어오는 경우가 분명히 있고, 이럴 때는 코드를 기반으로 문서를 만들어주는 도구가 유용하게 쓰일 수 있다. 실무적인 용도 외에 학습용으로도 꽤 유용할 수 있다. 타인의 코드로 학습하기 때문에 코드에서 부터 분석을 시작할 수 밖에 없기 때문이다.

조금 아쉬운 점은 엘로쿼트 모델을 상속받은 엔티티만이 분석 대상에 포함된다는 점이다. 도메인 주도 개발을 지향하거나, 클린 아키텍처를 지향하는 경우 라라벨에 의존하지 않는 도메인 모델과 서비스를 핵심으로 삼을 수도 있는데, 이러면 이 패키지로는 분석이 불가능하다.

[1일 1식 라라벨] 특정 버전의 라라벨 설치하기

이 글은 2019년 7월 4일에 1일 1식 라라벨에 발행된 글입니다. 일부 시점이나 버전 정보가 블로그 발행시점과 다를 수 있습니다. 8월호 구독자를 모집하고 있습니다. 월 1만원으로 최신 라라벨 소식을 받아보세요.

며칠 전에 라라벨 5.8.27이 나왔다. 새로 설치하는 사람이라면 특별한 이유가 없는 한 최신 버전을 설치하는게 좋다. 메뉴얼에서 안내하는 대로 설치하면 자연히 최신 버전이 설치된다. 하지만 어떠한 이유에서건 과거의 버전을 설치할 필요가 생길 수 있다.

구글에서 laravel install specific version 으로 검색하면 특정 버전의 라라벨을 설치하는 방법을 어렵지 않게 찾을 수 있다.

문제는 저 글들이 공통적으로 알려주는 방법으로는 내가 원하는 정확한 버전을 설치할 수 없다는 점이다. 위 이미지에 나온 검색 결과 중 첫번째 글의 베스트 답변은 컴포저로 버전을 명시해서 설치하라는 것이다.

그럼 이 방법으로 직전 버전인 5.8.26을 설치해보자.

composer create-project laravel/laravel="5.8.26" myProject

5.8.26 버전의 패키지를 찾을 수 없다! 그렇다면 두번째 베스트 답변은 어떨까?

--5.8.26이라는 옵션은 존재하지 않는다며 설치 실패! 두 방법 모두 내가 원하는 버전이 설치 안되는 수준이 아니라 아예 설치 자체가 안된다.

laravel/laravel과 laravel/framework

왜일까? 위의 컴포저 명령문을 다시 한 번 자세히 살펴보면 laravel/laravel 패키지를 설치를 시도한다는걸 알 수 있다. laravel/laravel의 깃헙 저장소에 가서 릴리즈 내역을 보면 최신 버전이 5.8.17이다. 5.8.27은 어디로 간거지?

5.8.17로 설치해보면? 설치된다.

버전을 확인해볼까?

5.8.27!??

이런 현상이 벌어지는 이유는 라라벨의 구조 때문에다. 라라벨은 laravel/laravel과 laravel/framework 패키지를 가지고 있다. laravel/framework가 라라벨 코어 프레임워크이고 laravel/laravel은 laravel/framework를 이용한 뼈대(skeleton) 애플리케이션이다. 즉 laravel/laravel은 일종의 퀵스타트 예제인 셈이다. laravel/laravel과 laravel/framework의 관계는 appkr님의 글에도 잘 정리되어 있으니 참고하자.

laravel/laravel의 composer.json을 살펴보면 다음과 같이 laravel/framework에 의존하는 것을 확인할 수 있다.

"require": {
    "php": "^7.1.3",
    "fideloper/proxy": "^4.0",
    "laravel/framework": "5.8.*",
    "laravel/tinker": "^1.0"
},

“laravel/framework”: “5.8.*” 식으로 의존하기 때문에 5.8의 최신 버전이 설치된다. 따라서 특정 버전의 라라벨을 설치하는 방법은 간단하다. laravel/laravel을 clone 혹은 내려받기한 다음 composer.json에 laravel/framework의 정확한 버전을 지정한 뒤 composer install로 설치하는 것이다.

laravel/laravel clone 혹은 내려받기(설치 아님)

내려받기는 설명할게 없으니 git clone으로 진행해보자.

git clone git@github.com:laravel/laravel.git myProject

laravel/laravel에 기여하려고 클론한 것은 아니니 깃 정보를 제거하자.

cd myProject
rm -rf .git

composer.json을 열고 "laravel/framework": "5.8.*"을 "laravel/framework": "5.8.26" 으로 바꾼다.

"require": {
    "php": "^7.1.3",
    "fideloper/proxy": "^4.0",
    "laravel/framework": "5.8.26",
    "laravel/tinker": "^1.0"
},

컴포저로 의존 패키지들을 설치한다.

composer install

설치가 완료되면 버전을 확인해보자.

php artisan

5.8.26이 설치되었다.

컴포저에 익숙하신 분이라면 별 내용 아닐 수 있는데, 의외로 검색결과에 제대로 된 답변들이 없어서 정리해봤습니다. 필요할 때 도움이 되면 좋겠네요~ 🙂

2019년 7월 4일
1일 1식 라라벨