노드 숙련 과제로 express.js로 회원가입, 로그인, 댓글 CRUD api를 만들고 있다.
스파르타 강의를 듣다가 어떨 때는 res.send()를 쓰고, 어떨 때는 res.json(), res.end()를 사용하길래 차이가 궁금했다.
send()와 json()은 형식의 차이인 것 같은데, end()는 뭐지?
블로그를 찾아보니 대체로 다음과 같이 설명되어 있었다.
res.send()는 send에 전해진 argument에 따라서 Content-type이 자동적으로 만들어진다. 이게 기본이다.
res.json()은 json이 아닌 것도 json 형식으로 바꾸어서 보내준다. 즉 content-type 헤더를 application/JSON으로 고정한다. 그런데 결국 res.json()도 마지막에 res.send()를 호출한다.
res.end()는 보내줄 아무 데이터도 없는데 response를 끝내고 싶을 때 사용한다.
ex) res.status(400).end();
출처: https://yohanpro.com/posts/nodejs/express-response
보내줄 데이터가 없지만 response를 끝내고 싶을 때 res.end()를 사용한다.
주로 400 에러가 발생할 때 end()로 끝낸다고 하는데, 강의에서는 에러가 없을 때도 end()로 마무리하는 경우가 있었다.
쿠키를 발행할 때 cookie() 메서드를 사용하는데 들어가는 옵션이 다양하길래 정리 겸 찾아봤다.
res.cookie(‘cookie name’, ‘cookie value’, option)
maxAge: 쿠키의 만료 시간을 밀리초 단위로 설정
expires: 쿠키의 만료 시간을 표준 시간 으로 설정
path: 쿠키의 경로 (default: /)
domain: 쿠키의 도메인 이름 (default: loaded)
secure: HTTPS 프로토콜만 쿠키 사용 가능
httpOnly: HTTP 프로토콜만 쿠키 사용 가능
signed: 쿠키의 서명 여부를 결정
출처: https://cinema4dr12.tistory.com/838
강의에서 사용했던 건 expires로 쿠키의 만료 시간을 지정할 때 사용되었다.
app.get("/set-cookie", (req, res) => {
const expires = new Date();
expires.setMinutes(expires.getMinutes() + 60);
// 만료 시간을 60분으로 설정합니다.
res.cookie('name', 'sparta', {
expires: expires
});
return res.status(200).end();
});
나머지는 언제 쓰는지 모르겠지만 앞으로 쓸 일이 있겠지..?
이번 과제에서는 Mongoose로 연결했던 DB를 Sequlize를 이용해서 Mysql로 변경해야 한다.
그런데 Sequelize가 뭐냐...?
Sequelize란 node.js에서 관계형 데이터베이스를 쉽게 다룰 수 있게 도와주는 라이브러리다. (ORM: Object-Relational Mapping)
raw Query를 사용하지 않고도 객체의 메서드를 활용함으로서 DB를 조작할 수 있다.
Sequelize를 설치하면 파일 구조가 다음과 같이 생성된다. 스파르타 강의에서는 자세하게 설명해주지 않아서 따로 찾아봤다.
- config : 데이터베이스 설정 파일, 사용자 이름, DB 이름, 비밀번호 등의 정보 들어있다.
- migrations : git과 비슷하게, 데이터베이스 변화하는 과정들을 추적해나가는 정보로, 실제 데이터베이스에 반영할 수도 있고 변화를 취소할 수도 있다.
- models : 데이터베이스 각 테이블의 정보 및 필드타입을 정의하고 하나의 객체로 모은다.
- seeders : 테이블에 기본 데이터를 넣고 싶은 경우에 사용한다.
models는 mongoose의 schema와 비슷한 개념인 것 같은데,
sequelize에서는 migration 파일도 같이 변경을 해줘야 한다.
그리고 mongoose와 다른 점은 id를 objectid가 아니라 autoincrement로 자동생성을 해준다는 점이고,
데이터 생성날짜와 수정날짜를 자동으로 저장해준다. (CreatedAt, UpdatedAt 컬럼에 저장)
사용되는 문법도 좀 다른데 또 구글링하며 변경해봐야겠다...