Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

사전과제 제출 #52

Open
hoonn9 opened this issue Jan 7, 2023 · 0 comments
Open

사전과제 제출 #52

hoonn9 opened this issue Jan 7, 2023 · 0 comments
Assignees
Labels

Comments

@hoonn9
Copy link

hoonn9 commented Jan 7, 2023

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

  • Promise List를 Chunk 단위로 처리할 수 있는 함수입니다.
const makeChunkPromises = async <T>(
  batchSize: number,
  promises: Promise<T>[],
  delay?: number,
  callback?: (chunkResult: T[]) => any,
): Promise<Awaited<T>[][]> => {
  const result: Awaited<T>[][] = [];
  for (let index = 0; index < promises.length; index += batchSize) {
    const promiseChunk = promises.slice(index, index + batchSize);

    const chunkResult = await Promise.all(promiseChunk);
    await new Promise((resolve) => setTimeout(resolve, delay));

    if (callback) {
      callback(chunkResult);
    }

    result.push(chunkResult);
  }

  return result;
};

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

계층 아키텍처는 시스템이 수행하는 기능을 수평적 계층으로 나누어 각 계층의 기능을 분리시키는 아키텍처입니다.
각 계층은 기능을 수행하기 위해 하위 계층의 서비스를 요청하여 처리합니다. 처리할 때는 인터페이스를 사용하여 처리하고 다형성, 의존성 주입으로 서비스 결합도를 낮추고 쉽게 기능을 교체하고 테스트할 수 있습니다.
계층의 규모가 커지면 설계, 구현이 복잡해지기 때문에 오버엔지니어링 가능성이 있습니다.

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

의존성은 한 클래스가 코드를 실행하기 위해서 다른 클래스를 필요로 하는 상태를 말합니다. 코드가 실행될 때 의존 상태의 클래스와 함께 실행되기 때문에 의존 상태의 클래스가 변경되면 기능에 영향을 받습니다. 이러한 영향을 많이 받을수록 결합도(Coupling)이 높다고 합니다.

결합도가 높을수록 기능의 수정, 코드의 재사용은 어려워집니다. 그래서 결합도를 줄이는 설계를 해야합니다. 의존성주입(DI)은 결합도를 줄이는 방법 중 하나입니다. 클래스가 인터페이스에 의존하고 해당 인터페이스를 구현하는 클래스를 주입받는 개념입니다. 추상적인 인터페이스에 여러 클래스를 구현할 수 있기 때문에 다형성을 활용하여 코드 수정없이 기능의 교체가 가능해지고 테스트도 쉬워집니다.

이러한 DI 기능은 프레임워크 (NestJS, Spring 등)이 IoC(제어역전) 컨테이너 역할을 하여 사용자가 원하는 인스턴스를 주입해줍니다.

4. 본인이 사용하는 언어의 Functional Programming(함수형 프로그래밍) 스펙을 예제와 함께 소개해 주세요

자바스크립트는 일급 함수를 가졌기 때문에 함수형에 용이합니다.

  • 함수를 반환할 수 있으므로 고차함수를 만들 수 있습니다.
  • sum 함수를 실행하면 a 값이 설정된 상태의 새로운 함수를 반환 받을 수 있습니다. (커링)
// 고차함수
const sum = (a: number) => (b: number) => a + b;
// 커링
const twoPlus = sum(2);

const result = [1, 2, 3].map(twoPlus);
console.log(result);

5. (코드 작성) 다음 스펙을 만족하는 delay 함수를 작성해 주세요 (hint: Promise 사용)

  type SomeFunctionReturnString = () => string

    function delay(f: SomeFunctionReturnString, seconds: number): Promise<string> {
          return new Promise((resolve, reject) => {
    setTimeout(() => {
      try {
        resolve(f());
      } catch (error) {
        reject(error);
      }
    }, seconds * 1000);
  });
    };

    const success = () => {
      return "successfully done";
    };

    const fail = () => {
      throw new Error("failed");
    };

    delay(success, 2) // 2초 뒤에 successfully done 로그
      .then((res) => console.log(res))
      .catch((e) => console.log(e));

    delay(fail, 2) // 2초 뒤에 failed 로그
      .then((res) => console.log(res))
      .catch((e) => console.log(e));

결과값

    $ ts-node delay.ts
    successfully done
    Error: failed

6. 강의를 통해서 기대하는 바, 또는 얻고 싶은 팁을 적어주세요

이번 강의를 통해서 함수형 패러다임 사고를 늘리고 FP를 잘 이해하여 새로운 프로젝트에 적용해보고 싶습니다. 또 다양한 패러다임을 이해하고 프로젝트에 적용시킬 수 있는 개발자로 성장하고 싶습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants