PLAY NODE 2017 방문 후기 입니다.

Typescript, Express, Decorator, Angular

타입스크립트 제가 한번 써봤습니다. (김병진님 Flitto)

  • 자바스크립트는 타입이 없어서 타입에러가 많이 발생한다.

  • 문제점 : 함수의 인풋과 아웃풋이 어떤 것인지 기존 코드를 보고 유측하기가 어렵다.

    • 해결책 : 타입을 typeof로 체크해주기 시작.. (코드가 더러워지기 시작)
  • Front-End

    • Typescript를 도입하기로 결정

      • 타입스크립트는 변수에 타입을 지정해줄 수 있다.

      • 컴파일 과정에서 타입이 다른것은 커파일 에러가 발생한다.

    • 인풋 타입 정리

      • 결합과 상속을 통해서 인풋 타입을 정리하기 시작

        • IDE 딴에서 인풋타입을 체크해주니 타입 에러를 노출 시켜줘서 편리했다.
    • 아웃풋 타입 정리

      • Observable(userInterface)
  • Back-End (Node + Express)

    • 타입스크립트로 인풋 아웃풋에 대해서 타입을 정의
  • 백엔드와 프론트앤드에 중복되는 타입이 많아짐

    • 백엔드와 프론트앤드에서 공유하는 패키지를 만들어서 해당 패키지에 중복된 타입을 모아 두기 시작

      • 일관된 형태의 데이터로 프론트앤드 백앤드 통신이 가능해짐

  • 자바스크립트 @decorator

    • 타입스크립트에서는 @decorator 를 잘 지원해준다.
  • TS-EXPRESS-DECORATOR

    • Express 프레임워크에서 타입스크립트의 @decorator 를 사용하기 편하게 Wrapping 한 프레임워크

    • 데코레이터를 사용하면서 관심사의 분리가 가능해짐

    • 의존성 주입이 가능해짐

      • @Service로 지정된 데코레이터를 컨트롤러의 컨스트럭터에서 인젝션을 해줌
    • 데코레이터를 사용하면 스프링 DI 컨테이터처럼 AUTO WIRED 기능을 사용할 수 있다.

      • 데코레이터를 미리 읽어서 데코레이터가 표시된 class들을 빈처럼 만드는게 가능함

        • 이러한 class를 만드는 과정에서 API 문서화 같은 작업도 가능함 (뭔가 module이 있을듯?)
  • 왜 타입스크립트?

    • 타입스크립트는 컴파일 언어이기 때문에 컴파일 과정이 추가되어서 사소한 실수를 방지할 수 있다.

    • 타입을 정의할 수 있게되면서 IDE 딴에서 미리 에러를 찾아 낼 수 있어서 개발 생산성이 높아졌다.


  • 개인적인 생각

    • 어디선가 타입스크리틑를 사용하면 자바처럼 자바스크립트를 쓸 수 있다는 말을 들었는데 (객체 지향적으로) 그런 부분에서 프론트앤드와 백앤드를 객체지향적으로 사용할 수 있게 되는게 매력적일 것 같다.(원래 내가 모듈화를 좋아함)

    • 그런데 한가지 걱정되는게 타입스크립트가 브라우저 서포트를 어디까지 해줄지가 의문인데 조사해봐야겠다.

    • 타입스크립트도 웹팩 통해서 바벨컴파일(?) 돌리면 ES 하위 버전으로 할 수 있겠지?

Typescript와 Flow

