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

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

사전 과제 제출 #59

Open 2jun0 opened 1 year ago

2jun0 commented 1 year ago

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

우아한 테크코스를 지원할때 제출했던 과제에서 가져온 코드입니다.
void -> T 형태의 람다식을 받아 예외가 터지지 않을때까지 다시 받아오는 기능입니다.
자바로 람다식을 처음으로 의미있게 써본 경험이 떠올라 공유합니다.

private <T> T repeatInputUntilSuccess(Supplier<T> callback) {
    while (true) {
        try {
            return callback.get();
        } catch (IllegalArgumentException e) {
            println("[ERROR] %s", e.getMessage());
        }
    }
}

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

애플리케이션을 계층별로 나누는 코드 작성 방식이다.
여러 가지 방식이 있지만 핵심은 코드를 최대한 분리해 개방폐쇄원칙을 지키려 하는 것이다.

예컨데 어떤 엔터프라이즈 서비스 아키텍처가
Presentation - Domain - Data Access - Data로 이루어져 있다고 하면

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

의존성 주입은 의존 객체 주입이라고도 하며, 컴파일 타임이 아닌 런타임에 어떤 오브젝트가 어떤 오브젝트를 사용할지를 결정해 주는 것이다.

의존성 주입을 하면서 얻는 이점은 오브젝트가 자신이 사용하고자 하는 다른 오브젝트의 생성과정에 대해 알 필요가 없다는 점이다.

덕분에 의존성 주입을 받은 오브젝트들은 객체의 사용에 초점을 두고 작성할 수 있고,
의존성 주입을 해주는 오브젝트로 각종 오브젝트의 연관관계를 따로 관리할 수 있게 된다.

이렇게 역할을 분리하는 것은 리팩토링의 핵심으로, 코드를 수정할때 적은 부분만 수정할 수 있게 해주며 기능을 확장할 때도 적은 변경이 동반된다.

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

자바에는 Stream<T> 클래스로 함수형을 적극적으로 지원하고 있다.

이전 버전과의 호환 문제 때문에 Collection -> Stream이나 배열 -> Stream이 다소 귀찮은 점은 있지만, 여전히 강력한 기능으로 자리잡았다.
Stream에는 filter, reduce, map, count, forEach 등의 기능을 지원하며
IntStream같은 기본형 전용 클래스를 사용하면 max, min, sum, avg 같은 기능도 지원한다.

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

자바스크립트를 쓰며 함수형 프로그래밍을 언젠가 써본 경험은 있었지만, 실제로 자바에서 함수형 프로그래밍을 본격적으로 접해보았다.

이번 강의를 통해서 함수형 프로그래밍의 개념에 대해 더 꼼꼼히 배우고,
원리나 JS에서는 어떻게 사용하는지에 대해 배우고 싶다.