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

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

사전과제 제출 #43

Open windowdong11 opened 1 year ago

windowdong11 commented 1 year ago
  1. 본인이 작성했던 코드 중 공유하고 싶은 코드를 이유와 함께 마크다운 code block 을 사용해 올려주세요
    오브젝트의 속성 이름을 변경할 때, 사용하기 위한 타입입니다.
    DB 모델의 속성과 Endpoint에서 요구하는 속성의 이름이 다를 때, 타입을 두 개를 만들어줘야 합니다.
    이때 하드코딩하는 방법도 존재하지만, 하드코딩 보다는 타입을 확장해서 사용하는 것이 미래에 코드가 수정이 될 때, 동적인 코드가 변경할 것이 더 적을 것이다 라고 판단하여 작성하게 되었습니다.

    export type RenameProperties<
    T extends {},
    M extends { [key: string]: keyof T }
    > = {
    } & {
    };
  2. Layered Architecture(계층 아키텍처)에 대해서 설명해 주세요
    Persistance, Service, Presentation 레이어 등 여러 레이어로 나누어지는 아키텍쳐입니다.
    예를 들어, Persistance에서는 DB에 대한 쿼리 로직, Service에서는 요청을 처리하는 로직, Presentation에서는 데이터를 보여주는 로직 등으로 분리하면, 각 레이어에서 자신이 맡은 일을 정확하게 하고 다음 레이어로 데이터를 전달하면 다음 레이어에서 자신의 역할을 다하고 또 다음 레이어로 전달하는 형태로 구조가 되어 있습니다.
    이것은 관심사의 분리를 통해 역할을 적절하게 나누어 각 레이어의 작업을 명확하게 할 수 있습니다.

  3. Dependency Injection(의존성 주입)의 개념과 함께, 왜 필요한지 작성해 주세요 어떤 클래스 A가 B에 대해 의존성을 가지고 있을 때, B의 기능이 변경되면, A 또한 변경됩니다.
    이러한 A와 B의 의존성을 분리하기 위해서 사용하는 것이 DI입니다.
    DI는 A가 가지는 의존성을 B 뿐만 아니라, C, D 등 다른 객체에도 적용할 수 있도록 해줍니다.
    이것은 A의 객체를 생성할 때 다른 객체를 넣어주거나, 저장된 객체를 변경해주는 메서드를 통해서 구현되고는 합니다.
    이러한 행위는 의존성을 외부에서 정해주는 것으로 보여지고 의존성 주입이라는 용어로서 나타나게 되었습니다.
    DI는 의존성을 느슨하게 해주고, 덕분에 재사용성이 높은 코드 작성을 가능하게 해 줍니다.
    하나의 예로 콘서트의 정보를 나타낼 때, List 클래스가 존재하고, 여기에 Timeline을 주입하면, Timeline List가 되고, Artist를 주입하면, Artist List가 되기도 합니다.
    이처럼 DI를 통해 재사용성이 좋은 코드를 작성할 수 있습니다.

  4. 본인이 사용하는 언어의 Functional Programming(함수형 프로그래밍) 스펙을 예제와 함께 소개해 주세요 Array.prototype.map, Array.prototype.forEach 등 JS(TS)에서 기본적으로 지원하는 메서드가 많이 존재합니다.
    이러한 함수들은 아래와 같이 사용이 가능합니다.

    function adder(add: number) {
    return (num: number) => num + add
    }
    const add10 = adder(10);
    console.log(add10(20));
    console.log([1, 2, 3].map(add10));
  5. (코드 작성) 다음 스펙을 만족하는 delay 함수를 작성해 주세요 (hint: Promise 사용)

    
    type SomeFunctionReturnString = () => string

function delay(f: SomeFunctionReturnString, seconds: number): Promise { // 해당 함수 내부를 구현해 주세요 return new Promise((resolve, reject) => { setTimeout(() => { try { resolve(f()); } catch (error) { reject(error); } }, seconds); }); };

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

8. 강의를 통해서 기대하는 바, 또는 얻고 싶은 팁을 적어주세요
혼자서 공부를 하면서 알지 못한 부분들에 대해서 얻어가고 싶고, 작은 프로젝트를 할 때에는 "이것이 필요한가? 중요한가?" 의문이 들었던 부분들 중 특히 실무에서 꼭 필요로 하는 부분들을 얻어가고 주니어 개발자로서의 역량을 키우고 싶습니다.