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

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

사전과제 제출 #40

Open zinzoddari opened 1 year ago

zinzoddari commented 1 year ago

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

public static String awards(Cars cars) {
    for (Car car : cars.getCar()) {
        if(car.getDistance() == maxDistance) {
            winner += car.getName() + ",";
        }

        else if(car.getDistance() > maxDistance) {
            maxDistance = car.getDistance();

            winner = car.getName() + ",";
        }
    }

    return winner.substring(0, winner.length() - 1);
}
public static String awards(Cars cars) {
    int maxDistance = cars.getCar().stream()
        .mapToInt(v -> v.getDistance())
        .max()
        .getAsInt();

    cars.getCar().stream()
        .filter(car -> car.getDistance() == maxDistance)
        .collect(Collectors.toList())
        .forEach(car -> {
            winner += car.getName() + ",";
        });

    return winner.substring(0, winner.length() - 1);
}

리팩토링을 진행하면서 기존 소스를 stream API를 이용하여 람다식으로 구현을 해 보았습니다. 매번 예제를 보며 따라치다가 제가 직접 생각하고 작성한 코드라 인상 깊어 선정하게 되었습니다.

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

계층형 아키텍쳐는, component들이 각 레이어에 맞게 수평적으로 구조화 되어 있다. 구성되는 계층의 숫자에 따라 N 계층 아키텍처라고 부를 수도 있다. 레이어가 정확히 몇 개로 구성 되어 있다 정할 수 없지만, 크게 3계층과 4계층 구조를 이루고 있다.

또는 정확한 레이어 구성이 정해진게 아니기에 business 와 persistence 사이에 service 계층이 추가 되어 사용 될 수 있다.

장점으로는

  1. 효과적인 개발과 테스트가 가능하고 유지 관리도 할 수 있다.
  2. 계층이 분리되어 있기에 각각 따로 동시에 개발 할 수 있다.
  3. 분리되어 있기에 수정이나 확장에 다른 계층에 영향을 주지 않는다.
  4. 데이터 계층이 분리되어 있어서 보안 강화 가능하다.

[참고] https://velog.io/@hojin11choi/TIL-%EA%B3%84%EC%B8%B5%ED%98%95-%EC%95%84%ED%82%A4%ED%85%8D%EC%B3%90-Layered-Architecture

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

의존성 주입이란. 외부에서 두 객체간의 관계를 결정해주는 디자인 패턴. 먼저 의존성이란 클래스간에 의존 관계가 있다는 것을 의미한다. 이 의존 관계라는 것은, 한 클래스가 바뀌게 되면 다른 클래스에 영향을 받는 것을 의미한다.

주입이란, 클래스 외부에서 객체를 생성하여 해당 객체를 클래스 내부에 주입하는 것을 의미한다.

그렇기에 의존성 주입을 하게 되면, 클래스간의 결합도가 약해지게 되면서, 한 쪽 클래스가 변경 될 경우 다른 한 쪽의 클래스 변경될 필요성이 적어진다는 것이다.

클래스간의 결합도까 작아져 유연성과 확장성을 향상 시킬 수 있으며, 인터페이스 기반 설계에 테스트 및 코드의 재사용성을 높여줘 리팩토링에 용이하다.

[참고] https://kotlinworld.com/64

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

public BallStatus play(Ball input) {
    return balls.stream()
        .map(answer -> answer.play(input))
        .filter(BallStatus::isNotNoting)
        .findFirst()
        .orElse(BallStatus.NOTING);
}

자바에서도 8버전부터 람다식이 도입되면서 대표적으로 Stream API을 통해 함수형 프로그램밍이 가능해졌습니다. Stream의 특징으로는, 원본 값을 유지하되, 데이터를 활용 할 수 있다는 것 입니다. 또, 단점으로는 어디 부분에서 오류가 났는지 디버깅이 어렵다는 것 입니다.

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 (error) {
                reject("" + error);
            }
        }, seconds * 1000);
    });
};

const success = () => {
  return "successfully done";
};

const fail = () => {
  throw new Error("failed");
};

console.log("after 2 seconds");

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

아직 함수형 프로그래밍이 낯설어 쓰려고해도 주춤거리고 결국 기존 방법대로 사용하고 있기에, 이번 강의를 통해 자신있게 코드를 작성할 수 있도록 발전하고 싶습니다. 그리고 이런 강의 자체가 처음이라 강의 마지막이 되었을때, 배움에 있어서 내가 성장했구나라는 뿌듯함을 느껴보고 싶습니다 ☺️👍🏻