it leader

예정 작업 목록

  - 유저, 권한 정보 화면

  - 메뉴목록 싱글톤으로 관리

 

작업목표

  - 로그인시 유저의 권한 정보를 가져와서 싱글톤으로 관리

  - 사이드바에 유저별로 메뉴 접근 권한을 동적으로 표시

 

이슈

  - 싱글톤 패턴 적용 하였는데 페이지 전환시에 메뉴 목록이 불러와 지지 않음

 

해결

  - 싱글톤 객체를 생성하는 시점이 앱이 시작되는 시점이었기 때문에 초기화된 메뉴 목록을 불러오고 있는 것이었음..

 

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가 준비되는 시점에 대한 이해가 부족하여, 싱글톤을 활용하지 못하는 사례를 경험하였음..

     이제 대략적으로 웹 프로젝트 구성에 대해서 조금씩 육곽이 잡혀간다..

 

 

다음 작업 리스트

  - 메뉴 상세 화면에서 메뉴 아이콘 지정

  - 현재 페이지 표기

  - 파일 업/다운로드

profile

it leader

@dev__pixui

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!