용어 정리

stateless app

  • 스테이트풀과 스테이트리스 비교, RedHat
  • 웹서버란 무엇인가? MDN : Stateless에 대한 설명이 나옴
  • stateless app, WhatIs.com : 스테이트리스 앱에 대한 정의 ( whatis.com 사이트는 기업 email 아이디가 있는 사람만 사용할수 있음. 폐쇄적임. 요건 다행히 오픈되어 있네..)
    • 한 세션에서 생성된 고객 데이터를 다음 세션에서 사용하기 위해 저장하는 일이 없는 어플리케이션 프로그램
      • 각 세션은 첫번째 방문인 것처럼 진행되며
      • 응답이 이전 세션으로부터의 데이타에 의존하지 않는다.
      • 반면에 스테이트풀 앱은 각 고객 세션의 데이타를 저장하고 그 고객이 다음번에 request를 하면 저장된 데이타를 사용한다
    • 어떤 앱이 스테이트리스할 때, 서버는 고객 세션에 대한 어떤 데이타도 저장하지 않는다.
      • 대신 세션 데이타는 고객측에 저장되며 필요할 때 서버로 전달된다.
      • 이 것은 offline first를 염두에 두고 앱을 개발할때 중요한 점이다.
      • 소프트웨어 개발에서 이런 접근방식에서는,
        • 인터넷 연결이 안될때에도, 유저 단말기에 세션데이타가 로컬로 저장되며
        • 인터넷 연결이 복구되면, 세션데이타가 클라우드로 업로드되어 복제된다.
  • 클라우드 컴퓨팅에서 수평적 확장(horizontal scalability)을 가능케하는 분산 아케텍처는..
    • 스테이트리스 앱과 그 구성요소에대한 새로운 관심을 불러일으켰다.
    • 그 이유중 하나는,
      • 앱의 구성요소가 스테이트리스하다면,
      • 오류가 발생할 때 그 구성요소들을 쉽게 재배포하고
      • 부하 변동을 수용하도록 확장할 수 있기 때문이다.
    • 또 다른 이유는,
      • 앱들이 스테이트리스하다면,
      • 그들은 API를 통해 서로 쉽게 연결될 수 있다.
  • 함수형 프로그래밍도 스테이트리스 앱에 대한 관심을 불러있으켰다.
    • 함수형 프로그래밍은 마이크로서비스나 containerization에 흔히 쓰인다.
    • 함수형 프로그래밍은 매우 작은 불변 코드의 단위들로 소프트웨어를 개발하는 접근방식이다
    • 각 함수는 마치 첫번째 인것처럼 그들의 task를 수행하며,
      • 프로그램내의 다른 함수를 인식은 하지만 의존하지는 않는다.
    • 모든 프로그램의 부품들이 스테이트리스하기 때문에,
      • 프로그래머들은 각 함수들을 다양한 방식으로 조합하더라도,
      • 의존성이 프로그램을 망가뜨리는 것을 걱정하지 않아도 된다.

번역 1개

JavaScript Is A Great Language - If You Use TypeScript, medium

  • 이제 우리가 Javascript에 대한 진실을 받아들여야 하는 시간이다
  • 저자 : Bill Wohlers

  • JavaScript는 미움을 많이 받습니다. Tom Brady도 마찬가지죠.( 톰 브래디는 NFL 최고의 쿼터백으로 미움을 많이 받는 것으로 유명)

세상에는 두가지 언어가 있다: 한 가지는 사람들이 불평하는 언어고 또 하나는 아무도 쓰지않는 언어이다.