자바스크립트 코드에 정적 타이핑 도입하기 (안희종님 하이퍼커넥트)

  • 정적 타입 시스템의 장점

    • 버그에 대한 처리비용이 적은 쪽에서 처리가 가능하다.

    • 자바스크립트에 정적 타입 시스템 도입시 효과에 대한 연구

      • 깃헙에 공개된 이슈중 타입 시스템으로 잡을 수 있었던 버그의 비율은 얼마나 되는지에 대해서 조사

        • 탐지 가능한 버그

          • 타입체커가 버그를 고치는 커밋 직전의 코드베이스를 통과시켜주지 않는다면, 해당 버그는 정적 타입 시스템으로 탐지 및 예방할 수 있었을 것이다.

          • 실험결과 : 저장소에 들어오는 버그중 10% 이상 버그를 줄 일 수 있다.

            • 버그가 안발생하는게 아니고 처리 가능한 시점을 앞단계로 옮겨서 처리 비용을 줄일 수 있다.
      • 코드와 더 밀접히 연결된 문서화가 가능해진다.

      • 리펙토링이 용이해진다.

      • 타입 시스템을 통해서 더 안전하게 더 빠르게 개발이 가능해진다.

  • 그럼 어떤걸 선택해서 도입해야해?

    • 크게 두가지 타입스크립트, 플로우 두가지 큰 옵션이 존재한다.

      • 새로운 언어를 만든것이 아니라 기본 자바스크립트 위에 올릴 수 가 있다.

      • 기본적으로 두 시스템이 많이 비슷하다. (문법적으로)

    • 그래서 뭘 써야할까

      • 두개다 괜찮은 시스템이라 생각, 문서를 꼼꼼히 읽어보고 프로젝트의 성격에 맞는걸 잘 골라서… (뻔한 이야기…)

      • 발표자 : 타입스크립트를 쓰세요!

  • 왜 타입스크립트를 써야 하나요?

    • 안전함과 편리함 사이 설득력 있는 트레이드 오프

      • 자바스크립트는 기본적으로 느슨한 언어이다 그래서 너무 안전성을 따지는 Flow 같은 경우에는 귀찮은 경우가 많아진다. -> 개발 생산성이 떨어진다.
    • 훌륭한 IDE 서포트

    • 훨씬 거대한 커뮤니티 (개인적으로 가장 중요한 이유)

  • 어떻게 도입해야 하나요?

    • Plain JS 사용중인 프로젝트 (나나나)

      • 타입스크립트 설치 및 타입 정의

        • npm install -g typescript

        • 라이브러리 my-cool-lib를 타입 의존성과 함꼐 설치

      • tsconfig.json

      • webpack 과의 통합

        • ts-loader

        • awesome-typescript-loater

      • 점진적 타이핑

        • 파일별 적용

          • JS 에서 TS 임포트

            • 웹팩 통해서 하는거 추천
        • 한 파일 내 부분 적용

          • 타입 추론

          • 타입 강제

    • Flow를 사용중인 프로젝트

  • 교훈

    • 생각만큼 어렵지는 않다.

      • 유용한 전략 : 이슈를 해결할 때 마다 관련된 파일을 타입스크립트로 바꾼다.

      • 리팩토링이 너무 쉬워진다

    • babel-loader + ts-loader

      • 폴리필을 쓰면 전역을 오염시켜서 문제가 발생할 소지가 있다. (JS + TS 같이 사용하는 동안에는 주의)

  • 개인적인 생각

    • 타입스크립트는 타입스크립트 컴파일러를 거쳐서 자바스크립트로 바뀔텐데 이게 ES6 문법 이상일 것 같다. (우연히 발표자 분을 카페에서 만나서 말씀을 나눴는데 그런 이슈가 있어 하위 브라우저 서포트 이슈가 생길것 같다고 하신다.)

    • 그럼 babel-loader 를 거쳐서 ES5 문법으로 바꿔주면 될텐데 babel-loader가 지원하지 않는 부분이 존재할 것 같다.

    • 이런 부분에 대해서 발표자분과 말씀을 나눴는데, babel-loader가 지원하는 부분이 어디인지 확인이 가능하다 하니 알아봐야겠다.

    • 타입스크립트 꼭 한번 써보고 싶다 프론트앤드를 자바처럼 짤 수 있다면 진짜 진짜 편할거 같다.

Node.js API 서버 성능 개선기

