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계층 아키텍처의 계층
프레젠테이션 계층 (Presentation Layer)
비즈니스 로직 계층 (Business Logic Layer)
데이터 엑세스 계층 (Persistence Layer)
계층형 아키텍처 패턴의 장점
각 계층별로 의존성이 낮아 모듈을 교체하더라도 코드 수정이 용이함
각 계층별로 단위 테스트를 작성할 수 있어 테스트 코드를 조금 더 용이하게 구성할 수 있음
3계층 아키텍처의 3가지 처리과정
Controller : 어플리케이션의 가장 바깥 부분, 요청/응답을 처리함
클라이언트의 요청을 처리 한 후 서버에서 처리된 결과를 반환해주는 역할
Service : 어플리케이션의 중간 부분, 실제 중요한 작동이 많이 일어나는 부분
아키텍처의 가장 핵심적인 비즈니스 로직이 수행되는 부분
Repository : 어플리케이션의 가장 안쪽 부분, DB와 맞닿아 있음
실제 데이터베이스의 데이터에 접근
처리과정 플로우
클라이언트(Client)가 요청(Request)을 보낸다.
요청(Request)을 URL에 알맞은 컨트롤러(Controller)가 수신받는다.
컨트롤러(Controller)는 넘어온 요청을 처리하기 위해 서비스(Service)를 호출한다.
서비스(Service)는 필요한 데이터를 가져오기 위해 저장소(Repository)에게 데이터를 요청한다.
서비스(Service)는 저장소(Repository)에서 가져온 데이터를 가공하여 컨트롤러(Controller)에게 데이터를 넘긴다.
사전과제
1. 본인이 작성했던 코드 중 공유하고 싶은 코드를 이유와 함께 마크다운 코드블락을 사용해 올려주세요
팀프로젝트를 진행 하면서 게시물에 투표를 실시하는 서비스 로직입니다. 다른 서비스 로직에서도 사용할 수 있게 총 투표수를 합산하는 함수를 만들어 사용했습니다. DB에서 게시물의 유무, 작성자의 게시물인지, 투표를 진행 했는지 등을 확인하여 게시물에 투표를 할 수 있도록 만들었습니다.
2. Layered Architecture(계층 아키텍처)에 대해서 설명해 주세요
계층을 분리해서 관리하는 아키텍처 패턴 현재 가장 흔하게 사용되고 있는 아키텍처 패턴 중 하나 단순하고 대중적이면서 비용도 적게 들어 모든 어플리케이션의 사실상 표준 아키텍처 계층을 분리해서 유지하고, 각 계층이 자신의 바로 아래 계층에만 의존하게 만드는 것이 목표
3계층 아키텍처의 계층
계층형 아키텍처 패턴의 장점
3계층 아키텍처의 3가지 처리과정
처리과정 플로우
3. Dependency Injection(의존성 주입)의 개념과 함께, 왜 필요한지 작성해 주세요
클래스간 의존성을 클래스 외부에서 주입하는 것을 뜻함 객체가 의존하는 또 다른 객체를 외부에서 선언하고 이를 주입받아 사용하는 것
의존성 주입의 장점
4. 본인이 사용하는 언어의 Functional Programming(함수형 프로그래밍) 스펙을 예제와 함께 소개해 주세요
5. (코드 작성) 다음 스펙을 만족하는 delay 함수를 작성해 주세요 (hint: Promise 사용)
결과값
6. 강의를 통해서 기대하는 바, 또는 얻고 싶은 팁을 적어주세요
개발 공부를 시작한지 얼마 되지 않아 기초가 많이 부족한것을 알고 있기에, 다른 사람들은 어떤 방법으로 코드를 짜야는지 어떤 것이 더 옳고, 효율적인지 등 다양한 코드를 보면서 기본적인 지식을 늘리고 더 나은 코드를 만들고 싶습니다.