#4 Express

Jong-uk·2023년 4월 11일
0

엘리스 실시간 강의

목록 보기
12/17

질문 타임

디스트럭팅이 어려워요!

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 단위로 유연하게 등록이 가능하다.
    • 등록 순서에 따라 실행되기 때문에 주의해야한다(큐에 아이템을 등록한다는 느낌으로 코드를 작성하면 편하다).

에러 처리 미들웨어

  • 인자로 err를 추가로 갖고 있는 친구!!
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 데이터 베이스

  • SQL을 사용하지 않는 데이터 베이스

ORM

  • 객체와 관계형 데이터베이스를 매핑
  • SQL문으로 자동 생성하여 데이터베이스에 저장하고 검색할 수 있다.

ODM

  • NoSQL 데이터베이스에서 객체와 데이터를 매핑
  • MongoDB - MongoDB의 도큐먼트를 객체로 변환하여 사용할 수 있다.
  • Mongoose

kocw 강의 추천!! 이석복 교수님의 네트워크 강의 추천해주셨다!!! 나중에 마음 먹고 봐야겠다 ㅎ하하..

실습 문제

1

  • 문제 잘 읽으면 충분히 풀 수 있다!

2

  • 이건 좀 해봐야겠다.... 어렵다 ㅜ

3

  • 스키마 설정하는 것!!

export ?

출처 : 엘리스 아카데미

profile
안녕하세요! 만나서 반갑습니다.

0개의 댓글