[TIL]21.12.20

박주홍·2021년 12월 20일
0

Today I Learned

목록 보기
83/104

Sequelize에서 model(DB에선 table이라고 불리우는)을 만들었다면 또 Sequelize-cli로 init을 해서 migration을 했다면 server폴더에는 sql없이도 자바스크립트에서 mysql을 사용할 수 있는 ORM(Object Relational Mapping)를 사용할 수 있다.

나 같은 경우는 갤러리 CRUD를 위해 gallery라는 model을 만들었다. 그 다음에 gallery모델에서 CRUD를 하기 위해선 객체 구조 분해 할당으로 모델 객체를 가져온다. 이때 모델 객체는 Promise{ }으로 되어 있어서 .then 이나 async, await 같은 키워드를 사용해야한다.

비동기 참고 자료 ⇒ https://www.youtube.com/watch?v=s1vpVCrT8f4

// controllers/index.js

const { gallery : _gallery } = require('../models');

module.exports = async (req, res) => {
		console.log('_gallery : ', _gallery);
    console.log('_gallery.create() : ', _gallery.create());
		// expected output => Promise { <pending> }
		console.log('await _gallery.create() : '. await _gallery.create())
		// expected output => 
		/*
gallery {
  dataValues: {
    id: 1,
    updatedAt: 2021-12-20T06:53:48.447Z,
    createdAt: 2021-12-20T06:53:48.447Z
  },
  _previousDataValues: {
    id: 1,
    title: undefined,
    comment: undefined,
    pictureUrlOne: undefined,
    pictureUrlTwo: undefined,
    pictureUrlThree: undefined,
    createdAt: 2021-12-20T06:53:48.447Z,
    updatedAt: 2021-12-20T06:53:48.447Z
  },
  uniqno: 1,
  _changed: Set(0) {},
  _options: {
    isNewRecord: true,
    _schema: null,
    _schemaDelimiter: '',
    attributes: undefined,
    include: undefined,
    raw: undefined,
    silent: undefined
  },
  isNewRecord: false
}

		*/

    res.status(200).send('Hello World');
}

메소드는 Sequelize 공식문서 참고할 것

https://sequelize.org/master/manual/model-querying-basics.html

또는 https://velog.io/@cadenzah/sequelize-document-1

Pagination관련 처리를 위해 findAndCountAll 을 사용했다.

offset 옵션을 이해하기 위해 위키백과에서 offset의 뜻을 찾아봤다. 만약 내가 이해한 바로는 두번째 주소를 만들기위해 기준이 되는 주소에 더해진 값이라고 한다. 이는 어셈블리언어에서 사용하는 의미같은데 난 여기서 일단 주소를 뜻함으로 이해하자.

https://ko.wikipedia.org/wiki/오프셋(컴퓨터과학)

https://genesis8.tistory.com/74

npm install axios

rest api을 사용할땐 axios을 사용했다.

DB에 image CRUD

이미지가 휘발성으로 날아가지 않도록 DB에 저장하려면 이미지는 다른 스토리지 서비스, 즉 다른 서버에 놓고 db에는 이미지의 url만 놓아서 CRUD할 수 있도록 구현하는 것이 일반적이다.

이미지 저장 정말 중요한 내용인데요. 예상과 다르게 데이터베이스와 큰 관련이 없어서 이 강의에서 다루는건 적합하지 않아요. 그 이유는 이미지는 데이터베이스에 저장되지 않고 AWS S3와 같은 파일 저장소에 저장되기 때문입니다. 파일저장소에 저장하면 해당 이미지의 url을 받을 수 있는데요. 데이터베이스에는 이 url만 저장하게 되요. 클라이언트(프론트엔드)가 이미지를 열고 싶을 때는 백엔드로부터 url을 받게 되고 이 url로 프론트에서 직접 이미지를 불러와요(img tag를 이용해서요)

또한 이미지를 AWS S3와 같은 스토리지 서비스에 놓고 url을 DB가 저장해놓았다가 CRUD하는 방식으로 이미지를 CRUD해야한다. 그러기 위해선 AWS 사용법에 대해 공부해야겠다.

라우팅에 대해 고쳐야할 점

router.js

const router = require('express').Router();
const controller = require('./controllers');

// userId로 전체 주문 내역을 조회하는 라우팅
router.get('/:userId/orders', controller.orders.get);
// 쇼핑 카트에서 새로운 주문을 생성하는 라우팅
router.post('/:userId/orders/new', controller.orders.post);

module.exports = router;

app.js

const express = require('express');
const router = require('./routes');
const cors = require('cors');
const morgan = require('morgan');
const parser = require('body-parser');
const controller = require('./controllers');

const app = express();
const port = 4000;

app.use(
  morgan(':method :url :status :res[content-length] - :response-time ms')
);
app.use(cors());
app.use(parser.json());
app.use('/users', router);
app.get('/items', controller.items.get);
module.exports = app.listen(port, () => {
  console.log(`🚀 Server is starting on ${port}`);
});

위의 코드 처럼 라우팅을 나눠야할 것 같다.

profile
고통없는 성장은 없다고 할 수 있겠다....

0개의 댓글