일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- pm2
- Django
- 트랜잭션
- 스코프
- node
- bcrypt
- CORS
- 프로미스
- nodeJS
- rebase
- crud2
- status code
- JWT
- 실행 컨텍스트
- docker
- django westagram
- TypeError: this.boardRepository.createBoard is not a function
- typescript
- manytomanyfield
- wecode
- async/await
- 장고초기세팅
- on_delete
- 노드
- Jest
- 호이스팅
- javascript
- 자바스크립트
- westagram
- OSI7계층
- Today
- Total
될때까지
((TIL)) Node.js express로 인스타그램 구현하기1 본문
💗 Intro
오늘부터 다시 개발 공부를 시작했다. 추석 잘쉬었으니까... 내년 추석때는 명절 상여금에 명절 뽀너스로 올해보다 풍족했음 좋겠다😄
아침 일찍 일어나서 하루를 시작했지만 진짜 뻥안치고 이력서 쓰는데 하루를 다 할애했다. 진짜 이력서 작성 너무 어렵다 ^^ 오전 10시에 시작했는데 오후 6시가 지나서야 이력서 작성을 완료했다. 그래도 오늘은 이력서 작성하고, 인성 면접이라고 해야하나 왜 개발자가 되고 싶어, 어떤 개발자가 되고 싶어와 같은 면접에 대비하기 위해 회고록도 작성하고 나니까 취준이 실감난다. 근데 뭐.. 뭐라고 해야하나 원초적인 질문?들은 지어내야한다던데 그게 너무 어렵다. 날 소개하고 싶지 자소설을 작성하고 싶지 않은데 말야.정말 저는 재미있어요. 흥미 있어요.. 꾸준히 잘 할 수 있어요를 어떻게 어필한담.
다시 본문으로 돌아가서, 의미없는 커밋은 악효과를 준다고 익히 들었지만, 이제까지 열심히 심어왔던 잔디가 빵꾸 뚫리는 게 너무 마음아프다. 그래서 고민하다 오늘 다시 커밋을 시작했다. 마음같아서는 2차로 진행했던 프로젝트를 노드로 리빌딩하고싶지만, 1차 리빌딩때도 모르는 개념이 많았기에 꼼꼼히 짚고 넘어가고싶었다. 커밋에 목숨걸지않고!! 찬찬히!!
그래서 고민끝에 그나마 만만한 인스타그램을 노드로 작업하기로 결심했다.
💗 What I have done
- 이력서 작성
- 위코드 회고록 작성
- 어떤 개발자, 왜 개발자가 되고 싶은지 작성
- 프로젝트 초기셋팅 (DB연동 및 users 테이블 생성까지)
- .sql 파일에 테이블 생성하는 쿼리문 작성 후 이를 실행시키는 dbsetting.js 작성
- 테이블 생성하는 방법 구글링 도중 sql vs sql2의 차이점 궁금해짐
- 테이블 생성할 때 createPool과 createConnection 두 차이점 궁금
- 테스트 위해 테이블 삭제해봄
💗 What I learned
dotenv
- dotenv는 환경 변수를 파일에 저장한 뒤에 불러와 사용할 수 있게끔 해주는 라이브러리다.
- .env파일을 생성하고 mysql 접속 관련 정보를 저장해줬다. 그러면 다른 파일에서 require('dotenv')로 불러와서 변수에 저장한 뒤, 변수이름.config();를 실행시키면 process.env.'.env파일에 저장한 이름'으로 해당 환경변수를 숨겨서 사용할 수 있다.
fs
- filesystem의 약어로 파일 시스템에 접근하여 파일 CRUD등을 할 수 있다.
- 나는 mysql파일을 불러와서 sql변수에 저장한 뒤 query를 날릴 때 사용했다.
npm install fs --save
const mysql = require("mysql2/promise");
const dbConfig = require("../config/db.config");
const fs = require("fs");
...생략...
const createTable = async () => {
...생략...
try {
const sql = fs.readFileSync('db/schema.sql').toString();
const [rows] = await connection.query(sql)
...생략...
}
DELETE VS DROP VS TRUNCATE TABLE
- drop은 테이블 자체를 drop 버리기 때문에 인덱스도 초기화된다!!
- truncate는 잘라낸다는 뜻 테이블 데이터들만 잘라내기 때문에 인덱스는 살아있네 살아있어!!
Delete | Drop | Truncate | |
종류 | DML | DDL | DDL |
ROLLBACK | 데이터 복구 가능 | 불가능 | 불가능 |
Storage | 데이터는 삭제되고 Storage는 삭제되지 않는다. | 테이블 스키마까지 모두 삭제된다. | 테이블 스키마는 유지된다. |
수행시 | 데이터만 삭제 | 테이블 정의 자체를 삭제 | 테이블 생성 초기상태로 돌아감 |
인덱스 | 초기화 | 유지됨 | |
로그 | 남김 | 안남김 | 안남김 |
속도 | 느림 | 빠름 | 빠름 |
mysql vs mysql2
require('mysql2/promise')를 변수 sql에 저장해서 사용하곤 했다. 위의 이유때문이였군. mysql2는 프로미스를 지원하는데 이를 사용하기 위해선 mysql2/promise를 불러와야했다. mysql의 업그레이드 버전이고 콜백이 아닌 프로미스를 사용해 처리할 수 있게 해주는 모듈이다고 이해했다.
createPool vs createConnection
connection : 클라이언트측에서 DB에 접속해서 쿼리 수행 후, 결과를 받고 접속도 종료하는 일련의 과정을 의미한다.
mysql.createConnection() -> connection.connect() -> connection.query() -> connection.end()
- createConnection: 단일 연결 방식으로 요청이 있을 때 마다 연결 객체를 생성하고 해제하는 작업이 반복된다.
- createPool : 사용자의 요청에 따라 connection을 생성하다 보면 많은 수의 연결이 발생할 때 서버에 과부하가 걸린다.
이를 방지하기 이위해 일정수의 connection을 만들어서 pool에 담아뒀다가 사용자의 요청이 발생 시 연결하고 연결 종료 시 pool에 다시 반환해서 보관하는 것이 connection pool이다.
데이터베이스의 과부하를 방지하고, 유동적으로 connection을 관리할 수 있다는 장점이 있다.
쿼리가 완료되면 end()가 아닌 release()를 해야한다.
pool.query() = pool.getConnection() + connection.query() + connection.release()
* 참고자료
https://holywater-jeong.github.io/2018/06/08/node-mysql-async-await
https://jacobgrowthstory.tistory.com/19
https://bae9086.tistory.com/131
'학습 > Node.js' 카테고리의 다른 글
((TIL)) Node.js express로 인스타그램 구현하기3 (1) | 2022.09.15 |
---|---|
((TIL)) Node.js express로 인스타그램 구현하기2 (0) | 2022.09.14 |
예외 처리하기 (0) | 2022.08.22 |
버퍼와 스트림 (1) | 2022.08.22 |
fs (0) | 2022.08.22 |