// 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'), '번 포트에서 대기 중');
});
const router = express.Router();
// GET /user 라우터
router.get('/', (req, res) => { // / 이거 앞에는 http://localhost:3000/users/ 생략된 것임
res.send('Hello, User');
});
module.exports = router;
const router = express.Router();
// GET / 라우터
router.get('/', (req, res) => {
res.render('index', { title: 'Express' });
});
module.exports = router;
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'), '번 포트에서 대기 중');
});
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;
// 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' });
}
};
// 시퀄라이즈 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,
=======================================
** api가 뭔가
* middleware가 뭔가
** 탬플릿 엔진 뭔가
**** 잡스 클래스 : https://ordinary-code.tistory.com/22
-디자인 패턴과 아키텍처
디자인 패턴은 프로토타입(시제품)의 개발 "방식"이고
아키텍처는 "구조"자체
======================================
morgan 로깅(기록) 패키지
도커 - 가상화 (설치안하고 가상화 된 공간(컨테이너)안에 디비를 설치 할 수있다.)
========================
=======================================
무엇이고 왜 쓰는가
이것이 소프트웨어 아키텍처가 중요한 이유입니다.
그림/ 폴더구조
https://docs.google.com/document/d/1_QHy6fynLZWt7CPa4s970Y63YEgt-fMVnm2g6lOYk4s/edit