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 만큼 노드 갯수를 만든다.
- nodejs 의 모듈
- pm2
장점
수평 확장이 용이하다. 단점
- 문제는 세션이 내장에 되어 있으면 각각 노드가 세션이 다르게 가지고 있으므로 서버 1을 쓰다가 서버2 를 쓰게 되면 세션이 없는 서버를 쓰면서 문제가 생긴다.
세션 클러스터링
- 외부 서버를 써서세션을 저장하는 디비 같은것을 쓴다. 예> redis
- 토큰 방식을 쓰면 된다.
그외 자잘한것들
-
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
- 학습을 제대로 하지 않으면 남는게 없으므로 조금 더 학습에 시간을 투자하자.