본문 바로가기

Books

[도서리뷰] 라라벨 실전 웹 어플리케이션 개발

PHP의 대표 프레임워크인 라라벨 관련 책을 찾던 중 제이펍 출판사로부터 도서 리뷰 책 제공의 기회를 얻어 읽고 리뷰합니다.

 

다시 접한 PHP

대학을 졸업하고 직장에서 처음 PHP를 접하게 되었는데 당시 사무실 책장 한편엔 지금은 고전이라 할 수 있는 Wrox 출판사의 Professional PHP4, 그리고 이 책을 번역한 정보문화사의 번역본과 마이트프레스사의 PHP 4 웹프로그래밍 가이드 도서가 비치돼 있어 이 책을 가지고 PHP를 처음 학습했습니다.

처음 접한 PHP의 느낌은 대학 시절 Notepad와 Eclipse를 이용해 코딩하던 Java의 그것보다 더 간편하고 웹개발이 손쉽게 느껴졌고, 생산성과 접근성이 좋은 장점이 많은 언어라고 생각했습니다.

당시에도 CakePHP, Symfony, Code Igniter 등 몇몇 프레임워크는 존재했지만 Legacy 프로젝트는 PHP 버전 4, 5를 사용하고 있었기 때문에 OOP를 도입하지 못했거나 소수의 프로젝트의 일부분에서만 Class로 코드가 작성되었고, 프레임워크 또한 도입하지 않았고 몇 가지 라이브러리와 템플릿만을 사용하여 프로젝트를 진행했었습니다.

시간이 지나 언어적 불편함이나 프레임워크의 미사용의 한계 등이 대두되기 시작했고 프레임워크의 도움 없이 진행되는 프로젝트는 관리나 생산성, 협업을 통한 코드 일관성에서(꼭 언어나 프레임워크의 문제는 아니지만) 여러 문제점이 나타났습니다.

그렇게 여러 PHP 프레임워크의 정보수집을 하면서 Code Igniter가 당시에는 꽤 성숙한 단계의 프로젝트라고 생각이 들어 Code Igniter를 학습하고 간단한 사이드 프로젝트를 경험해본 것을 마지막으로 8년 남짓한 시간 동안 Java와 Spring으로 프로젝트를 하며 세월이 흘렀습니다.

그 사이 PHP는 Modern Java라고 불리는 Java8처럼 또, 최근의 많은 언어가 그러하듯 여러 개발 언어의 좋은 장점이나 기능들을 차용하여 적극 도입하고 개선하여 Modern PHP로 거듭났고, 재직 중인 회사는 여전히 PHP가 주력 개발 언어로 사용 해왔습니다.

 

회사의 프로젝트에서 사용 할 프레임워크를 선택하기 위해 여러 프레임워크를 비교 분석하여 최종적으로 라라벨 프레임워크를 몇 해전 도입하여 여러 프로젝트에서 사용 중이었습니다.

담당하는 프로젝트나 업무적으로 PHP와의 접점은 줄어들었지만 계속해서 발전하는 PHP와 Laravel의 버전업을 지켜보며 관심을 줄이지 않으려 노력하던 중 제이펍 출판사에서 제공하는 도서 리뷰 이벤트 응모에 선정되어 좋은 기회로 라라벨 실전 웹 애플리케이션 개발 책을 읽고 글을 작성합니다.

이 책의 가장 큰 특징은 라라벨을 사용하여 단순히 웹 프로젝트를 따라 하며 만들어보거나 라라벨의 주요 기능이나 따라하기만을 안내하는 쿡북 형식의 책과는 거리가 있습니다.

 

라라벨의 동작 방식과 핵심 원리를 552 페이지를 할애해 자세히 설명하고 있습니다.
책의 내용이나 구성이 좋아 읽다 보니 정독이 필요했고 계획했던 1주일을 넘겨  2주간 독서를 진행했습니다.

 

챕터별 내용

1. 라라벨 개요

이 챕터에서는 라라벨이란 무엇인가, 그리고 라라벨의 주요 특징과 Docker를 이용하여 OS 별로 라라벨을 설치하여 손쉽게 책을 따라서 진행해 볼 수 있도록 설명하고 있다.

나의 경우는 Windows의 WSL을 사용하고 있어서 어렵지 않게 라라벨 설정을 마칠 수 있었다.

Windows OS가 아닌 Mac OS의 경우에도 잘 설명되어 있기 때문에 어렵지 않게 설정할 수 있으리라 생각된다.

