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

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

사전 과제 제출 #19

Open Edward-SI03 opened 1 year ago

Edward-SI03 commented 1 year ago

사전과제

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

let count = [0, 0, 0, 0];
function totalcount(data) {
  data.map((e) => {
    if (e.choice === 1) {
      ++count[0];
    } else if (e.choice === 2) {
      ++count[1];
    } else if (e.choice === 3) {
      ++count[2];
    } else if (e.choice === 4) {
      ++count[3];
    }
  });
  let totalcount = count[0] + count[1] + count[2] + count[3];
  return totalcount;
}

const VoteRepository = require("../repositories/vote.repository");

class VoteService {
  voteRepository = new VoteRepository();

  postVote = async (userKey, selectKey, choice) => {
    const isSelect = await this.voteRepository.findOneSelect(selectKey);

    if (!isSelect) throw new ErrorCustom(400, "해당 선택글이 존재하지 않습니다.");
    if (userKey === isSelect.userKey) throw new ErrorCustom(400, "본인 글에는 투표할 수 없습니다.");
    if (isSelect.completion === true) throw new ErrorCustom(400, "투표가 마감되었습니다.");

    const voteCheck = await this.voteRepository.findOneVote(selectKey, userKey);
    if (!voteCheck) {
      await this.voteRepository.createVote(selectKey, userKey, choice);

      let votePoint = await this.voteRepository.incrementPoint(userKey);
      const allVotes = await this.voteRepository.findAllVote(selectKey);
      const total = totalcount(allVotes);

      function rate(i) {
        const num = (count[i] / total) * 100;
        return Math.round(num * 100) / 100;
      }

      return {
        1: rate(0), 2: rate(1), 3: rate(2), 4: rate(3),
        total,
        isVote: choice,
        votePoint: votePoint.point,
      };
    } else {
      throw new ErrorCustom(400, "이미 투표를 실시했습니다.");
    }
  };
}

팀프로젝트를 진행 하면서 게시물에 투표를 실시하는 서비스 로직입니다. 다른 서비스 로직에서도 사용할 수 있게 총 투표수를 합산하는 함수를 만들어 사용했습니다. DB에서 게시물의 유무, 작성자의 게시물인지, 투표를 진행 했는지 등을 확인하여 게시물에 투표를 할 수 있도록 만들었습니다.

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

계층을 분리해서 관리하는 아키텍처 패턴 현재 가장 흔하게 사용되고 있는 아키텍처 패턴 중 하나 단순하고 대중적이면서 비용도 적게 들어 모든 어플리케이션의 사실상 표준 아키텍처 계층을 분리해서 유지하고, 각 계층이 자신의 바로 아래 계층에만 의존하게 만드는 것이 목표

3계층 아키텍처의 계층

계층형 아키텍처 패턴의 장점

3계층 아키텍처의 3가지 처리과정

  1. Controller : 어플리케이션의 가장 바깥 부분, 요청/응답을 처리함 클라이언트의 요청을 처리 한 후 서버에서 처리된 결과를 반환해주는 역할
  2. Service : 어플리케이션의 중간 부분, 실제 중요한 작동이 많이 일어나는 부분 아키텍처의 가장 핵심적인 비즈니스 로직이 수행되는 부분
  3. Repository : 어플리케이션의 가장 안쪽 부분, DB와 맞닿아 있음 실제 데이터베이스의 데이터에 접근

처리과정 플로우

  1. 클라이언트(Client)가 요청(Request)을 보낸다.
  2. 요청(Request)을 URL에 알맞은 컨트롤러(Controller)가 수신받는다.
  3. 컨트롤러(Controller)는 넘어온 요청을 처리하기 위해 서비스(Service)를 호출한다.
  4. 서비스(Service)는 필요한 데이터를 가져오기 위해 저장소(Repository)에게 데이터를 요청한다.
  5. 서비스(Service)는 저장소(Repository)에서 가져온 데이터를 가공하여 컨트롤러(Controller)에게 데이터를 넘긴다.
  6. 컨트롤러(Controller)는 서비스(Service)의 결과물(Response)을 클라이언트(Client)에게 전달해준다.

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

클래스간 의존성을 클래스 외부에서 주입하는 것을 뜻함 객체가 의존하는 또 다른 객체를 외부에서 선언하고 이를 주입받아 사용하는 것

의존성 주입의 장점

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

let arr = [1, 2, 3, 4, 5, 6];

// map 함수
let double = arr.map((x) => x * 2);
console.log(double); // [2, 4, 6, 8, 10, 12]

// filter 함수
let even = arr.filter((x) => x % 2 === 0);
console.log(even); // [2, 4, 6]

// reduce 함수
let add = arr.reduce((acc, cur) => acc + cur, 0);
console.log(add); // 21

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

type SomeFunctionReturnString = () => string;

function delay(f: SomeFunctionReturnString, seconds: number): Promise<string> {
  return new Promise((res, rej) => {
    setTimeout(() => {
      try {
        console.log(`after ${seconds} seconds`);
        res(f());
      } catch (err) {
        rej(err);
      }
    }, seconds * 1000);
  });
}

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

개발 공부를 시작한지 얼마 되지 않아 기초가 많이 부족한것을 알고 있기에, 다른 사람들은 어떤 방법으로 코드를 짜야는지 어떤 것이 더 옳고, 효율적인지 등 다양한 코드를 보면서 기본적인 지식을 늘리고 더 나은 코드를 만들고 싶습니다.