항해 4주차 WIL

이병관·2021년 10월 10일
0
post-thumbnail
post-custom-banner

재충전의 시간


바쁘기도하고 평범하기도 했던 주특기 시간의 2주일이 지났다.
물론 내가 생각했을때는 너무 부족한 시간이였다.
조금 더 시간이 있었다면 MySql의 맛을 더 많이 보지 않앗을까?
조금 더 기능을 넣어볼수 있지 않았을까 하는 많은 아쉬움들이 가득한 시간이였다.

그만큼 너무나도 재밌는 시간이였다.

MiddleWare


미들웨어는 Nodejs Express의 꽃이라 할 수 있다.

"Middleware functions are functions that have access to the request object (req), the response object (res), and the next function in the application’s request-response cycle."

라고 공식 문서에 나온 소개처럼,
미들웨어 함수req(요청) 객체, res(응답) 객체, 그리고 요청-응답 사이클 도중 그 다음의 미들웨어 함수에 대한 엑세스 권한을 갖는 함수이다.

app.use(function(req, res, next) {
    req.testValue = '안녕하세요.';
    console.log('1번');
    next(); // 다음 middleware 실행
}, function(req, res, next) {
    console.log('2번');
    next(); // 다음 middleware 실행
});
 
app.get('/', function(req, res) {
    console.log('home', req.testValue);
    res.send('Home');
});
app.use('/path', router); // '/path'로 시작하는 경로의 
                         //경우에만 실행됩니다.
 
app.listen(3000);

해당 서버를 실행하면 콘솔이 3번 찍히는데,
다음과 같이 1번-2번- home안녕하세요 순으로 순차적으로 실행됨을 볼 수 있다.

조금 더 간단하게 말하자면
어떤 요청이 실행되고, 그 요청에 응답하기 전, 요청의 유효성을 처리하거나, 다른 함수를 통해 요청을 가공한 후 처리하는. 일종의 거쳐가는 함수이다

그리고 이번 심화주차에서 썻던것 처럼,
사용자가 요청한 이벤트를 실행하기전, 인가받은 사용자인지 인증한 뒤, 요청을 처리할지, 말지 하는 동작에서도 매우 유용하게 사용햇듯,


유저로그인 체크 API

다음과 같이 중간에 미들웨어를 삽입하여 사용할수 있다.

미들웨어는 다음과 같은 특징이 있는데,

  • 모든 코드를 실행한다.
  • Next()를 통한 다음 미들웨어 호출한다.
  • res, req 객체 변경할 수 있다.
  • 요청-응답 주기를 종료 한다

이러한 특징 덕에 인증 외에도 다른 사용법이 무궁무진하다.

Jest



그리고 이번주차에서는 나의 코드를 테스팅 하기위해 Jest라는것을 사용했는데,

Jest란?
자바스크립트 기반의 프레임워크로써,
코드가 잘 동작하는지 검증하기 위해 사용한다.
Jest내에 상황들을 작성한 뒤, 해당 상황에 어떠한 결과가 나올지 테스트한다.

사족이지만 나중에는 젠킨스도 다루어 봐야겠다 생각한다.

npm i -D jest babel-jest @babel/core @babel/preset-env

를 통해 jest로 테스트할 때 ES6이상의 문법을 사용하기 위해선 babel의 도움이 필요하기에 Babel도 같이 설치해준다.

"scripts": {
"test": "jest",
},

Package.json에, test실행시 jest로 실행할 수 있도록 설정한다.

**테스트 파일 작성시에는 이름.test.js로 저장해야한다.

자주쓰는 함수

let temp;
describe("Mcctest", () => {
  beforeEach(() => { //모든 테스트 전...
    temp = 1;
  });
  
  afterEach(() => {
    temp = 0;
  });
  
  test('1 is 1', () => {
    expect(1 `테스트할 코드`).toBe(1);
  });
  
  test('[1,2,3] is [1,2,3]', () => {
    expect([1,2,3]).toEqual(1);
  });
  
  test('add Correct or not', () => {
    exprct(add(3,5)).toBe(7)
  });
})
  • describe
    테스트 단위를 묶는 가장 큰 단위이다.
    테스트 시 describe에 설명된 내용으로 테스트 단위를 크게 분류 해준다.
  • test, it
    기본 테스트를 위한 함수.
    test와 it의 기능적 차이는 없지만 it의 경우 다른 테스트 워크 프레임에서 많이 사용하기 때문에 test와 it을 사용한다.

  • expect
    expect()안에 테스트할 변수나 값을 넣은 후 이후 toBe나 toEqual을 이용해 예측 값과 비교한다.

  • toBe, toEqual
    결과 예측의 값으로 많이 쓰인다.
    toBe는 단순 비교, toEqual은 배열이나 객체 내부까지 깊은 비교를 해준다.

  • beforeEach, afterEach
    beforeEach는 test()가 실행할 때마다 실행해주는 함수.
    afterEach의 경우 test()가 종료될 때마다 실행하는함수.
    따라서 위 예시에서 몇번의 테스트를 하더라도 temp는 1이 된다.

Mock

import User from "../model";

test("데이터가 없을 경우 빈배열 리턴", async () => {
  beforeEach(() => {
    User = new User();
  });
  
  global.fetch = jest.fn().mockImplementation(() => {
    return new Promise((resolve, reject) => {
      resolve({
        json: () => {
          return [];  // 빈배열 리턴
        },
      });
    });
  });

  const userId = await User.getId('test');
  expect(comments.length).toBe(0); // 리턴 값이 빈배열인지 확인
});

만약 user안의 User.getId()가 fetch를 통해 값을 가져 온다 가정했을때,
jest내에 fetch에 해당되는 임의의 함수로 만들어 줬기 때문에
User.getId()로 fetch를 호출하더라도 내가 임의로 만든 Mock함수가 호출된다.

따라서 fetch 호출시 백엔드 API와 상관없이 빈배열을 리턴하도록 만들 수 있다.

다만 백엔드 API의 함수를 사용하여 Mock를 실행하는 방법은 아직 익숙하지 않기 때문에 나중에 정리하고 다시 올려야 할것같다.

다음주는 진정한 시작

다음주부터 프론트앤드 3분과 우리 백앤드 분들 3명이 모여 작은 프로젝트를 시작한다...

아마 첫주차에 바로 확 들어갔던 과제보다는 조금 부담감이 덜긴 하지만 그래도 혹시 모르는게 사람일이다.

그렇기에 팀편성이 되자마자 사람들을 토닥토닥 다독이며 완벽하게 수행 할 수 있도록 노력해야겠다.

잘하는것이 중요한것이 아니라 꾸준하게 노력하는 사람이 잘한다는것을 잊지 말자.

profile
뜨겁고 매콤하고 화끈하게
post-custom-banner

0개의 댓글