성능 테스트를 위한 준비 / 도구/ 결과 분석 (변정훈님 - 스마트 스터디)

  • 인증 API 서버 (회원가입 / 로그인 / 권한부여 / 회원 정보 관리)

    • 왜 성능 테스트를?

      • 서버 하나의 한계 파악

      • 병목구간 확인

      • 코드 개선 후 비교

    • UNIT TEST 에서도 확인 가능하지만 실제 트래픽과 유사한 성능이 궁금

    • 성능 테스트 도구

      • 사용자 시나리오로 작성

      • 대량 트래픽 조절 가능

      • 가능하면 Node.js로 사용

      • Node.js작성된 부하 테스트 도구 : Artillery

        • 기능적으로 필요한 부분이 많이 되어 있다고 생각

          • yml File로 설정과 시나리오를 작성할 수 있다.

            • 어떤 기간동아 얼마 만큼의 액티브 유저가 있는지 설정

            • 회원가입 하고 로그인하고 회원정보 조회한다 등의 시나리오 작성

          • package.json에 아트롤리 테스트 돌릴 수 있도록 scripts 쪽에 작성ㄴ

          • 아트롤리가 리포트 를 만들어 준다.

            • 차트나 데이터 같은 리포트 만들어줌

            • 리포트 json을 떨궈주는데 이걸 보기 좋게 HTML로 만들어 주는 기능도 제공한다.

        • Node.js APM 도구 : New Relic, N Solid, Rising Stack
          • 대부분 유료

          • New Relic 사용 -> 고급기능을 제외하고는 무료로 사용 가능 (기본적인 모니터링은 가능)

            • New relic 배포 플래그

            • tip : package.json의 script 에 pre / post 키워드 붙이면 npm run xxx 하면 앞뒤로 해당 스크립트 실행해준다.

        • 테스트 서버 구성

          • AWS 사용

            • Elastic Load Balancer

            • ECS Cluster : docker

            • RDS

            • DNS로 쓰일 Route53 은 성능에 영향이 없을 것이라 테스트 서버에는 구성하지 않음

          • vagrant

            • vagrant 사용하면 AWS에 EC2 인스턴스를 동일한 환경으로 만들 수 있다.
          • ansible (뭔지 모르겠어.. 공부하자..)

        • 튜닝

          • 성능이 생각 이하라 튜닝 작업

            • 클러스터 인스턴스 변경

            • 컨테이너 CPU 메모리 조정

            • DB Pool 사이즈 조정

        • 테스트 결과

          • 한개 시나리오당 20초 정도

            • 다 200대 응답이 오는건 아니다.
      • 굳이 성능 테스트를 하려고 한 이유

        • 개발 하기도 바쁜데 굳이 성능 테스트?

          • Node.js 버전을 8로 올리고 싶어서

            • V8 엔진 업데이트로 성능 향상

            • 도커에 노드 버전만 다르게 해서 완전 동일한 환경에서 성능 테스트 비교

              • 노드8이 훠얼씬 빠르다.
      • Heap dump

        • 메모리 누수 추적이 어렵다.

          • 일주일마다 서버 재시작 (ㅋㅋ)

          • 크롬 개발자도구에서 Take Heap snapshot을 사용하여 할 수 있다.

            • Heapdump

            • shallow size

            • retained size

Node.js로 협력적 멀티태스킹 처리하기

Node.js 멀티태스킹 처리하기 (박일호님 - 카카오)

  • 고백

    • 적다고 할 수 없는 숫자의 데이터 마이그레이션 경험담
  • 마이그레이션을 하게된 이유

    • 다음 자동차 서비스를 담당하게 됨

      • 역할 1 : 오래된 기사를 마이그레이션 해라

        • 요구사항 분석

          • 구문서 파싱 및 가공

          • 어뷰징 제거

          • 연결된 정보들 처리 (예를들어 댓글)

          • 이 모든것을 안전하게 처리

        • 어떻게

          • DB를 읽고, 쓰고

          • 파일을 읽고, 쓰고

          • API를 호출하고

        • 결론

          • 비동기 요청들을 순차적으로 안전하게 처리해야한다.
      • 왜 노드로 마이그레이션을 ?

        • 노드를 좋아해서

          • 익숙하고, 충분히 마이그레이션 용도로 사용이 가능할 것 같아서
      • 시뮬레이션

        • 한개의 아티클르 처리하기 위해 필요한 비동기 요청 수는

          • 최소 8개 + 댓글 수 * 2 개의 리퀘스트가 필요
      • 그러나 실제 효율은 절반 이하

        • 댓글이 많은 기사에서는 효율이 많이 떨어진다.
      • 해결책

        • 병렬처리로 속도를 높이거나

        • 프로세스의 효율을 높이거나

      • 결국 동시성 문제를 해결해야 하는상황

        • 메시지 큐를 사용해 스케쥴링하고 병렬처리 하기로 결정!
      • 구현을 하면서

        • 비동기를 처리하는 대표적인 방법

          • CallBack

            • Callback Hell…
        • Promise

          • 가독성 좋아지고 예외처리 가능해진다.

          • promise.all 를 사용해서 순서를 보장

          • promise 를 써도 괜찮긴 하지만 …

            • 프로미스 객체가 메모리에 남아서 문제가 생긴다.
      • 메모리 이슈를 어떻게 풀까

        • 협력적 멀티 태스킹

          • 일종의 시분할 방식

          • 운영체제의 개입없이 task 가 독립적으로 CPU 사용

          • 미사용시 자발적 CPU 반환

          • 크리티카 섹션을 보호하기 위한 락이나 세마포 불필요

        • 구현방법의 선택

          • Coroutine

            • ES7 : async, await

            • Node.js 7.6 부터 공식적으로 지원

            • promise를 Wrapping한 것이라 promise 보다 느리다.

              • 그러나 여러개를 처리하는 쪽에서는 효율이 나쁘지 않다.

              • 병렬로 처리하기 때문에 처리하는 갯수가 많아질 수록 효율이 높아진다.

            • 장점

              • 코드 가독성이 좋아짐

              • 대규모 처리시 안전함