벡엔드보강

konut ko·2022년 9월 17일
0

nodejs-book-master

  • 6.5.3 app.js
// 1. [express] express 선언
const express = require('express');
// 1. [log] 로깅선언
const morgan = require('morgan');
// 1. [web][cookie] 쿠키 파서 선언
const cookieParser = require('cookie-parser');
// 1. [web][session] 세션 사용하기 위해 선언
const session = require('express-session');
// 1. [env] 외부 설정 파일을 사용하기 위해 선언 ***
const dotenv = require('dotenv');
// 1. [express] 파일 경로를 알기 위해 선언 ***
const path = require('path');
// 1. [VIEW] TEMPLATE ENGINE을 사용하기 위해 선언 ***
const nunjucks = require('nunjucks');

// 라이브러리도 순서에 따라 에러가 날 수도 있다! -> 실무에서 경험하며 알아나감 -> 근데 잘 나오네여(ㅋㅋㅋ)
// 코드가 너무 길어지면 : CONFIG 폴더로 모듈화를 함
// 패키지가 곧 라이브러리 라고 생각하면 됨.

// 2. [env] 외부 설정파일을 사용하기 위해 설정
dotenv.config();

// 2. [express] express 설정
const app = express();

// 2. [VIEW] TEMPLATE ENGINE을 설정
nunjucks.configure('views', {
  express: app,
  watch: true,
});

// 2. 로깅 설정
app.use(morgan('dev'));

// 2. [web][cookie] 쿠키 파서 설정
app.use(cookieParser(process.env.COOKIE_SECRET));

// 2. [web][session] 세션을 사용하기 위해 설정
app.use(session({
  resave: false,
  saveUninitialized: false,
  secret: process.env.COOKIE_SECRET,
  cookie: {
    httpOnly: true,
    secure: false,
  },
  name: 'session-cookie',
}));

// 3. [express] express PORT 설정
app.set('port', process.env.PORT || 3000);

// 4. [express][VIEW] express  view 설정
app.set('view engine', 'html');

// 5. [express][view]" /" root 라우트 설정
app.use('/', express.static(path.join(__dirname, 'public')));

// 6. [express] json 모듈 사용 설정
app.use(express.json());

// 7. [express] url 주소 인코드 설정
app.use(express.urlencoded({ extended: false }));

// 8. [express] url 주소 라우트 설정 (외부파일 붙이기)
const indexRouter = require('./routes'); 
const userRouter = require('./routes/user'); // 유저라우터라는 변수는 라우트 폴더에 유저파일이다.-라고 정함(1)
// 9. [express] 외부파일의  라우트 미들웨어 설정 
app.use('/', indexRouter);
app.use('/user', userRouter); // 유저라우터라는 변수의 파일을 주소 /user라고 쓰겠다. -라고 지정함(2) / restAPI규칙으로는 주소에는 /users 로 s붙임

// 9. [express] 404 error 라우트 설정
app.use((req, res, next) => {
  const error =  new Error(`${req.method} ${req.url} 라우터가 없습니다.`);
  error.status = 404;
  next(error);
});

// 10. [express] 500 error 라우트 설정 
app.use((err, req, res, next) => {
  res.locals.message = err.message;
  res.locals.error = process.env.NODE_ENV !== 'production' ? err : {};
  res.status(err.status || 500);
  res.render('error');
});

// 11. [express] app listen 설정 (준비 다 끝나고 시동거는 것!)
app.listen(app.get('port'), () => {
  console.log(app.get('port'), '번 포트에서 대기 중');
});
  • user.js
    const express = require('express');

const router = express.Router();

// GET /user 라우터
router.get('/', (req, res) => { // / 이거 앞에는 http://localhost:3000/users/ 생략된 것임
res.send('Hello, User');
});

module.exports = router;

  • index.js
    const express = require('express');

const router = express.Router();

// GET / 라우터
router.get('/', (req, res) => {
res.render('index', { title: 'Express' });
});

module.exports = router;

7.6 코드

  • app.js

const express = require('express');
const path = require('path');
const morgan = require('morgan');
const nunjucks = require('nunjucks');
const indexRouter = require('./routes');
const usersRouter = require('./routes/users');
const commentsRouter = require('./routes/comments');

const app = express();
app.set('port', process.env.PORT || 3001);
app.set('view engine', 'html');
nunjucks.configure('views', {
express: app,
watch: true,
});

// 1. 시퀄라이즈 모델이 삽입된 DB 객체 (db ={ sequelize : sequelize })
const { sequelize } = require('./models');

// 2. 앱이 구동될 때 시퀄라이즈 데이터베이스랑 연결 확인 (커넥션을 만든다.)
sequelize.sync({ force: false })
.then(() => {
console.log('데이터베이스 연결 성공');
})
.catch((err) => {
console.error(err);
});

app.use(morgan('dev'));
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));

app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/comments', commentsRouter);

app.use((req, res, next) => {
const error = new Error(${req.method} ${req.url} 라우터가 없습니다.);
error.status = 404;
next(error);
});

