코딩일상
항해 99과제 주특기심화과정5주차 본문
Q1. Class는 대체로 추상화를 위해 사용됩니다. ES5 자바스크립트에서 Class는 어떻게 동작할까요?
class는 동일한 항목들과 동일한 함수들을 가지고 있는 객체들을 생성하기 위해 사용된다.
객체를 만들어내기 위한 도구이다. ES5자바스크립트에서도 이 역할은 마찬가지이다.
그렇다면 객체를 만들어내는 이유는 객체에서 만들어진 인스턴스를 통해서 객체가 가진
메소드를 입맛에 맞게 사용할 수있기 때문이다.
추가로 추상화란 내부구현은 복잡한데 실제 노출되는 부분은 단순하게 보이도록 만든다는 개념이다.
이러한 추상화를 이루기 위해서 Class를 많이 사용되며 내부구현을 감추고 사람들이 필요한 것들만
보이게 만들어 줄수있게 한다.
아래 Class를 통하여 추상화의 개념을 조금 실행해보았다.
게시물 전체를 조회하는 하는 기능인데 추상화를 하고 나면 딱히 문법이나 메소드들 몰라도
이름자체에서 어떠한 기능들을 하는지 보여주어서 사람들이 필요한것들만 볼 수있게 되어 더 편해진다.
추상화(전)
router.get('/posts', async (req, res) => {
const Posts = await Post.findAll({
order: [['createdAt', 'DESC']],
attributes: ['postId', 'nickname', 'contents', 'title', 'createdAt'],
});
if (!Posts.length) {
return res.json({
success: false,
errorMessage: '게시글이 없습니다.',
});
}
res.json({
Posts,
});
});
추상화(후)
getPosts = async (req, res, next) => {
const posts = await this.postService.sortAllPost();
res.status(200).json({ data: posts });
};
sortAllpost의 내부 구성
sortAllPost = async () => {
// 저장소(Repository)에게 데이터를 요청합니다.
const allPost = await this.postRepository.findAllPost();
//불러 온 데이터가 없으면 게시글이 없다고 표현
if (!allPost.length) {
throw new Error({ errorMessage: '게시글이 없습니다.' });
}
// 호출한 Post들을 가장 최신 게시글 부터 정렬합니다.
allPost.sort((a, b) => {
return b.createdAt - a.createdAt;
});
// 비즈니스 로직을 수행한 후 사용자에게 보여줄 데이터를 가공합니다.
return allPost.map((post) => {
return {
postId: post.postId,
nickname: post.nickname,
title: post.title,
createdAt: post.createdAt,
};
Q2. Class는 var 변수처럼 호이스팅이 일어날까요?
호이스팅은 일어난다 하지만 선언과 초기화가 동시에 일어나지 않기에 var와 같이 undefiend를 내보내지 않고
refernce에러를 발생한다. 자세한 내용은 아래 글 참고
[Javascript] class도 호이스팅이 되나요(feat. lexical environment)
기억도 나지않는 어느 날엔가, 누군가 내게 제목과 같은 질문을 했다. "Javascript의 Class도 호이스팅이 되나요?" 그리고 내가 답했다. "네, Class도 당연히 호이스팅 됩니다." 그러자 질문자가 되물었
blinders.tistory.com
Q3. 현재 백엔드에서 가장 일반적으로 사용되는 테스팅 기법은 어떤게 있으며, 가장 효과적인 테스팅 방법은 무엇인가요?
테스팅을 왜 해야할까?
우선 테스팅을 하는 이유에 대해 이야기 하고 넘어가야한다 생각한다.
테스트 코드는 단순히 기능이 잘구현이 되었는지 놓쳤던 이슈들이 없었는지 체크하는 역할도 하지만,
기능을 구현하기전 추상적으로 우리가 이루어내고 싶은 기능에대해 테스트코드를 통해 목표를 잡을수있다.
이렇게 추상적으로 짜여져있던 목적을 코딩을 함으로써 구체화해가는게 진정한 테스트 코드의 목적이라고 생각한다.
예를 들어서 a=>c라는 기능을 만들고 싶다고 생각하면 우리는 테스트 코드로써 입출력값을 만들어냄으로써
만들어질 기능에 대한 목적을 정해줄수있기 때문이다. 사전에 정리한 테스트 코드들을 잘 통과해 낼수록
우리가 원하였던 목표에 가까운 기능을 코드로써 구현을 해내었기 때문이다.
본론
크게 위 사진 처럼 웹의 형태를 3가지 계층으로 나누어볼수가 있다.
1.프론트엔드(GUI)
2.API
3.DB
여기서 2,3번인 비즈니스 계층과 데이터베이스계층이 백엔드 영역에 있고, 이 두가지 영역에 대한 테스팅을 진행하는게
백엔드에서의 테스팅이라고 할 수있다.
테스팅의 과정은 아래 사진과 같다.
예상한 값을 나의 코드에 넣고난후 테스트를 거쳐 그게 내가 원하는 값과 일치하는 지 아닌지를 통해
테스팅결과가 나오게 된다.
테스터의 종류
1.단위테스트(Unit Test)
2.통합테스트(Integration Test)
3.E2E테스트(End to End Test)
단위테스트(UnitTest):
가장작은 규모의 기능을 테스트 한다.
독립적인 하나의 클래스(class)나 함수(function)을 테스팅하는것이다.
독립적이기 때문에 테스팅시에 예상치 못한 부작용들로 부터 비교적 자유롭다.
통합테스트(Integration Test)
여러가지 기능을 합쳤을때 생기는 문제를 방지하기 위한 테스트
단위테스트에 비해 복잡성이 올라간다.
그 이유는 코드블럭의 상호 의존성이 존재할 수도 있기에 개별적으로 잘되는것이
꼭, 같이 사용되었을때 잘 작동하는 것은 아니기 때문이다.
결국 각 모듈간의 상호작용이 잘되어 지는가를 확인하는 것이다.
E2E테스트(End to End Test)
끝에서 끝 즉 백엔드에서 부터 최종 웹페이지 까지 원하는대로 동작하며
원하는 데이터를 잘 보여주는지 확인하는것.
단순히 백엔드의 런타임환경을 벗어나 실제 실행이될 브라우저와 연결도 고려해야한다.
Q4. 각 객체 간 의존성/결합도가 높을수록 예상치 못한 문제(Side effect)가 발생할 가능성이 높아집니다. 이를 해결할 수 있는 Decoupling이라는 개념이 존재하는데 Decoupling을 위한 디자인 패턴은 어떤게 존재할까요?
Q5. 마이크로 서비스 아키텍쳐에서 서비스를 나눌 때 보통 각 서비스의 경계를 도메인으로 나눕니다. 도메인이란 뭘까요?
도메인이란 ip주소에 이름을 부여한것을 말한다. 예를 들면 아래와 같다.
- opentutorials.org -> 115.68.24.88
- naver.com -> 220.95.233.172
- daum.net -> 114.108.157.19
도메인의 구성은 위와같다.
위과정은 도메인에 접속해서 클라이언트가 요청을 발생시켰을때 응답을 다시 받을때 까지의 과정을 도메인중점으로 해서 본 과정이다.
도메인과 관련되 용어들은 위 와 사진에서와 같이 비유를 할 수있다.
웹사이트를 집이라고 비유했을때 집에 들어가기위해서는 주소가 필요하다.
그 주소를 웹상에서는 도메인이라고 생각하면 되며,
호스팅의 경우는 웹사이트가 계속유지될 수있을 공간이 필요한데 그것을 만들어주는것이다.
인터넷은 결국 집을 찾아가기위한 길이라고 볼수있다.
'Etc > 항해99과제' 카테고리의 다른 글
package.json이란?? (0) | 2022.07.31 |
---|---|
자바스크립트 기본형 데이터 와 참조형 데이터 (0) | 2022.07.21 |
JavaScript 객체와 불변성이란 ? (0) | 2022.07.21 |
호이스팅?? TDZ는 무엇일까 ? (0) | 2022.07.21 |
항해99 실습과제 (0) | 2022.07.20 |