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

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

사전과제 제출 #20

Open daye9005kim opened 1 year ago

daye9005kim commented 1 year ago

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

//controller
//인가코드와 state로 네이버 oAuth 토큰 가져오기(NestJS)
@Post('naver/token')
  async getToken(@Body() { code, state }: NaverGetCode) {
    const result = await this.authService.getNaverToken(code, state);
    if (result === false) {
      return '네이버 토큰발급 실패';
    }
    return `네이버 토큰 발급 성공`;
  }
//service
//async await 사용
export class AuthService {
   async getNaverToken(code: string, state: string) {
       const data: any = {
         grant_type: 'authorization_code',
         client_id: process.env.NAVER_ID,
         client_secret: process.env.NAVER_PW,
         code,
         state,
       };
       const response: any = await this.tokenFetch(data);
       return response;
   }

  async tokenFetch(data: any) {
    const queryString = Object.keys(data)
      .map(
        (k: any) => encodeURIComponent(k) + '=' + encodeURIComponent(data[k]),
      )
      .join('&');

    const url = 'https://nid.naver.com/oauth2.0/token?' + queryString;
    const response = await fetch(url, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(data),
    }).then((res) => res.json());

    return response;
  }
}

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

특정 역할로 구분되는, 예를 들어 화면 UI/비즈니스 로직/DB 작업등의 각각의 계층으로 설계하여 각 계층에 해당하는 역할만 수행하고 이 계층은 수직적으로 연결되어 있다. 유지보수와 확장 및 테스트가 쉽다는 장점이 있지만 단일 개체 서비스에서는 불필요한 연결과 의존하는 개체가 많아져 변경에 영향을 많이 받는 코드가 될 수 있다.

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

소스 코드의 수정, 변경 등에 영향을 많이 받는 강하게 결합된 클래스들을 분리하고, 애플리케이션 실행 시점에 객체 간의 관계를 결정해 줌으로써 결합도를 낮추고 유연성을 확보할 수 있다.

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

<?php
//$min 보다 큰 항목만 걸러내는 익명 필터 함수
function criteria_greater_than($min)
{
    return function($item) use ($min) {
        return $item > $min;
    };
}

$input = [1, 2, 3, 4, 5, 6];

// 동적으로 만들어낸 필터 함수를 array_filter 에 전달해서 입력을 필터링한다.
$output = array_filter($input, criteria_greater_than(3));

print_r($output); // 3보다 큰 숫자만 출력된다.

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

type SomeFunctionReturnString = () => string

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

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

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

NestJS 개념과 구조를 이해하고 새로 만들 애플리케이션에 적절한 방법을 찾아 잘~ 적용하고 싶습니다.