app.use((err, req, res, next) => {
res.locals.message = err.message;
res.locals.error = process.env.NODE_ENV !== 'production' ? err : {};
res.status(err.status || 500);
res.render('error');
});

app.listen(app.get('port'), () => {
console.log(app.get('port'), '번 포트에서 대기 중');
});

  • routes/index.js
    const express = require('express');
    const User = require('../models/user');

const router = express.Router();

router.get('/', async (req, res, next) => {
try {
const users = await User.findAll();
res.render('sequelize', { users }); // 컨트롤러 역할?
} catch (err) {
console.error(err);
next(err);
}
});

module.exports = router;

  • models/comments.js
    const Sequelize = require('sequelize');

// 1. 테이블 모델 설정
module.exports = class Comment extends Sequelize.Model {
static init(sequelize) {
return super.init({
comment: {
type: Sequelize.STRING(100),
allowNull: false,
},
created_at: {
type: Sequelize.DATE,
allowNull: true,
defaultValue: Sequelize.NOW,
},
}, {
sequelize,
timestamps: false,
modelName: 'Comment',
tableName: 'comments',
paranoid: false,
charset: 'utf8mb4',
collate: 'utf8mb4_general_ci',
});
}
// 2. 테이블 간 관계설정 (사용법)
static associate(db) {
db.Comment.belongsTo(db.User, { foreignKey: 'commenter', targetKey: 'id' });
}
};



SQUELIZE

  • 7.6 app.js

  • 시퀄라이즈 정리

// 시퀄라이즈 app.js
1. 라이브러리 선언
2. 라이브러리 설정(외부설정파일)

// 시퀄라이즈 models/index.js
3. 데이터베이스 연결 설정파일

// 시퀄라이즈 모델 테이블 설정 및 관계설정
각각의 model.js 파일에서
4. 테이블 모델 컬럼 설정
5. 테이블 모델 관계 설정

// app.js 에서 싱크 확인
정상적으로 app이 리스닝 될 때 디비 연결확인 및 커넥션 생성


  • 구조분해 할당 질문 - 문법적인 부분이다.
//
// 1. 시퀄라이즈 모델이 삽입된 DB 객체 (db ={ sequelize : sequelize })
const { sequelize } = require('./models');

// 2. **앱이 구동될 때** 시퀄라이즈 데이터베이스랑 연결 확인 (커넥션을 만든다.) 
sequelize.sync({ force: false })
  .then(() => {
    console.log('데이터베이스 연결 성공');
  })
  .catch((err) => {
    console.error(err);
  });
=========
// 1. 시퀄라이즈 모델이 삽입된 DB 객체 (db ={ sequelize : sequelize })
const db = require('./models');

// 2. **앱이 구동될 때** 시퀄라이즈 데이터베이스랑 연결 확인 (커넥션을 만든다.) 
db.sequelize.sync({ force: false })
   .then(() => {
    console.log('데이터베이스 연결 성공');
  })
  .catch((err) => {
    console.error(err);
  });

? 더 알아보기

module.exports = class Comment extends Sequelize.Model {
  static init(sequelize) {
    return super.init({
      comment: {
        type: Sequelize.STRING(100),
        allowNull: false,
      },
      created_at: {
        type: Sequelize.DATE,
        allowNull: true,
        defaultValue: Sequelize.NOW,


복습 발표

  1. [라이브러리] express, squelize 사용법
    • 민혁, 연재, 경화
  2. [아키텍처] MVC(MC가 주), MVT(파이썬 웹개발), MVVM(안드로이드 앱개발) 패턴과 폴더 구조(폴더구조 근간이되는 패턴!)
    • 패턴의 개념과 그림(구조)
    • 나은, 윤지, 준규
  3. [기술] HTTP Method 와 REST
    • 예원, 지민, 태환, 영준

=======================================
** api가 뭔가

* middleware가 뭔가
**
탬플릿 엔진 뭔가
**** 잡스 클래스 : https://ordinary-code.tistory.com/22

-디자인 패턴과 아키텍처
디자인 패턴은 프로토타입(시제품)의 개발 "방식"이고
아키텍처는 "구조"자체

  • 구글독스

======================================
morgan 로깅(기록) 패키지

도커 - 가상화 (설치안하고 가상화 된 공간(컨테이너)안에 디비를 설치 할 수있다.)

========================

=======================================

아키텍처

무엇이고 왜 쓰는가

  • 좋은 디자인을 가진 소프트웨어는 기능을 추가하기 수월해집니다. 더욱 나아가 오히려 빨라집니다. 소프트웨어가 너무 잘 컴포넌트화 되어있고, 그저 해야 할 일은 어떻게 소프트웨어 기능을 변경할지 정하고 변경하는 것입니다.

이것이 소프트웨어 아키텍처가 중요한 이유입니다.

MVC

그림/ 폴더구조

https://docs.google.com/document/d/1_QHy6fynLZWt7CPa4s970Y63YEgt-fMVnm2g6lOYk4s/edit

profile
보초딩코라 틀린 내용 있을 수도 있습니다. 댓글 지적 환영

0개의 댓글