예정 작업 목록
- 유저, 권한 정보 화면
- 메뉴목록 싱글톤으로 관리
작업목표
- 로그인시 유저의 권한 정보를 가져와서 싱글톤으로 관리
- 사이드바에 유저별로 메뉴 접근 권한을 동적으로 표시
이슈
- 싱글톤 패턴 적용 하였는데 페이지 전환시에 메뉴 목록이 불러와 지지 않음
해결
- 싱글톤 객체를 생성하는 시점이 앱이 시작되는 시점이었기 때문에 초기화된 메뉴 목록을 불러오고 있는 것이었음..
Singleton class
class PrivateGlobal {
// 객체 초기화
// 변수선언은 contructor 안에 하고 초기화
constructor(){
this.message = 'I am an instance';
this.menuList = [];
}
setMenuList(_menuList){
this.menuList = _menuList;
}
getMenuList(){
return this.menuList;
}
}
class Global{
constructor(){
throw new Error('Use Singleton.getInstance()');
}
static getInstance(){
if(!Global.instance){
Global.instance = new PrivateGlobal();
}
return Global.instance;
}
}
module.exports = Global;
Class의 사용
const instance = require('../global');
//메뉴리스트 불러오기
const menuList = instance.getMenuList();
var menuList = ['/dash','/user','/boards'];
//메뉴리스트 객채에 저장
instance.setMenuList(menuList);
실사용
// url 흐름 login -> dash
// login 에서 menuList를 받아서 저장한후에
// dash에서 menuList를 사용하려고 한다.
var express = require('express');
var router = express.Router();
const ConstInstance = require('../globals');
const instance = ConstInstance.getInstance();
// 잘못된 사용법 : 이렇게 선언하면 빈배열이 전달된다....
// 이유는 이 Router를 app.js가 실행 될때 이미 생성이 되어 버리기 때문에
const menuList = instance.getMenuList();
router.get('/', function( req, res, next) {
//옳은 사용
var menuList = instance.getMenuList();
res.render('dash', {menuList : menuList});
}
// app.js
var express = require('express');
var dashRouter = require('./routes/dash');
var app = express();
const http = require('http').createServer(app);
const io = require('socket.io')(http);
//var swaggerDoc = require('./swaggerDoc.js');
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.set('view options', { pretty : true});
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/dash',dashRouter);
http.listen(3001, () => {
console.log('Connected at 3001');
})
module.exports = app;
회고
- nodeJs에서 router가 준비되는 시점에 대한 이해가 부족하여, 싱글톤을 활용하지 못하는 사례를 경험하였음..
이제 대략적으로 웹 프로젝트 구성에 대해서 조금씩 육곽이 잡혀간다..
다음 작업 리스트
- 메뉴 상세 화면에서 메뉴 아이콘 지정
- 현재 페이지 표기
- 파일 업/다운로드
'개발일지 > WEB' 카테고리의 다른 글
NodeJs 웹 프로젝트 개발일지 #5 (0) | 2021.07.21 |
---|---|
NodeJs 웹 프로젝트 개발일지 #3 (0) | 2021.06.17 |
NodeJs 웹 프로젝트 개발일지 #2 (0) | 2021.06.16 |
NodeJs 웹 프로젝트 개발일지 #1 (0) | 2021.06.07 |
NodeJs 웹 프로젝트 시작 (0) | 2021.05.27 |