질문 타임
디스트럭팅이 어려워요!
- https://www.youtube.com/watch?v=lV7ulA7R5Nk
- https://poiemaweb.com/es6-destructuring
let x, y, z;
[x, y, z] = [1, 2, 3];
// 위의 구문과 동치이다.
let [x, y, z] = [1, 2, 3];
// 출처 : https://poiemaweb.com/es6-destructuring
app.get이랑 router.get이랑의 차이?
- 기본적으로는 같은데 app이 바깥에 있는 전체적인 application이라고 생각하면 된다. router는 app에다가 붙이는 조그만한 express app이다.
- 소규모로 서버를 만들 것이다 = router를 만들 필요 X
- 서버를 기능별로 나눠서 API를 관리하고 싶다. = router로 여러개 만들어서 app에 붙여라!
객체 디스트럭팅할 때 원래 키랑 다른 이름으로 바꿔서 사용?const obj = {
a : 1,
b : 2,
c : 3,
}
const {a : key, ...rest} = obj;
// obj.a -> obj.key = 1
// rest = {b : 2, c : 3}
- SW4 신0빈님 답변 : url : path 하면 req 객체 안에 있는 url을 뽑아서 path로 이름을 바꿔주는거래요
라우터랑 미들웨어의 차이?
- 미들웨어가 가장 작은 단위
- 미들웨어들을 라우터에 등록하고 라우터를 app에 등록~!
- 미들웨어를 바로 app에다가 등록할 수 있다.
SQL중 하나만 구조를 알아도 다른 SQL도 습득하기 빠른가요?
- 표준 sql 문법(ansi sql)이 있어서 그걸로 공부하심 다른 sql 파바박 하실 수 있을거에요~
- 네! RDB는 SQL을 사용한다는 개념은 같으나, 각 DB마다 조금씩 특화된 문법이 있어요. 하지만 베이스는 비슷하니 SQL을 알아두시면 적응에도 좋고, 최근에는 SQL도 코딩테스트를 보는곳이 있어서 알아두시는게 좋습니다!
이론
Express(리뷰)
라우팅
- 클라이언트가 요청을 보낸 endpoint(URL) + HTTP method에 맞춰서 어떻게 응답을 줄 것인가
- 핸들러 = 마지막 middleware라고 생각!!
- 매개변수에 err가 있으면 에러핸들러!!
- ERR들어가면 에러처리 -> next(err) 하면 에러처리 핸들러 실행!!
코드 짜는거 꿀팁
- 제일 안에 있는거부터 짜는게 좋다.
- 안쪽의 기능부터 만들어서 점점 붙이는 방법이 좋다~!
남의 코드를 볼 땐 위부터 보는 것이 좋다!!
에러처리 핸들러 작성 시
const test = (req, res, next) => {
if(type === undefined){
const error = new Error("타입을 명시해야합니다.");
error.statuesCode = 400;
next(error)
return;
}
if(count !== undefined && count < 1){
const error = new Error("수량은 1 이상이어야 합니다.");
error.statusCode = 400;
next(error);
return;
}
}
- 위의 코드를 볼때
next(error)
로 인해서 함수가 끝날 줄 알고 있었지만 사실 명시적으로 return;
을 작성해서 함수를 끝내줘야한다. 그렇지 않으면 타입 명시 에러 핸들러가 요청된 후 응답을 하는 와중에 개수 에러 핸들러의 요청이 들어가게 된다.
- 결론은 에러가 발생한다!!!!
그럼 return next(error)를 하면 되는거 아닌가?
- TypeScript입장에서 보면
return : void
여야 하는데 return next(error)
를 하면 return : any
가 되기 때문에 에러가 발생한다!!!
- 고로,
next(err)
return;
을 해주자~
get("/", ~~~)에서 "/"의 의미?
코치님의 app, HTTP method 사용
- app은 .use를 사용할때 사용
- 나머지 GET, PUT, POST, DEL은 router에 있다~!
- use는 언제 쓴다? 미들웨어 등록할 때, 모든 메소드가 실행이 되어야 할 때!, 다 모아서 응답을 보낼 때!
use? all?
- 미들웨어, 에러 핸들러, 라우터 등록 = use
미들웨어
- req, res, next에 대한 접근이 가능한 함수!!!
- 어떠한 코드도 실행 가능하다
- Client의 요청으로 Express 앱 내부에서 request-response 사이클이 진행될 때마다 반드시 실행되어야 하는 코드들을 정의하기에 적합하다:
- middleware는 global 단위(모든 PATH), PATH 단위로 유연하게 등록이 가능하다.
- 등록 순서에 따라 실행되기 때문에 주의해야한다(큐에 아이템을 등록한다는 느낌으로 코드를 작성하면 편하다).
에러 처리 미들웨어
app.use((err, req, res, next)) => {에러처리로직});
- 미들웨어 함수가 동기 함수라면 throw로 에러를 던져도 되지만, 비동기 함수(async, promise 등)이면 next(error)로 전달해야 한다!!
데이터베이스
DB
DBMS
- 데이터베이스를 운영하고 관리하는 소프트웨어
- 전용 언어를 사용해서 관리하는 시스템
- 통상 DB라고 하면 DBMS를 일컫는다.
- DB = 데이터 저장소 / DBMS = DB에 저장된 데이터에 접근하는 시스템
두 가지 타입의 데이터 베이스
- 관계형 데이터베이스
- 관계 대수를 기반으로 구현된 데이터베이스. 정형화된 데이터를 관리
- 스프레드시트 형태의 데이터 구조를 가지고 있다고 생각!!
- SQL로 데이터를 검색, 업데이트 가능!
- 일반적으로 DB라고 하면 RDBMS를 가르키지만 점점 달라지고 있다!
- MySQL, Oracle DB, Maria DB
- NoSQL 데이터베이스
- 관계형 데이터베이스 이외의 데이터베이스
- 제품마다 정형/비정형 데이터를 다룬다.
- MongoDB, Redis
SQL
- Structured Query Language
- 사람이 읽었을 때 이해하기 쉽도록 문법이 구성되어있다.
- 모든 RDBS의 SQL은 기본적으로 유사한 문법을 가지고 있다.
- SQL을 작성해서 DB에게 명령을 보내는 행위는 사람이 스프레드 시트를 만들어서 값을 채워넣고 수정하고 지우는 과정이랑 매우 유사하다.
MongoDB
- 문서 기반 DB
- JSON 형태의 데이터를 다루는 웹 생태계에서 큰 인기를 얻음.
- 단순한 설계를 가지고 있기 때문에 진입 장벽이 낮은 장점이 있다.
- 간단한 CRUD 기반의 서비스에 매우 적합하다.
- 다양한 데이터를 저장하고 다뤄야하는 도메인에서 많이 사용
- 데이터간의 관계가 중요한 서비스에는 적합하지 않다.
MongoDB 용어
- 데이터베이스 : 제일 큰 단위의 저장소. 여러 개의 컬렉션을 가지고 있다.
- 컬렉션 : 도큐먼트의 집합!
- 도큐먼트 : MongoDB의 데이터 저장 단위. 사용자가 저장하는 데이터는 모두 다큐먼트로 저장
다큐먼트 CRUD - Create
- db.collection.insertOne() : 하나의 document 생성
- db.collection.insertMant() : 다수의 document 생성(배열!!)
CRUD - Read
- db.collection.find() : 하나/다수의 document 찾기(결과는 다 배열!)
CRUD - Update
- db.collection.updateOne() : 하나의 document 수정 (겹치는 요소가 있으면 맨 위에 있는 친구만 변경되고 밑에 친구는 변경 안됨!!)
- db.collection.updateMany() : 다수의 docuemnt 수정
CRUD - Delete
- db.collection.deleteOne() : 하나의 document 삭제(조건에 중복되는 document가 있으면 가장 처음 발견되는 document를 삭제)
- db.collection.deleteMany() : 다수의 document 삭제
Mongoose(ODM)
ODM
- Object Data Mapping
- MongoDB에 데이터를 CRUD할 수 있도록 도와주는 외부 라이브러리
- Mongoose의 장점은 데이터를 단순하게 CRUD하는 것이 아니라, 데이터 검증 + document를 JS 객체 변환까지 해줌
- MongoDB에서 가져온 docuemnt 데이터를 JS 객체화 한 것을 모델이라고 한다.
- 개발자는 이 모델을 가지고 데이터를 객체지향 방식으로 데이터를 수정할 수 있다.
- 크게 검증파트 와 CRUD + document를 JS 객체 변환 파트로 나눈다
- 검증 파트는 Schema모듈이 담당, CRUD + document를 JS객체 변환은 Model 모듈이 담당
ODM 용어
- 스키마(Schema)
- 한 컬렉션의 도큐먼트의 구조를 명시화한 객체
- Mongoose는 어플리케이션이 MongDB에 데이터를 CRUD를 할 때 이 객체를 가지고 데이터 검증을 수행 + 추가적인 검증도 커스텀 함수를 추가해서 가능
- 일종의 데이터 체크리스트
- mongoose.Schema = 함수의 리턴 값은 객체
- MongoDB와 데이터를 어떤 틀에 맞춰서 주고 받을건지 정의
- 모델(Model)
- 스키마 객체를 사용해서 MongoDB에 있는 document 데이터를 JS 객체 형태로 나타낼 수 있게 해준다.
- MongoDB에 있는 모든 document들에 대한 CRUD도 책임진다.
- JS 코드 상에서 실질적으로 자주 다루는 것은 모델이다.
- mongoose.model = 함수의 리턴값은 class이다.
- JS 객체 형식으로 MongoDB와 데이터를 주고 받음!
실습
데이터베이스
DB 안의 데이터들은 특정 DBMS마다 정의된 쿼리 언어를 통해 CRUD 등을 수행할 수 있다.
스키마
- 데이터베이스에 저장된 자료의 구조 및 관계를 표현한 명세
관계형 데이터 베이스
- 행과 열을 가지는 표 형식 데이터를 저장하는 형태의 DB
NoSQL 데이터 베이스
ORM
- 객체와 관계형 데이터베이스를 매핑
- SQL문으로 자동 생성하여 데이터베이스에 저장하고 검색할 수 있다.
ODM
- NoSQL 데이터베이스에서 객체와 데이터를 매핑
- MongoDB - MongoDB의 도큐먼트를 객체로 변환하여 사용할 수 있다.
- Mongoose
kocw 강의 추천!! 이석복 교수님의 네트워크 강의 추천해주셨다!!! 나중에 마음 먹고 봐야겠다 ㅎ하하..
실습 문제
1
2
3
export ?
출처 : 엘리스 아카데미