# 171109 Play.Node
## GraphQL In Action: REST와 이별할 때 생각해야 하는 것들
* 고통의 근원: 이게 RESTful한가? 계속 질문하게 됨. Path, method, url 설계 등등....
* 특징
* scheme를 정의하여 validation이 편함
* 상속: union, interface keyworld
* recursive query: fragment 사용
## Tool
* GUI Client
* [Insomnia REST Client](https://insomnia.rest/)
* [GitHub - graphql/graphiql](https://github.com/graphql/graphiql)
* BaaS
* [Graphcool - GraphQL Backend Development Framework](https://www.graph.cool/)
* 구현체
* [GitHub - apollographql/apollo](https://github.com/apollographql/apollo)
* [GitHub - relay](https://github.com/apollographql/apollo)
* 같이쓰면 좋은
* [GitHub - facebook/dataloader](https://github.com/facebook/dataloader) -> 캐싱
## lambda.js와 함께 하는 간단한 API Server 만들기
* [GitHub - ramda/ramda: Practical functional Javascript](https://github.com/ramda/ramda)
* 순수함수
* side effect가 없는 함수: 외부 변수에의해 조작이 불가능한
* 일급함수
* …
* 함수를 파고들어갈때
* R.isNil
* R.compose
* R.last
* R.curry
* R.allPass
* 알면 좋은 것
* [Cookbook · ramda/ramda Wiki · GitHub](https://github.com/ramda/ramda/wiki/Cookbook)
* [Try Lambda](http://ramdajs.com/repl/)
## Node.js API 서버 성능 개선기
* 테스트 준비
* 서버 하나의 한계 파악
* 병목구간 확인
* 코드 개선 후 비교
* 테스트 툴
* 로컬 성능 확인
* [GitHub - shoreditch-ops/artillery](https://github.com/shoreditch-ops/artillery)
* npm script pre, post keyword
* npx autocannon
* 서비스
* Newrelic
* 테스트 시작 끝을 알려고 배포 플래그 api이용함
* Nsolid
* RisingStack
* AWS
* ECS Cluster
* Vagrant로 Virtual Box가 아닌 AWS EC2를 띄움
* [Rsync](https://www.joinc.co.kr/w/Site/Tip/Rsync)
* Ansible
* 성능 개선
* 클러스터 인스턴스 변경
* 컨테이너 CPU, 메모리 조정
* DB Pool 사이즈 조정
* v8 major update(node v6 -> node v8)
* turbofan + ignition
* 엄청난 성능향상...
* node inspect option (프로파일러)
* chrome devtools 사용가능
* v8 tick profiler
* `node -prof`
* summary
* Heap Dump -> 메모리 누수 추적
* 크롬 디버거 -> Memory -> Heap Dump
* Heap Dump를 테스트 이전, 테스트 이부
## 협력적 멀티태스킹
- Async await 잘 써라
- Promise를 래핑함, 성능은 잘 나오지 않더라도 메모리 관리등...
## 클라우드 시대의 node.js가 좋은 이유
* vs JAVA: Memory 차지를 많이함 -> 가지고있는 리소스가 적을때.
* https://github.com/fzaninotto/uptime
* ELK Stack