Jun4928 / wanted-pre-onboarding-challenge-BE-task-JAN.2023

JAN.2023 wanted 프리온보딩 챌린지 BE 사전과제
29 stars 36 forks source link

사전과제 제출 #58

Open Jureamer opened 1 year ago

Jureamer commented 1 year ago

함수형 프로그래밍, 실무에서 사용할 수 있나요? (feat. TypeScript, Nest.js)

해당 코스는 아래와 같은 주제로 진행돼요

사전과제 진행 가이드

사전과제

  1. 본인이 작성했던 코드 중 공유하고 싶은 코드를 이유와 함께 마크다운 코드블락을 사용해 올려주세요

    const go = (...args) => reduce((a, f) => f(a), args);
    
    const curry = f => (a, ..._) => _.length ? f(a, ..._) : (..._) => f(a, ..._);
    const map = curry((f, iter) => {
      let res = [];
      for (const a of iter) {
          res.push(f(a))
      }
    
      return res
    })
    
    let reduce = curry((f, acc, iter) => {
      if (!iter) {
          iter = acc[Symbol.iterator]()
          acc = iter.next().value;
      }
    
      for (const a of iter) {
          acc = f(acc, a)
      }
      return acc
    })
    
    const queryStr = obj => go(
      obj,
      Object.entries,
      map((k, v) => `${k}=${v}`),
      reduce((a, b) => `${a}&${b}`)
    )
    // -> limit=10&offset=10&type=notice
    
    log(queryStr({ limit: 10, offset: 10, type: 'notice'}));

    함수형 프로그래밍 함수를 배우면서 처음 만들어본 형태이기에 기억이 남아 공유하고 싶었습니다.

  2. Layered Architecture(계층 아키텍처)에 대해서 설명해 주세요

계층형 아키텍쳐란 계층을 특성에 따라 여러 계층을 나누어 계층간의 결합도를 낮추고 동일 계층끼리의 응집도를 높이는 방식이다. 이를 통해 관심사 분리모듈 교체를 용이하게 만들고 테스트를 쉽게할 수 있게 만든다.

계층의 종류 예시

  1. Dependency Injection(의존성 주입)의 개념과 함께, 왜 필요한지 작성해 주세요

    A가 B에 의존하게 되면 B가 바뀔 때 A도 따라 바뀌어야한다. 이는 코드가 바뀔 때 관리포인트가 늘어나게 되어 결합도가 높아지고 코드의 확장성을 저해한다. 이를 interface 등을 활용하여 외부에서 의존성을 주입함으로써 결합도를 낮출 수 있다. 이를 통해 코드의 재사용성이 높아지고 가독성이 높아지는 등의 장점이 있다.

  2. 본인이 사용하는 언어의 Functional Programming(함수형 프로그래밍) 스펙을 예제와 함께 소개해 주세요
const queryStr = obj => go(
    obj,
    Object.entries,
    map((k, v) => `${k}=${v}`),
    reduce((a, b) => `${a}&${b}`)
)
// -> limit=10&offset=10&type=notice

log(queryStr({ limit: 10, offset: 10, type: 'notice'}));
  1. (코드 작성) 다음 스펙을 만족하는 delay 함수를 작성해 주세요 (hint: Promise 사용)

    type SomeFunctionReturnString = () => string
    
    function delay(f: SomeFunctionReturnString, seconds: number): Promise<string> {
      return new Promise<string>((resolve, reject) => {
        setTimeout(() => {
          try {
            resolve(f())
          } catch (e) {
            reject(e)
          }
        }, seconds * 1000)
      })
    };
    
    const success = () => {
      return "successfully done";
    };
    
    const fail = () => {
      throw new Error("failed");
    };
    
    delay(success, 2)
      .then((res) => console.log(res))
      .catch((e) => console.log(e));
    
    delay(fail, 2)
      .then((res) => console.log(res))
      .catch((e) => console.log(e));

    결과값

    $ ts-node delay.ts
    after 2 seconds
    successfully done
    Error: failed
  2. 강의를 통해서 기대하는 바, 또는 얻고 싶은 팁을 적어주세요
    • 타입스크립트 및 NestJS로 함수형 프로그래밍 적용
    • 함수형 프로그래밍으로 기존 프로젝트 리팩토링