– Bjarne Stroustrup, C++의 아버지

  • 당신이 JavaScript를 싫어한다면, 다음과 같은 3가지 이유중 하나일것이다.
    • 당신은 실제로 시도해본적이 없다.
      • 당신은 남을 얕보는 프로그래머가 Javascript에서 “5”와 5가 엄밀하지 않게 동등(loosely equal) 해서 안좋다고 말한것을 의문을 제기하지않고 귀담아 들었을 것이다.
      • 실제로 좋은 JavaScript 개발자는 느슨한 동치(loose equality)를 결코 사용하지 않는다.
      • 혹은 성능관련 이유로 나쁘게 말하는 것을 들었을수도 있다.
      • Node.js는 Java보다 약간만 느리다
    • 질좋은 코드를 작성하기 어렵다
      • 당신이 JavaScript를 시도해봤을때 아마도 구조적인 성격이 부족하다는 것을 발견했다.
      • 이것이 나뿐 코딩 습관을 부추긴다고 생각했을수 있다.
      • 만약 이것이 이유라면 이 글을 계속 읽어봐라
      • JavaScript를 읽기좋고 대규모로 확장할 수 있도록 작성하는 방법에 대해 배울수 있을 것이다.
    • 타입 시스템이 없다.
      • 이 글을 끝까지 읽어라.
      • JavaScript를 사용하는 가장 강력한 이유중에 하나는 TypeScript로 대체할 수 있기 때문이다.
  • 이제 당신은 당신이 어떤 위치에 서있는지 알게 되었다.
  • 아래에 당신이 다음 프로젝트에 Node.js를 사용해야 하는 3가지 이유가 있다.

1. JavaScript Is Great for Functional Programming

  • 누가 함수형 프로그래밍을 좋아하지 않겠는가?
  • JavaScript의 놀라운 유연성은 농담이 아니다 - 함수만으로 stateless app을 만들 수 있다.
  • JavaScript에서 함수형 스타일의 프로그래밍이 자연스럽도록 느끼게 만드는 이유중 하나는,
    • 문자열이나 숫자처럼, 함수가 1급 변수 (first-class variables)이기 때문이다.
  • 예를 들면:
    1
    2
    
    const addThree = (x) => x + 3;
    console.log(addThree(4)); // prints 7
    
  • 이 함수를 Array.map()함수에 입력하면,
  • array의 값들을 함수의 입력으로 받아 함수 출력으로 매핑시킨다
    1
    2
    3
    
    const arr = [3, 4, 5];
    const mappedArr = arr.map(addThree);
    console.log(mappedArr); // => [6, 7, 8]
    
  • 당신은 또한 다른 함수를 반환하는 함수도 작성할 수 있다:
    1
    
    const mapByAdding = (x) => (n) => n + x;
    
  • 이제, array에 임의의 숫자를 array의 각 요소에 더하도록 매핑할 수 있다
    1
    2
    3
    
    const arr = [3, 4, 5];
    const addFourToAll = arr.map(mapByAdding(4));
    console.log(addFourToAll); // => [7, 8, 9]
    
  • 다른 함수를 반환하는 함수는, 고차 함수(higher-order functions) 라고 불리는데,
    • 함수 스타일을 유지하면서도 강력한 추상화를 설계하는데 도움이 된다.
  • JavaScript 배열은 filter 메소드를 가지고 있는데, 조건자(predicate) 기능을 가지며,
    • 해당 predicate을 만족하는 요소들로만 구성된 array를 반환한다
      1
      2
      3
      
      const arr = [3, 4, 5];
      const oddNumbers = arr.filter((n) => n % 0 === 1);
      console.log(oddNumbers); // => [3, 5]
      
  • 별거아니지만( This is nothing to write home about ), prdicates들을 조합하는것이 얼마나 쉬운지 함 봐라
    • 이 함수는 두개의 predicates을 받아서 두 predicate이 모두 만족하면 true를 반환하는 또 다른 prediate을 반환한다.
      1
      2
      3
      
      const andPredicate = (pred1, pred2) => {
      return (el) => pred1(el) && pred2(el);
      }
      
  • 다른 함수안에 원하는 만큼 깊이 함수를 내포(nest)할 수도 있다.
    1
    2
    3
    4
    5
    6
    7
    
    function nextPerfectSquare(n) {
      function roudedUpSquareRoot(n) {
        return Math.ceil(math.sqrt(n));
      }
      const root = roundedUpSquareRoot(n);
      return root * root;
    }
    
  • 이 모든 기능은 – 더 많은 다른 기능들과 함께 – 아름답고 기능적인 JavaScript 코드로 복잡한 모듈을 작성하기 쉽도록 해준다.

2. JS Is Great for Asynchronous Programming