Til Home

2020-09-18-TIL

Fact

  • todo-list backend 부분을 작성을 했다
  • 구현 기능은

    • 로그인/로그아웃/회원가입
    • todolist
    • crud
    • 위 기능들을 위한 mysqldb
    • integration test/ unit test

Feelings

  • 오랜만에 테스트를 제대로 짜서 그런지 재미 있었지만 역시 힘들었다.
  • 너무 급하게 구현 하느라 학습을 제대로 못한 느낌이다.

Findings

supertest

  • supertest 할때 바로 거치지 않고 chaining을 통해서 값을 확인 할 수 있다.
const {body, statusCode} = request(app)
          .post('/auth/login')
          .send({ email, password })

expect(body).toBe(result);
expect(statusCode).toBe(200);

// 위에꺼 대신

request(app)
          .post('/auth/login')
          .send({ email, password })
          .expect(200, { result })

근데 이게 요청을 하지 않아서 그런지 middleware들을 거치지 않는다. npm test — —coverage 하면 거쳐 가지 않았다고 알 수 있다. 음…

mysql 설치

sudo apt-get install mysql-server
sudo ufw allow mysql
외부에서 접속할 수 있도록 mysql 포트(3306)를 열어줘야 합니다.

sudo systemctl start mysql

sudo systemctl enable mysql
Ubuntu 서버가 재시작 되더라도 mysql이 자동 시작되도록 등록합니다.

sudo /usr/bin/mysql -u root -p sql 접속

ALTER USER ‘root’@‘localhost’ IDENTIFIED BY ‘boostpassword’; 비번 수정

CREATE USER ‘boostuser’@‘localhost’ IDENTIFIED BY ‘boostpassword’; 유저 추가

FLUSH PRIVILEGES;
mysql의 user 테이블에 추가하거나 변경이 있을 경우 flush privileges 쿼리를 실행해 줍니다..

SELECT User, Host, authentication_string FROM mysql.user;
등록 유저 확인

GRANT ALL PRIVILEGES ON mydb.* to boostuser@localhost
boostuser 계정에 mydb DB를 사용할 수 있도록 권한을 부여합니다.

FLUSH PRIVILEGES;
권한 후 다시 적용하게끔 설정

SHOW GRANTS FOR ‘boostuser’@‘localhost’;
가진 권한 확인

계정 뒤에 붙은 @localhost는 해당 계정이 localhost 즉 mysql이 설치된 pc에서만 접속할 수 있다는 의미입니다. 만약 다른 서버(remote)에서 접속하고 싶다면 접속하려는 서버의 IP로 계정을 새로 만들어 줘야 합니다.

예를 들어 192.168.0.10에서 접속하고 싶다면 아래와 같이 쿼리를 실행하면 됩니다.

CREATE USER 'root'@'192.168.0.10' IDENTIFIED BY 'boostpassword';

GRANT ALL PRIVILEGES ON * . * TO 'root'@'192.168.0.10' WITH GRANT OPTION; 

FLUSH PRIVILEGES;

만약 특정 PC(192.168.0.10)이 아닌 어디서든 접속하려면 IP대신 %로 해주면 됩니다.

CREATE USER 'root'@'%' IDENTIFIED BY 'boostpassword';

GRANT ALL PRIVILEGES ON * . * TO 'root'@'%' WITH GRANT OPTION; 

FLUSH PRIVILEGES;

마찬가지로 boostuser계정도 remote 접속이 필요하다면 아래와 같이 쿼리를 실행해 줍니다.

CREATE USER 'boostuser'@'%' IDENTIFIED BY 'boostpassword';

GRANT ALL PRIVILEGES ON mydb.* TO 'boostuser'@'%';

FLUSH PRIVILEGES;

ALTER TABLE TODOLIST CONVERT TO CHARACTER SET utf8 COLLATE utf8unicodeci;

ALTER DATABASE db명 DEFAULT CHARACTER SET utf8 ;

cloud vs data center

일반 데이터 센터 보다 초기 구축비용이 조금 든다. (auto) 스케일링 (업 아웃) => server 필요할때 추가 제거

  • 데이터 센터는 서버 고정이지만 클라우드는 스케일링을 통해서 필요할때 서버 늘리고(스케일 업) 필요 없을때 서버 줄일(스케일 다운) 수 있다. 온디멘드 유연한거

데이터 센터 5만원 클라우드 10만원

클러스터링 - cpu 만큼 노드 갯수를 만든다.

  1. nodejs 의 모듈
  2. pm2

장점

수평 확장이 용이하다. 단점

  • 문제는 세션이 내장에 되어 있으면 각각 노드가 세션이 다르게 가지고 있으므로 서버 1을 쓰다가 서버2 를 쓰게 되면 세션이 없는 서버를 쓰면서 문제가 생긴다.

세션 클러스터링

  1. 외부 서버를 써서세션을 저장하는 디비 같은것을 쓴다. 예> redis
  2. 토큰 방식을 쓰면 된다.

그외 자잘한것들

  • prepared statement mysql query문 때릴때 변수 값으로 넣는것. 보안상 좋다고 한다.

    db.query(`INSERT INTO USER VALUES (NULL, 'honux@mail.com', 'password');`)
    // 이렇게 하는것보단
    
    const query= 'INSERT INTO USER VALUES (?, ?, ?);'
    const params = [value1, value2, value3];
    execute(query, params);

call vs apply vs bind

함수의 기본 메서드 3가지 call, apply, bind

  const obj = {
   number: 55,
   a: function (a, b, c) {
    return a + b + c + this.number;
  }};

  const obj2 = {
    number:9999,
  }
  
  obj.a(1, 2, 3);//61
  obj.a.call(obj2, 1, 2, 3); //10005
  obj.a.apply(obj2, [1, 2, 3]);  //10005
  const binded = obj.a.bind(obj2, 1,2,3);
  binded() // 10005

call, apply, bind 다 this를 바꿀 수 있다.
제일 큰 차이점은 call은 기본 인자 처럼 1,2,3 으로 넣고 apply는 배열로 넣는다. 그리고 bind는 함수에 저장했다가 쓰고 싶을때 쓴다.

Future Action

  • 학습을 제대로 하지 않으면 남는게 없으므로 조금 더 학습에 시간을 투자하자.