it leader

예정 작업 목록

  - 유저, 권한 정보 화면

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

 

작업목표

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

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

 

이슈

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

 

해결

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

 

Singleton class

<javascript />
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의 사용

<javascript />
const instance = require('../global'); //메뉴리스트 불러오기 const menuList = instance.getMenuList(); var menuList = ['/dash','/user','/boards']; //메뉴리스트 객채에 저장 instance.setMenuList(menuList);

 

실사용  

<javascript />
// 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}); }

 

 

<javascript />
// 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

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