SlideDeck.io – A repository of great HTML presentations
웹 개발 – PLATFORM – NGINX
View Github Repository
Open presentation in a new window
wormslab
See all presentation from wormslab
웹 개발 – PLATFORM – NGINX
0
0
web-dev-guide
web development guide using reveal.js
On Github
wormslab / web-dev-guide
웹 개발
이렇게 하니 괜찮더라
PLATFORM
MEAN(Mongodb, express, angularjs, nodejs) stack 을 많이 사용
APM(Apache, Php, Mysql) 의 진화버전쯤 되는듯
toy building 정도로 좋지만 좋은 서비스를 위해서는 웹서버, 데이터베이스가 필요하게 됨
요즘은 REST 스타일로 개발을 하니 서버와 클라이언트가 분리되어 있음
서버는 사용처에 따라 혹은 취향에 따라 사용하면 됨
galleon, barrel, golden retriever 구조처럼 MSA(Micro Service Architecture) 도 많이 사용 됨
하지만 결합도가 올라가니 관리하는 헬게이트가…
관리도 어렵지만 개발버전 하나 띄우려면 뭐가 이렇게 할게 많아…
그래서 docker 가 떠오르고 있음(뒤에서 설명)
클라이언트는 개인적으로 angular.js 가 아직은 가장 좋다고 판단 됨
two way data binding, directive
NGINX
장점
reverse proxy를 이용하여 http 서버로 바로 붙는 것을 방지
Load banancing(scale out)
Static file serving(cache)
웹서버를 쓰면 성능과 보안에 좋다
단점
machine 이 달라지므로 shared resource 에 대해서는 대책이 필요하다
대표적으로 session 을 서버 메모리에 관리하기때문에 서버가 달라지면 세션을 유지할 수 없다
nodejs 는 프로세스를 forking 하는 구조로 퍼포먼스를 향상시키기 때문에 redis 를 많이 사용한다
REDIS
서버가 여러대니 session을 redis에 저장
redis 는 in-memory database 이고 session 을 위한 연산은 O(1) 퍼포먼스이므로 좋다
근데 redis 는 single thread 이고 분산 된 환경에서 atomic 연산을 지원하지않음
망할 CAP 이론…
하지만 우린 그렇게 까지 쓸일이 없으니까 빵빵한 장비를 믿고 가기로 한다
일관성, 가용성, 분단가용성을 동시에 지원하는 데이터저장소는 없다
취향과 목적에 따라 골라 쓰세요
DATABASE
ORM 을 사용하는게 좋다
ORM에서 지원하는 database 를 사용하는게 좋다
where, join 이 들어간 string 을 빌딩하는데 지옥이 펼쳐질 테니까…
아니면 sql building 하는 라이브러리를 사용하는게 좋다
쿼리튜닝은 전문가에게…(explain keyword 사용)
백업은 자주 하는게 좋다
백업을 docker 로 관리하는 것도 좋은듯
REST
웹만 있었을 때는 서버에서 직접 html 을 rendering 했다
모바일이 떠오르니 이걸 대응을 하긴 해야겠고.. 그래서 접속 기기를 보고 모바일이면 모바일 페이지를 렌더링 해주기로 함
개발하다보니 똑같은걸 두번하는거같아서 이게 아닌것 같다는 생각을 하게 된다.
반응형 웹을 만들자
서버에서는 동일한 내용을 렌더링 해주고 front-end 에서 media query 를 이용하여 반응형 웹을 만듦
그런데 모바일은 웹 속도가 형편없네.. 느려서 불편하다
그럼 native app 을 만들자
native app은 html 안써.. 서버는 데이터만 줘
그럼 웹으로 들어올때는 html 을 렌더링 해주고
native app 모바일로 들어온 유저에게는 json 을 줄게
무언가 이상한건 기분 탓이겠지
이렇게 된 이상 REST 로 간다(개념은 2000년 로이필딩에의해 처음 제안됨 - 박사논문)
이때 한창 웹 통신에서 SOAP 와 REST 결투중 REST 가 우세 했고
angularjs 가 떠오르고 있었고
mobile native app 이 성행했는데
REST, angular, native app 3박자가 잘맞으니 모두가 편안해짐
front-end 개발자들은 html 에 로직이 들어와 영 불편해 함
저는 이책으로 공부했어요
뒤에 Atom 부터는 좀 이상한것 같고 4장 까지만 봐도 괜찮은듯
safety, idempotent 개념만 알면 되지 않을까..
(LE|SC|SA)SS
CSS 작업은 정말 노가다와 같아서…
(LE|SA|SC)SS 를 사용하지 않으면 지옥이 펼처짐
변수, 선택자 상속, 중첩, 믹스인, 임포스, 제어문등을 제공해서 훨씬더 손쉽게 코드를 작성하게 해준다
근데 저걸 사용해도 지옥같으니
bootstrap 을 사용합시다. bootstrap 짱짱맨
저걸 사용하려면 css 로 변환하는 기능이 필요함
file watching 기능을 사용하면 수정마다 자동으로 빌드해놓게 설정해서 사용하면 편함
nodejs 에서는 gulp 와 grunt 가 있음
BOWER
나도 저런 깔끔한 달력 입력 인터페이스 하나 넣고싶다
저걸 html/css 로 만들겠어!!
라고 다짐한 한 후 많은 시간을 버리게 되겠지..
어렵고 시간이 많이 걸리는일은 잘 만들어진 것들을 찾아 쓰는게 이득!
(하지만 디테일의 완성도는 css 를 직접 손질해야...)
하나둘 라이브러리를 가져다 쓰다보니…
점점 수가 많아졌고 일관성을 위해서 클라이언트 파일들을 VCS 에 넣어서 보관했다
어느날 문득보니 서버사이드에서는 이런 경험(삽질)이 많아서 보통 패키지매니저를 통해 관리를 하고 있었다
그래서 front-end side 도 이런게 있으면 좋겠다 싶었는데 bower가 나와서 인기를 끌게됨
보통 라이브러리를 다운받고 복사하고 header 에 script 태그를 심어줬는데
bower install 과 script 태그만으로 이용이 가능해졌으니 조금더 간단 해짐
대부분은 github 에 있고 search 명령으로 그럴싸한 이름의 라이브러리를 찾는것도 가능해짐
이렇게 bower.json 만 있으면 파일을 VCS에 넣을 필요도 없고 한눈에 보기도 쉽고 설치도 쉽게 할 수 있다
근데 구조상 문제가 되는게 있었으니 그거슨 전역변수 와 버전충돌
대부분의 front-end 라이브러리들은 window 객체에 자신의 변수를 심어놓음
라이브러리가 많아지면 namespace 가 충돌할 수 있음(하지만 ‘$’는 아무도 건들지 못하겠지..)
그래서 보통 no conflict 라는 옵션으로 namespace 를 변경할 수 있도록 함
bower 는 dependency 충돌을 막을 수 없음(클라이언트사이드의 한계)
근데 해보니 별로 걱정 안해도 됨. 어차피 유명한애들은 많이 쓰니까 알아서 잘 피해감
또 오픈소스라서 다른 버전과의 호환성문제도 금방금방 해결되는 것 같음
결론
라이브러리를 받아서 VCS에 저장하든 bower를 큰 차이는 없는것 같다
개인적으로는 설치는 bower 로 하고 필요한 파일을 복사해서 VCS 로 관리하는게 깔끔하고 좋은것 같다
최근 commonjs 스타일로 font-end의 모듈화를 도와주는 webpack 과 browerify 가 있는데 이것은 아직 시기상조 인듯하다
DEPLOY
배포는 서버사이드의 일이므로 각 플랫폼에 맞에 알아서 잘…
javascript/css/image 크기가 크면 response time 이 떨어지므로
concatify, uglify, gridify 등 static 파일크기를 줄이거
http connection을 최소화 하는 단계가 필요하다
(LE|SA|SC)SS 빌드도 필요함
주의할점
js/css/image는 static 파일이므로 nginx 가 처리하게 되는데
caching 지옥에 빠지면 고통받으니 뭔가 이상하다 싶으면 cache 를 의심하세요
만약 CloudFront 같은 CDN 서비스를 사용한다면 더욱더 지옥같을 거에요
그래서 build 된 js, css 에 pinger print 를 붙여서 다른파일로 인식되도록 하기도 합니다
최근에는 docker 를 이용해 container 별로 관리
웹서버, 웹어플리케이션서버, 레디스, 데이터베이스별 컨데이너가 존재
스크립트로 잘 연결시키면 복잡한 MSA도 한방에 launch!
더군다나 이미지 별로 관리가 되기때문에 개발자간에 database 안에 들어있는 데이터를 동기화 하기에도 매우 좋음
프로세스를 잘 만들어 놓는다면 좋을것 같음
TEST
서버사이드는 각각의 플랫폼에 맞는 테스팅 툴을 사용
angular.js 는 karma 를 사용하여 테스트케이스 작성
E2E 테스트를 하고싶다면 selenium 을 사용
최근에는 selenium 을 이용한 브라우저별 테스트 자동화 클라우드 서비스도 존재함(https://www.browserstack.com/automate)
개인적으로는 클라이언트 사이드 테스트는 공통의 데이터 처리영역 수준에서 마무리 하는게 좋다고 생각
UI 테스트는 방법이 애매할 뿐더러 자주 바뀌기 때문에 테스트케이스를 작성하기에 애매한 부분이 있음
웹 개발 이렇게 하니 괜찮더라