과거에는 VMware, Virtual Box, 아니면 Linux 서버에 Apache + PHP + Laravel 을 올려서 설치를 진행하거나 윈도우에서는 XAMPP를 이용하곤 했는데, 지금은 Docker를 이용하면 첫째로 설정이 간편하고, 둘째로 Windows 설정이 복잡해지는 것을 피할 수 있기 때문에 이전보다 PHP와 Laravel로의 접근성이 좋아졌음을 느끼게 된다.
Sail이나 Homestead 설정을 마치고 나면 간단한 라라벨 애플리케이션을 작성하여 디렉터리 구성과 웹페이지 호출/동작 과정 그리고 테스트, 인증/허가 등 앞으로 살펴볼 내용들을 간략하게 설명하고 있다.

 

 

2. 라라벨 아키텍처

이 장에서는 애플리케이션을 구현할 때 중요한 라라벨의 아키텍처를 설명하고 있습니다.
라라벨의 동작 과정과 핵심 기능들을 자세히 설명하고 있습니다. 자바 진영의 스프링 프레임워크에서 DI를 하는 과정이나 컨테이너가 Bean을 등록하고 관리하는 과정에 해당하는 내용들이 이 장에서 설명하고 있기 때문에 비교하면서 읽어보았고 비슷한 부분들이 많다고 느꼈습니다.

바인드와 리졸브, DI와 서비스 컨테이너, 퍼사드 등 라라벨을 이용해서 프레임워크를 확장하고 관리하기 위해서는 이 장을 정독하면 좋을 것 같습니다.

 

3. 애플리케이션 아키텍처
이 장에서는 애플리케이션 설계에서의 구조화와 개념을 설명하고 있습니다.
대표적인 웹 개발 패턴인 MVC 패턴과 이 MVC 패턴에서 파생된 ADR 패턴의 구조와 그룹을 분할하며 이를 설명하고 있습니다.
 레이어드 아키텍처에서는 기능과 관심사에 따라 Controller, Service, Repository 등을 분류하여 한 가지 레이어로 많은 기능과 역할이 몰리지 않도록 설명하고 있습니다.



4. HTTP 요청과 응답
이 장에서는 라라벨 프레임워크의 입출력, 밸리데이션 및 미들웨어에 관해 설명하고 있습니다.
사용자가 입력한 데이터를 처리하기 위해서 요청 값들을 검증하고, 크로스 사이트 스크립팅 방지를 위해서도 필요한 밸리데이션에 대해서 설명합니다.
그 밖에도 SSE, HATEOAS, 미들웨어에 대해서도 설명하고 있습니다.

 

5. 데이터베이스
이번 장에서는 데이터베이스 마이그레이션과 Eloquent 쿼리 빌더를 이용한 데이터베이스 조작을 설명하고 있습니다.
라라벨 마이그레이션 기능을 이용해서 테이블과 데이터를 생성하는 방법과 ORM인 Eloquent를 다루는 법을 학습한다.
다른 개발 언어에서의 ORM과 마찬가지로 개발자들이 SQL문을 직접 작성할 필요 없이 PHP 언어로 DBMS를 조작하는 법을 설명한다.
매우 복잡한 SQL문은 다른 언어도 그렇듯이 직접 작성하거나 DB의 Procedure를 이용해야 하겠만, 마찬가지로 대부분의 SQL문은 처리 가능할 것으로 생각된다.

 

6. 인증과 인가
이 장에서는 인증과 인가를 이용한 애플리케이션 제어 방법을 설명합니다.
스프링 프레임워크 중에서 시큐리티에 해당하는 내용들을 설명합니다. 인증을 지원하는 클래스들을 설명하고 인증 처리 과정을 설명하고 있으며, 폼 인증, 토큰 인증, JWT 인증, OAuth 인증 등 여러 인증처리 방법을 함께 설명하고 있습니다. 또 인가 처리 항목에서는 애플리케이션 사용자에 대해 리소스나 기능에 이용 제한을 설정해서 제어할 수 있는 방법을 설명합니다.

7. 이벤트와 큐를 이용한 처리 분산
이 장에서는 비동기 처리와 분산 처리에 관해 설명합니다.
애플리케이션에서 처리속도가 오래 걸리는 등 무거운 처리 같은 경우는 사용자가 기능 실행 후 기다리고 있는 것보다는 이벤트로 처리해서 나중에 결과를 받아서 확인할 수 있도록 처리하는 방법이 보다 나은 사용자 경험이 될 수 있습니다.

이 장에서는 이벤트와 큐를 이용해서 분산처리를 하고 비동기 이벤트로 메일 발송이나 PDF 생성 등과 같은 예제로 설명하고 있습니다.
또, 이벤트와 큐를 이용한 CQRS에 대해서도 예제를 통해 설명하고 있습니다.

 

