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

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

사전과제 제출 #21

Open bellsilver7 opened 1 year ago

bellsilver7 commented 1 year ago

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

function filecheck($filename, $type = 'img') {
    // 파일명 검증
    if (empty($filename)) {
        return false;
    }

    // 확장자 분리
    $tmp = explode('.', $filename);
    $ext = $tmp[1];

    // 파일 형식 설정
    $haystack = array();
    switch($ext) {
        case 'img':
            $haystack = array('jpg', 'jpeg', 'png', 'gif');
            break;
        case 'excel':
            $haystack = array('xlsx', 'xls', 'csv');
            break;
        // 필요한 파일형식 조건 추가
    }

    // 확장자 검증
    if (in_array($ext, $haystack)) {
        return true;
    }

    return false;
}

제 블로그 인기글 중에 있는 코드여서 올려봅니다.

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

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

의존성 주입(Dependency Injection, DI)은 프로그래밍에서 구성요소간의 종속성을 소스코드에서 설정하지 않고 외부의 설정파일 등을 통해 컴파일 시점이나 실행 시점에 주입하도록 하는 디자인 패턴 중의 하나이다. - 위키백과

  • 의존성을 낮춘다.
  • 코드의 재사용성을 높인다.
  • 테스트하기 좋은 코드가 된다.
  • 가독성이 높아진다.

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

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

// 익명 함수를 하나 만들어서 변수에 대입
$filter_even = function($item) {
    return ($item % 2) === 0;
};

// array_filter 내장 함수는 배열과 함수를 인자로 받는다.
$output = array_filter($input, $filter_even);

// 익명 함수를 변수에 할당해서 전달할 필요없이 이렇게 하는 것도 가능하다.
$output = array_filter($input, function($item) {
    return ($item % 2) == 0;
});

print_r($output);

PHP는 일급 함수(first-class function)를 지원합니다. 이는 함수가 변수에 할당될 수 있다는 것입니다. 사용자가 정의한 함수나 내장 함수 모두 변수에 의해서 참조될 수 있고 동적으로 호출될 수 있습니다. 함수는 다른 함수의 인자로 전달될 수 있고 함수가 다른 함수를 리턴값으로 리턴하는 것도 가능합니다. 이런 기능을 고차함수(Higher-order function)라고 합니다.

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) // 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로 접목하고 싶습니다.