Laravel로 스타트업 기술 스택 구성하기
-
Upload
kwangseob-jeong -
Category
Internet
-
view
1.507 -
download
6
Transcript of Laravel로 스타트업 기술 스택 구성하기
스타트업을위한라라벨기술스택
정광섭
발표자소개 치킨집 테크트리 안 타려고 노력중인 개발자
“쉽게 배우는 라라벨5 프로그래밍”
“리눅스를 활용한 회사 인프라 구축의 모든 것”
https://lesstif.com
https://github.com/lesstif
오늘함께할내용
팀을꾸리고프로젝트를진행할때흔히접하는실수(발표자가많이하는) 유형및회피술
서비스자체에집중할수있도록라라벨기술스택구성시주의사항및경험공유.
스택선정기준
익숙하고 (발표자가) 사용자가많은제품
인프라(형상관리, 이슈관리등)에는적절한비용을지불
설치형보다는관리가용이한 SaaS 선호
스택선정기준
러시아페인트공알고리즘, 마세라티문제, 야크털깍기회피
Laravel 에서 OOTB(Out Of The Box) 로제공되는기능위주
러시아페인트공알고리즘
페인트공이 첫날은 차선페인트작업을 300야드칠함
러시아페인트공알고리즘
둘째날은 150야드칠함
러시아페인트공알고리즘
셋째날은 30야드칠함
첫날은어떻게 10배를칠했는지관리자가묻자
러시아페인트공알고리즘
"저도 어쩔 수 없었습니다. 매일 페인트 통에서점점 멀어지니까요."
- 조엘스폴스키의 “조엘온소프트웨어” 중
러시아페인트공알고리즘
잘돌지만일정이상규모가되면급격히 성능이저하되고 문제를 일으키는 코드
레거시, 기술 부채등의 원인이기도 함.
마세라티문제(Maserati problem)
마세라티문제(Maserati problem)
어떤마세라티모델과색상을구매할지고민하는것.
마세라티문제(Maserati problem)
나중에마세라티살능력이됐을때할고민을미리하는것.
돈많은금융과증권계에서는 “boat naming” 이라고함.
마세라티문제(Maserati problem)
당장필요하지않은기술을담보되지않은미래의큰성공에대비하여준비하는것
천만명을처리할서비스는사용자가 10만은됐을때고민
엔지니어만 있는 스타트업에서 자주발생하는 현상
야크털깍기(Yak Shaving)
어떤목적을달성하기위해전혀상관없는연속된작업을해야하는상황.
그중마지막작업이야크털깍기
야크털깍기(Yak Shaving)
봄이와서세차를하려는데호스가터졌음
차로홈디포우에가서호스를사려보니다리를지나야하는데통행카드가필요
통행카드가없어서옆집 Bob 한테빌리려는데
아들이캠핑가려고 Bob 한테베개를빌린후에안갖다줌
야크털깍기(Yak Shaving)
그런데베개에있는야크털이많이빠져서지금베개를갖다줄수없음
그래서세차를하기위해동물원에가서야크털을깍는중
- 세스고딘의 “이제는작은것이큰것이다“ 중
기술스택구성시야크털깍기
소스코드를가져와서직접컴파일
컴파일러 최대 최적화 옵션 켜도 속도 향상체감 안 됨.
V8 Java script 엔진은 컴파일만 2시간
패키지 업데이트와 보안 패치는 어쩔….
기술스택구성시야크털깍기
SaaS 대신직접내부에설치및설정
gitlab 사내에설치하는중이라 commit 을못하고있음.
redmine 설치중이라이슈등록을못하는중..
기술스택구성시야크털깍기
필요한모든기능을직접구현…
코드를 StackOverflow 에서찾아서 Copy&Paste하는것도실력인시대
기능구현전에누가구현한게있는지 github나packagist 에서검색
시간을줄이려면정리된 list 참고(awesome-xxx)
awesome-php, awesome-laravel 등
야크털깍기대응법
야크털깍기로배우는것도많지만문제는일정
예정보다많은시간이소요된다면잠시멈출것
원래하려고했던게무엇인지떠올려보고야크털깍기라생각되면했던일을과감히 중지
Laravel
PHP 의태생적한계를보완해주는 Modern Full Stack Framework(MVC, ORM, Template 등)
Laravel
최신 PHP의장점(Name Space, Trait, Anonymous Function)을적극활용
이로인해국내 IDC 등 PHP 버전이낮은경우활용이어려움(PHP 5.6 이상필요)
Laravel
Composer 를적극활용
검증된라이브러리나컴포넌트(Sympony 의컴포넌트 - HTTPKernel, Console)등적극차용
많은기능이 OOTB(Out of the Box) 로제공
Laravel
이때문에라라벨이 PHP 생태계의가두리양식장이되고있는단점도있음.
라라벨활용처
웹서비스를계획하고있다면좋은선택
사용이쉽고확장성이좋아서마세라티문제를피하며서비스개발가능
Ex: 사용자가많아졌을때 file session => redis로변경시약간의코드수정만으로가능(물론세션데이터는수동으로옮겨야….)
라라벨을잘쓰려면
PHP 최신기능습득
객체지향지식
몇가지디자인패턴학습필요 DI(Dependency Injection) IoC(Inversion of Control) CoC(Convention over Configuration) Repository, Façade
라라벨이적당하지않은경우
머신러닝, 빅데이타, Computer vision 등은사용하려는라이브러리나 platform 이잘지원하는언어(python, C++, Java) 채택
개발인프라
서비스개발에꼭필요한인프라시스템에대해알아봅시다.
버전관리
subversion 쓰겠다고하면뜯어말리세요.
당연히 git 사용권장
버전관리는직접구축보다는 SaaS 방식권장(구축과백업에쓸노력은개발에투입)
버전관리
Bitbucket, gitlab, github 중선택은?
Github, Bitbucket 중추천하며웬만하면github
이슈관리로 JIRA 를사용할예정이면특히gitlab 은추천하지않음(연계가귀찮아요…)
이슈관리
버전관리와함께가장중요한인프라
Issue != Problem, Issue is (Problem, Todo, Task, Improvement, etc…)
등록된모든이슈를꼭처리할필요는없음
페인트공, 야크털깍기, 마세라티방지모든업무를이슈관리시스템에등록
진행상황을수시로업데이트및리뷰
처리가끝난일이라도주변상황(사용자수증가)에따라해당이슈갱신
이슈관리
끝판왕 JIRA 추천(Agile 개발시에도추천)
설치형보다는 SaaS 방식의 Cloud 서비스권장
10명이내면 Starter license (연 10$)로저렴하게사용가능
Documentation/Collaboration
Markdown 은비개발자는어려워함
MediaWiki 는훌륭하지만편의성부재
Confluence 추천(관련 slideshare 보기)
기술스택
라라벨기반으로서비스를만들기위한추천기술스택에대해알아봅시다.
On Premise vs Cloud
AWS 등클라우드가결코싸지않음(Instance 외에 Hidden Fee 가많음)
급속도로확장될여지가있는서비스를탄력적으로운영할때 Cloud 가장점이많음
고객이급속히늘지않는서비스라면 x86 서버사서 IDC 에넣는게더저렴하고성능도좋을수있음
Linux 배포판
Ubuntu 권장
RHEL 계열은패키지정책이너무보수적
docker에익숙하다면 RHEL 계열도좋음(반드시7 버전사용)
AWS 사용시 Amazon Linux 도좋은선택 - RHEL 계열이지만패키지업데이트가빠른편
Linux 배포판
금융권과연계하는서버로보안성심의받아야할때 RHEL이나 CentOS 추천
RHEL 사용자들이가장싫어하는기능인SELinux 는심의때매우유용
로컬개발환경구성
자이제 Apache/PHP/MySQL 을설치해서개발환경을구성해봅시다.
APM은 EasyPHP, AutoSet, Apm_Setup, WAMP, XAMPP, MAMP 등너무다양
로컬개발환경구성
운영환경은 nginx 를사용예정인데 deploy때문제되지않을지?
key/value store 로 redis 쓸예정인데개발자 PC 는윈도우
PHP 의 mbstring, openssl extension 설치하고모듈활성화방법은?
로컬개발환경구성
고민하지말고 Homestead
VirtualBox + Vagrant 로빠르게 Ubuntu 기반라라벨개발환경구축가능
라라벨공식서브프로젝트
개발팀이모두 OS X 를쓴다면 Valet 도좋은선택
프로젝트생성
composer create project 명령으로새로생성하는것보다는 boilerplate 프로젝트사용
팀전용 Boilerplate 프로젝트작성 & 갱신
팀원간의존성일치를위해 composer.lock 은꼭버전관리에추가
라라벨의존성관리
라라벨은유의적버전(Semantic Versioning) 따르지않음
LTS(Long Term Support) version 이 LTS 가아님
vendor 밑에들어가는 Illuminate 패키지와 app Root 가라라벨프레임워크
라라벨의존성관리
update 시 Illuminate 만업데이트됨
운나쁘면 patch update 인데기존코드가안돌수도있음.
라라벨의존성관리
의존성을수정하는 composer update/require 명령은주의해서수행
변경된 composer.lock 은참여자간의존성일치를위해즉시 push
production은 composer install 만실행
,
composer.lock 미공유시버전문제,
라라벨의존성관리
중요한모듈은의존성선언시 patch 버전까지지정
,
보안
개발자들은바빠서보안은아예고려대상이아니거나우선순위가 9,999 위
정보통신망법, 개인정보보호법등의 강화로유출사고시사업자체가위험해질수있으므로최소한의보안지식필요
보안 - Application
SQL Injection, XSS, CSRF 에대한이해는필수
라라벨은보안을고려해서설계했지만개발자가잘이해하고사용해야함
보안 - Infra
Deny All, Permit Some 정책
서비스에불필요한서버정보은닉
Server 종류와버전정보및 OS 정보
X-Powered-By 정보제거
보안 - Infra더자세한보안강화방안은 “견고한웹서비스를위한실용적인보안가이드” 참고
https://github.com/lesstif/web-service-hardening
DBMS
PostgreSQL 개발자를만나본적이많지않음
지리정보처리등 PostgreSQL 을꼭써야할분야가아니라면 MySQL 권장
DBMS
서비스성능저하원인 Full scan 또는최적화되지않은Query
대규모 Insert/Update에따른 IO 성능저하
규모가커지면 read only slave 운영
DBMS
NoSQL 의 JSON type 이좋아보이는데익숙하지않다면 MySQL 5.7 사용
예전버전 MySQL 은 DBMS 답지않게Constraint Check 를안하므로주의필요 non strict mode 일때 data constraint 미체크
unsinged int 에 minus 값입력시 0 이저장
varchar 컬럼에긴데이터입력시초과부분잘라버리기
DBMS - 백업
DB 백업은매우중요하므로 SaaS 로제공되는서비스사용권장(Aurora DB등)
직접 IaaS 나 On-Premise 기반으로 DBMS 를구성한다면백업정책수립 필수(Incremental/Full backup 주기등)
백업자동화및정기적인복구훈련
MySQL은 Percona XtraBackup 추천
DB migration
개발/테스트/Staging/Production 간일관된DB Schema 유지필요
DB migration
라라벨은 rails 처럼 migration 기능제공
손쉽게스키마를작성하고버전관리가능
DB migration 적용
php artisan migrate 한방으로스키마적용
실수로 production 에서 migration refresh 나reset 명령시사업접어야할수있음.
DB migration 적용
.env 에 “APP_ENV=production” 으로설정되어있으면 reset 시 prompt 띄우므로반드시설정
DB migration 적용
그래도대형사고의위험은존재
개발자 PC 에서운영 DB 직접접근제한
db migration 시공동작업
DB ERD
Migration 을사용해개발하다보면전체스키마구조와테이블간관계가한눈에안들어옴
테이블정규화등체계적인데이터관리와튜닝을위해서는스키마가시성확보가필요
DB ERD
migration 전에 ERD 를그려보는것을권장
ERD tool 은 Schema Reverse engineering 을지원하므로현재스키마분석에도용이
DB ERD
ORM
Eloquent 이라는가벼운 ORM 내장
웹개발시 CRUD 반복을줄여주는쓸만한프레임워크
ORM 을잘쓰려면 DBMS에대해깊은지식필요
ORM
N+1 문제등 ORM 특성으로인한성능저하대응능력필요(Lazy eager loading 등)
모든쿼리를 ORM 으로작성할필요는없음
복잡하거나성능에민감한쿼리는 Query Builder 사용해서수작업
Cache/Session & Key value Store
Redis 추천
.env 에 CACHE_DRIVER, SESSION_DRIVER 설정변경으로기존코드동작
File Storage
flysystem 라이브러리를사용하여 File System 추상화
로컬파일시스템에서 AWS S3 로전환시코드변경이많이필요하지않음
규모가커질경우 AWS S3 로이전하거나또는개발은로컬파일로하고운영은 S3 사용
Full Text Indexing
Laravel 5.3 부터 Scout Indexing driver 제공
기본 Algolia, Elastic Search 지원
아직기능은미비하여많은 customizing 필요
Sass 기반 Algolia 는설정없이 CJK 도잘지원하나비용발생
Email 은유용한 알림수단
laravel은 swiftmailer library 기반으로추상화된 Email 드라이버제공
Sendmail 보다는 mailgun 이나 AWS SES 같은SaaS 기반서비스추천
Job Scheduling
cron 은 $PATH, $LD_LIBRARY_PATH 등유닉스환경변수에대한이해필요
cron 작업변경이력이관리되지않음
서버가여러대일경우 crontab 변경시반복작업수행필요
Job Scheduling
Laravel 은 cron 기반의 task scheduler 내장
cron 은 laravel scheduler 구동용도로사용
스케줄링이 PHP 코드이므로이력관리및다수서버에배포용이
* * * * * php /path/to/app/artisan schedule:run 1>> /dev/null 2>&1
Logging
Logging != App Performance Monitoring(APM)
Logging 은 App 의 Error Tracking
NewRelic = APM
ELK stack 은로깅취합용으로는너무과다
Logging
ssh + tail –f laravel.log 로 log 파일보는것은불편하고원하는로그를찾기어려움
특정예외(http 500등)가발생하면이벤트를받고싶음
예전로그내용이필요한데이미 rolling 되어버림
Logging Service
Sentry, Rollbar, bugsnag 등다양한 logging service
SaaS 방식의 Sentry 추천
설치형도권장(https://www.lesstif.com/x/t4XUAQ)
Sentry와 Laravel 연동은https://www.lesstif.com/x/7YXUAQ 참고
Sentry - Dashboard
Sentry – Log info
Deploy
PHP 이므로별도의컴파일및패키징없이운영에반영가능
db migration 등의부가작업이없는배포라면 git pull 로배포가능
Deploy
2016년이니더그럴싸한배포전략을사용해봅시다.
Deploy - envoy
Laravel 내장가벼운 ssh task runner
blade 문법과유사
git pull 같은반복작업을여러대에서수행하기적합
Deploy – envoy + CI
운영서버에배포는개발자 PC 보다는별도서버가적합
배포서버에 ssh login 후 envoy 실행귀찮음
누가언제배포를했고결과는어땠는지관리하고싶음
Deploy – envoy + CI
CI 를도입해서 envoy 로배포실행
이왕이면 envoy 배포전에 phpunit 으로단위테스트도구동
Deploy – envoy + CI(bamboo)
Deploy – envoy + CI(bamboo)
감사합니다.