8. 콘솔 애플리케이션
이 장에서는 커맨드를 이용한 콘솔 애플리케이션을 작성합니다.
경우에 따라서는 콘솔을 이용해서 애플리케이션을 실행하거나 조작해야 하는 경우가 생깁니다.

정기적으로 수행하는 배치나, 콘솔을 이용해서 기능을 실행할 수 있는 커맨드 인터페이스에 대해서 설명합니다.

 

9. 테스트
이 장에서는 테스트 코드 구현의 기본을 학습하고 구현합니다.
자바를 학습하면 반드시 언급되는 JUnit이라는 유명한 테스트 프레임워크가 있는데 PHP에도 PHPUnit이라는 테스트를 위한 프레임워크가 존재한다.

이 PHPUnit을 라라벨에 맞게 확장한 것으로 이런 테스트 툴이 존재하는 것만으로도 개발자 입장해선 매우 든든하고 기쁜 일이라 생각된다.

이번 장에서는 PHPUnit과 연동해 애플리케이션을 효율적으로 테스트할 수 있는 구조를 제공하는데 테스트를 하다 보면 데이터베이스와 연계된 테스트나 웹 API 관련 테스트는 간단한 단위 테스트에 비해 설정이 복잡한 경우가 많은데 이 또한 이번 장에서 자세히 설명하고 있다.

10. 에러 핸들링과 로그 활용
이 장에서는 애플리케이션 운영 시 발생하는 에러 처리와 로그 활용을 설명합니다.
운영 시스템을 관리함에 있어서 에러 및 로그 관리는 중요합니다.

에러가 발생해서 시스템이 멈추거나 에러 화면에서 화면 이동이나 전환이 불가능하게 막힌 경우는 사용자에게 좋지 않은 경험을 갖게 합니다.

이 경우에도 단순히 에러를 예외로 던져 시스템 멈추거나 화면의 이동 불가와 같은 현상만 넘기기 급급하게 에러를 관리한다면 언제 터질지 모를 시한폭탄을 안고 시스템을 운영하는 것이라 할 수 있습니다.

그렇기 때문에 에러의 핸들링과 이 에러를 확인하고 처리하기 위해 로그를 잘 기록해야 합니다. 로그는 에러 로그가 아니더라도 업무에서 발생하는 유의미한 정보들을 로그로 잘 남겨두어야 하기 때문에 이번 장에서는 라라벨의 에러 핸들링과 로그 관리 방식을 이해합니다.


11. 테스트 주도 개발 실천
테스트 주도로 개발하는 라라벨 애플리케이션을 설명합니다.
과거 TDD(Test Driven Development)라는 이름으로 많은 세미나와 강연, 강좌에서 소개된 개발 방법론인 테스트 주도 개발을 적용하여 실습을 진행합니다.
성공을 위한 테스트가 아닌, 실패 가능한 케이스를 하나씩 성공하는 테스트로 점진적으로 개선해 나가며 프로그램의 완성도를 높여가는 방법을 설명합니다.
데이트 베이스 사용한 테스트 방법과 리팩터링 과정도 함께 다루고 있어 유용한 챕터라고 생각이 들었습니다.
실무를 하면서도 모든 코드를 TDD 방법론으로 작성하는 것은 아니지만 테스트는 하면 할수록 코드의 품질이 올라가고, 퇴근 후나 주말에도 내가 작성한 코드 때문에 에러가 발생하진 않을까 하는 걱정으로부터 마음을 편안하게 해 줬던 적이 많이 있기 때문에 TDD를 처음 접한 사람이라면 읽고 나면 앞으로 큰 도움이 될 것이라 생각됩니다.

 

정리하며

라라벨 실전 웹프로그래밍 개발은 라라벨의 핵심부터 웹 개발에 필요한 기능들을 하나씩 예제와 함께 설명하고 있습니다. 

책을 읽고 라라벨을 알아가면서 자바의 스프링과 많은 부분이 비슷하고 또, 잘 구현되어 있다는 것을 느꼈습니다. 

PHP 손을 놓은 지 몇 년 동안 라라벨과 함께 많은 발전이 있었고, 또 빠르게 발전하고 있구나 하고 또 한 번 느꼈습니다. 

최근에는 Flutter를 이용해서 미세먼지 앱을 만들어 보았는데 Firebase로 만들어진 Back-end 부분을 라라벨로 변경해보며 조금 더 라라벨을 알아가 볼까 합니다.
아직 라라벨을 알아가는 회사 후배분들에게 이 책을 적극 추천하는 바입니다.