beb 07 - 6-2

Donghun Seol·2022년 10월 18일
0

코드스테이츠 BEB 07

목록 보기
21/39

coplit

사소한 부분에서 막혀 엄청 고생한다. 연습 또 연습...

자바스크립트는 몫 연산자가 없으니까 나눗셈시 항상 parseInt() 해주어야 한다.
(파이썬에서는 // 연산자로 가능했는데, JS는 해당 연산자를 주석표시로 사용한다.)

const binarySearch = function (arr, target) {

  let start = 0;
  let end = arr.length - 1;

  while (start <= end) {
    let center = parseInt((start + end) / 2)
    if (arr[center] === target) return center;
    else if (arr[center] < target) start = center + 1;
    else if (arr[center] > target) end = center - 1;
  }
  return -1;
};

sprint

express 프레임웍을 활용한 서버프로그래밍을 이미 공부하고 있어서 특별히 추가적으로 공부할 내용은 없었던 스프린트다.

이런 내용이 나올때마다 부트캠프의 취지에 맞게 페어분께 친절히 설명해 드리면서 스프린트를 함께 진행하곤 있지만 한편으로는 시간에 대한 아쉬움이 느껴지기도 한다.

스프린트 리뷰시간에 소개받은 좋은 아티클.

Bulletproof node.js project architecture

견고하고 유지보수가 쉽고, 테스트가 용이한 서버를 작성하기 위해서 따라야 할 아키텍쳐들에 대한 소개다.
모든 내용들을 이해하지는 못했지만, 일부 이해한 내용을 바탕으로 내 글로 풀어서 작성해 본다.

1. Use a service layer for your business logic 💼

비지니스 로직으로 컨트롤러로 부터 분리하여 서비스 레이어로 따로 뺀다.
서비스 레이어의 함수는 req를 직접 전달하지 않고, req에서 추출한 데이터만 전달한다.

2. Use a Pub/Sub layer too 🎙️

특정한 비즈니스 로직이 완료될 때 수반되는 비동기적 작업은 발행,구독 모델을 통해서 구현한다.
노드의 eventEmitter를 활용한다.

3. Dependency Injection 💉

의존성 주입이란 객체의 인스턴스를 생성할때, 객체의 생성자에 인스턴스가 의존해야하는 의존성 정보? 객체의 구체적인 정보를 주입하여 생성하는 것이다. 이를 통해서 객체의 호환성솨 유연성을 증가시킬 수 있다. 의존성 주입이 적용된 객체를 대상으로 유닛 테스트를 작성하기 편리하다.

아래의 코드는 express에 DI를 적용한 내용이다. 아직 완벽히 이해하지는 못했다.

route.post('/', 
  async (req, res, next) => {
    const userDTO = req.body;

    const userServiceInstance = Container.get(UserService) // Service locator

    const { user, company } = userServiceInstance.Signup(userDTO);

    return res.json({ user, company });
  });

4. Configurations and secrets 🤫

비밀키를 관리할때 .env를 활용하는데 변수명을 깔끔하게 활용하도록 별도의 파일에 관리하는 패턴
못생긴 process.env.Secret 이런 변수명을 활용할 필요 없이, 객체로 직관적으로 관리 할 수 있게 되었다.
./config/index.js 파일에 아래 내용과 같이 작성한다.

const dotenv = require('dotenv');
// config() will read your .env file, parse the contents, assign it to process.env.
dotenv.config();

export default {
  port: process.env.PORT,
  databaseURL: process.env.DATABASE_URI,
  paypal: {
    publicKey: process.env.PAYPAL_PUBLIC_KEY,
    secretKey: process.env.PAYPAL_SECRET_KEY,
  },
  paypal: {
    publicKey: process.env.PAYPAL_PUBLIC_KEY,
    secretKey: process.env.PAYPAL_SECRET_KEY,
  },
  mailchimp: {
    apiKey: process.env.MAILCHIMP_API_KEY,
    sender: process.env.MAILCHIMP_SENDER,
  }
}

5. Loaders 🏗️

express의 app.js 파일에는 서버를 시작할때 사용하는 많은 미들웨어, db, configuration 등이 뭉쳐있는데, 이를 분리해주는 패턴이다.

loaders는 세부항목별로 loader를 require한 형태의 파일이고, 거기서 관심사에 따라 분리된 loader를 취사 선택해서 load할 수 있다. db loader와 express loader, view engine loader 등등을 분리해 관리하면 편리하다.

분리가 완료된 app.js의 모습은 다음과 같다.

const loaders = require('./loaders');
const express = require('express');

async function startServer() {

  const app = express();

  await loaders.init({ expressApp: app });

  app.listen(process.env.PORT, err => {
    if (err) {
      console.log(err);
      return;
    }
    console.log(`Your server is ready !`);
  });
}

startServer();
profile
I'm going from failure to failure without losing enthusiasm

0개의 댓글