Node.js 주특기 심화 [7일차]
오늘 한 일
오늘은 prisma를 이용한 API 설계 및 쿠키와 세션, 토큰을 직접적으로 보내는 법, winston 패키지를 이용한 로그 미들웨어 만들기를 배웠다.
조금은 큰 단원들을 빠르게 배우다보니 전체적인 정리는 힘들 것 같고, 중간에 중요하고 기억해야 할 필요가 있다고 생각해서 메모해뒀던 부분들을 파편적으로라도 적어두려고 한다.
배운 부분
1. 얼마 전 프로젝트를 구현하며 헷갈렸던 cookie 전달에 관련한 부분
cookie의 key값으로 name, value값으로 sparta를 넣어두었을 때, res.cookies로 보낸 쿠키는 req.headers.cookies로
받을 수 있다. 이 때, 받은 쿠키 값의 형태는 name=sparta와 같은 형태를 지니기 때문에 value값만을 가져오고 싶다면
split("=")으로 분리한 뒤, 뒤의 값만 가져와야 한다. 하지만 cookie-parser를 이용하게 된다면 res.cookies로 쿠키값을
전달했을 때 req.cookies로 쿠키값을 전달 받을 수 있다. 이 때 req.cookies에 담긴 값은 { name: sparta}와 같은 형태를
지니기 때문에 별도의 가공없이 편하게 사용할 수 있다.
2. prisma를 사용하며 테이블 연결시 ( 복습시 숙련1주차 마지막 강의 20:30~)
[ null값을 허용할 때 ]
테이블관계에서는 UserInfos UserInfos?와 같이 연결된 테이블 뒤에 '?'를 붙임으로써 1:1관계라는 것을 정의할 수 있다.
1:1 관계에서 특정한 column값에 null 값을 허용할 때는 age int? 와 같이 '?'를 통해 'null값을 허용한다' 라는 의미를
전달할 수 있다.( 이 때의 age는 특정 column명이다)
[ 1:N 관계일때 ]
1:N 관계일 경우에는 Posts Posts[] 와 같이 참고하는 테이블명 뒤에 []를 붙임으로써 1:N관계라는 것을 정의할 수 있다.
[ 상위 테이블에서 작성하는 prisma model ]
UserInfos, Posts, Comments와 같은 테이블들은 '연결되어지는' 테이블이다.
이 때, 앞에 적힌 테이블은 테이블을 지칭하기로 하는 '이름'이고 뒤의 테이블은 '모델'을 의미한다.
3. prisma에서의 delete: cascade
delete: cascade는 무결성 제약조건으로서 부모 데이터가 삭제되면 자식 데이터도 삭제되도록 하는 조건이다.
4. Status Code
409 : 서버에서 동일한 상태의 사용자가 존재할 때의 상태코드
419 : 클라이언트가 요청한 정보가 서버와 일치하지 않을 때의 상태코드
5. npx prisma db push --force -reset
: (prisma로 구현된) 테이블 안의 데이터를 전부 지우고 재생성하는 명령어.
기존 sequelize와 비교해봤을 때, 매우 편하다고 생각했다. seqeulize의 경우, npx sequelize db:migrate undo를 이용
해서 migration을 전부 내린 후 마이그레이션을 수정한 다음 다시 npx sequelize db:migrate와 같이 테이블을 올려
주어야 했다. 심지어 migrate나 migrate:undo를 했을 때 테이블이 연결되어 있을 경우 테이블을 생성, 삭제하는 순서도 고려해야 했기 때문에 여간 불편한게 아니었다.
하지만 npx prisma db push --force -reset을 사용할때는 prisma model 부분을 수정하고 이 명령어를 사용해주면
알아서 테이블의 모든 내용을 삭제하고 새로운 테이블을 생성해주기 때문에 상당히 편하다고 느꼈다.
6. 미들웨어에서 빠져나올 수 있는 것들
저번 프로젝트를 진행하며 미들웨어를 통과할 때 변수, 함수를 정의해도 그 다음 미들웨어나 router등에서 정의한 변수 나 함수는 빠져나오지 못한다는 것을 직접 하나하나 다 통과시켜보며 알게되었다.
그런데 res.locals.user에 정보를 담게되면 next()로 넘겨진 미들웨어나 router에서도 res.locals.user의 정보를 쓸 수 있다
는 것을 알 수 있었다.
그런데 오늘 하나 더 미들웨어를 통과할 수 있는 변수를 알게 되었다. req.user = user와 같이 user데이터를 req.user에
담았더니 next()로 연결된 부분에서도 req.user를 사용할 수 있다. local 변수를 쓰지 않아도 사용이 된다는 것을 알 수
있었다!
7. User테이블과 UserInfo 테이블 Join해서 검색하기 ( SQL 문이 아닌 prisma문법으로) - 다시 한 번 복습하기
user.router 68~87째줄
70분짜리 강의 62분 쯤.
강의자료) 'prisma의 연관관계 table을 어떻게 조회하나요?' 부분
8. res.on("finish", ~)
클라이언트의 request 이후 서버의 response가 반환되는데, request와 response가 모두 실행된 이후 실행되도록
만들어진 구문.
9. export, export default 차이점
ES6 모듈이 익숙하지 않아서 살짝 헷갈렸던 부분인데 계속 의문이 생겨 찾아보게 되었던 부분이다.
강의에서 보통 export default를 사용하는데 export하는 부분과 import 하는 부분에서의 이름 차이가 있는데도
계속 사용되길래 의아했다. 그래서 아래와 같이 export와 export default의 차이점을 정리했고 확실히 알게 되었다.
- export할 경우에는 import { 함수명 } from *로 사용하는데 export default 할 경우에는 import 함수명 from *로 사용한다.
- export default로 무언가를 방출하는 경우 방출된 모듈의 이름과 상관없이 as를 쓰지 않고 사용 가능하다.
- export default : export할 파일 소스 내 처음으로 정의한 클래스(함수, 변수 등)를 가지고 온다. export default로 정의한
것들이 여러개 있더라도 제일 처음 정의한 것만 가능하다.
참고 자료
'TIL' 카테고리의 다른 글
2023_12_06 TIL (0) | 2023.12.07 |
---|---|
2023_12_05 TIL (5) | 2023.12.06 |
2023_12_01 TIl (1) | 2023.12.01 |
2023-11-30 TIL (2) | 2023.12.01 |
2023-11-29 TIL (0) | 2023.11.30 |