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

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

사전과제 제출 #33

Open ChoiRamsey opened 1 year ago

ChoiRamsey commented 1 year ago

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

공공 api를 활용하여 필요한 정보를 가져온 후 가공하는 코드입니다. 출근시간대 특정 버스 이용객 수를 가져오는데, 출근시간대에 맞춰 정보를 가공했습니다. 공유라기보다는 많이 부족해서 리마인드할 겸, 혹시 피드백을 받을 수 있을까 해서 올려봅니다.

const getPassengersByLine = async(busNum) => {
  const today = new Date();
  const thisYear = today.getFullYear();
  const thisMonth = '0' + (today.getMonth() - 1);
  const yyyymm = String(thisYear) + String(thisMonth);

  let howManyPassenger = await fetch(
    `http://openapi.seoul.go.kr:8088/${process.env.SEOUL_KEY}/json/CardBusTimeNew/1/5/${yyyymm}/${busNum}`,
    {
      method : "get"
    }
  );

  const response = await howManyPassenger.json();

  if (!response.CardBusTimeNew) {
    const err = new Error("유효하지 않은 정보입니다.");
    err.statusCode = 400;
    throw err;
  } else {
    const coreInfo = response["CardBusTimeNew"]["row"]
    let result = [];

    for(let i = 0; i < coreInfo.length; i++) {
      result[i] = {
      ["버스정류장명"] : coreInfo[i]["BUS_STA_NM"],
      ["6시 하차 승객 수"] : coreInfo[i]["SIX_ALIGHT_NUM"],
      ["6시 승차 승객 수"] : coreInfo[i]["SIX_RIDE_NUM"],
      ["7시 승차 승객 수"] : coreInfo[i]["SEVEN_RIDE_NUM"],
      ["7시 하차 승객 수"] : coreInfo[i]["SEVEN_ALIGHT_NUM"],
      ["8시 승차 승객 수"] : coreInfo[i]["EIGHT_RIDE_NUM"],
      ["8시 하차 승객 수"] : coreInfo[i]["EIGHT_ALIGHT_NUM"],
      ["9시 승차 승객 수"] : coreInfo[i]["NINE_RIDE_NUM"],
      ["9시 하차 승객 수"] : coreInfo[i]["NINE_ALIGHT_NUM"]
      };
  };
  return result;
  };
};

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

코드를 한 파일에 몰아 넣으면 가독성이 떨어질 뿐 아니라 프로젝트가 커질 수록 파일이 계속해서 무거워지기 때문에 유지보수와 확장성에도 좋지 않습니다. 이에 따라 코드를 모듈화 하여 계층(레이어)에 맞는 코드를 나눠 작성하는 구조입니다. 보통 클라이언트에서 요청을 하면 요청에 맞는 router로 전송이 된 후, controller단에서 router를 거쳐 들어온 코드를 받아 키 에러 등 누락된 것이 없는지 확인한 후에 service단에서 비즈니스 로직을 통과합니다.(아이디/비밀번호 검증, 기타 서비스 관련 코드) 그 후 데이터가 필요하면 dao단에서 db에 데이터를 받아온 후 다시 클라이언트 쪽으로 단계별로 전송하는 구조입니다.

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

의존성은 하나의 코드가 다른 코드에 의존하는 상태를 말하는데, 만약 a코드가 b코드를 사용한다면 'a코드는 b코드에 의존하고 있다'고 할 수 있습니다. a코드는 b코드를 사용하기 위해 a코드 내부에서 직접 만들 수 있는데 이 경우 b코드와의 결합은 강해집니다. 반면에 외부에서 b코드를 만들고, a코드는 이를 주입받아 사용할 수 있는데 이 경우를 의존성 주입이라고 할 수 있습니다.

전자는 개발자가 모든 코드를 직접 제어하는 반면에, IoC(제어역전)가 발생하면 제어하는 주체가 바뀝니다. 즉, a가 b를 직접 참조했다면 IoC가 발생하면 매개체가 제어 주체가 되어 a, b코드를 제어하게 됩니다. 매개체는 IoC 컨테이너라고 하며 보통 프레임워크가 그 역할을 합니다.(nest.js, 스프링 등) IoC 컨테이너는 제어권을 사용하여 의존성 관리, 인스턴스 생성 및 주입, 메모리 해제의 역할을 합니다.

의존성 주입이 일어나면 외부 코드를 사용하기 때문에 코드의 유지보수와 재사용성이 용이해지며, 코드의 양 또한 감소합니다.

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

javascript를 사용 중입니다. 함수형 프로그래밍에서는 순수함수를 사용하는 것으로 알고 있습니다. map, filter, reduce 메소드를 예로 들 수 있습니다.

//map 메소드 사용
const arr = [1, 2, 3, 4, 5];
const result = arr.map(x => x * 10);
// [10, 20, 30, 40, 50]

map 메소드를 사용하면 원본 배열에 변화가 없고, map의 대상 배열 외의 사용 변수가 없습니다. 함수형 프로그래밍 경험이 없어서 이번에 배워서 학습할 계획입니다.

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(err) {
        reject(err);
      }
    }, 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. 강의를 통해서 기대하는 바, 또는 얻고 싶은 팁을 적어주세요

취준생으로서 여러 채용공고를 보면 typescript와 nest.js가 정말 많이 사용된다는 것을 느꼈습니다. 부트캠프에서 javascript, node.js 기반의 백엔드 기술을 학습했는데 취업 문이 좁게 느껴져서 답답한 면이 있었는데, 이번 기회에 새로운 기술들을 배워 역량을 키우고 싶습니다. 또한 함수형 프로그래밍이나 의존성 주입 등 생소한 내용이 많아서 공부에 대한 부담이 많은게 사실이지만 즐거운 마음으로 새로운 공부를 시작해볼까 합니다. 신입 개발자가 알아야 하는 실무에서 많이 쓰는 기술이 있다면 알고 싶습니다!