it leader

예정 작업 리스트

- 로그인 후 일반회원 / 관리자 회원 라우팅 

- 구글 로그인 연동 ( 회원 가입시 tokenId 저장 )

- 회원 권환 관리 페이지 작업

 

작업 목표

로그인 기능 완성

 

이슈

1. 로그인시 유저정도 조회에 대한 sql connection 에 대해 비동기처리 미숙

1.1 ajax post 통신시 로직와 결과 리턴이 동기로 이루어지지 않아서 오류 발생

2. 다국어 처리 및 라벨 관리를 위한 라이브러리 필요 

2.1 다국어처리를 위한 json 파일을 불러오기 위해 싱글턴 패턴 채용

 

 

해결

1. await async 를 이용한 동기처리로 sql transaction 처리

 

// ajax post 통신 부분
// 파라미터 받는 부분에 async 선언
// sql connection 시 await 선언 하여야지만 동기로 처리 
router.post('/loginChk', async (req, res, next) => {

    var rtrnObj = {};
    let id = req.body.email;
    let pswd = req.body.pswd;

    console.log("id : " , id);
    console.log("pswd : " , pswd);
    try{
      var ttlCnt = await mysqlMybatisTest(id);
      var resultMap = await selectUserInfo(id, pswd);

      if(ttlCnt == 0 || resultMap == null){
        console.log("no result");
        rtrnObj.resultCode = "0001";
        rtrnObj.resultMsg  = instance.CONST_VAL.userNotJoined;
      }else if( ttlCnt > 0 && resultMap != null ){
        console.log("1 result");
        rtrnObj.resultCode = "0000";
        rtrnObj.resultMsg   = instance.CONST_VAL.loginSuccess;
      }

      console.log("rtrnObj : " , rtrnObj);

      res.send( rtrnObj );
  }catch(error){
    next(error);
  }
});

 

// async선언 하여야지만 await를 사용할 수 있다.
async function mysqlMybatisTest(_mbrId){

  try{
      console.log("process dbuser : ", process.env.DB_USER );
      console.log("process dbpass : ", process.env.DB_PASSWORD );
      console.log("process host : ", process.env.DB_HOST );

      dbConfig.user = process.env.DB_USER;
      dbConfig.password = process.env.DB_PASSWORD;
      dbConfig.host = process.env.DB_HOST;
      dbConfig.port = process.env.DB_PORT;
      dbConfig.database = process.env.DB_NAME;

      console.log("dbuser : ", dbConfig);
      let pool = sql.createPool(dbConfig);
      let connection = await pool.getConnection(async conn => conn);
      
      //orm
      mybatisMapper.createMapper(['./mapper/user-mapper.xml']);
      var param = { mbrId : _mbrId};
      var format = { language : 'sql', indent : ' '};

	  var query = mybatisMapper.getStatement('userMapper', 'selectUserInfoTtlCnt', param, format);
      var totalRows = 0;
		
      //DB Transactrion 처리
      try{
      	
        await connection.beginTransaction();
        var result = await connection.query(query);
        var totalRows = result[0][0].totalRows;
        console.log("result : " , result[0][0].totalRows);
        await connection.commit();

        return totalRows;

      }catch(err){
        await connection.rollback(); 
        throw err;
      }finally{
        connection.release();
      }
	}catch(err){
      console.log("mysqlMybatisTest : " , err);
 	}
}

2. 다국어 및 라벨관리를 위한 i18n 라이브러리 사용 

 

사용법은 아래 블로그 참조

 

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=cck223&logNo=220974896622 

 

Node JS , 다양한 언어를 사용하자

오늘 알려드릴 Node JS 모듈은 i18n입니다. 이 모듈은 다국어 서비스를 지원하기 위한 모듈입니다. 아래...

blog.naver.com

 

2.1 싱글턴 패턴 

 

class PrivateGlobal {
	
    //싱글턴 생성시 변수 선언
    constructor() {
        this.message = 'I am an instance';
        this.CONST_VAL = this.getConst();
    }
	
    //싱글턴 객체 내부 함수
    getConst(){

        const fs = require('fs');

        var json = fs.readFileSync('./locales/ko.json', 'utf-8');

        return JSON.parse(json.toString());
    };

}

class Global{
    constructor(){
        throw new Error('Use Singleton.getInstance()');
    }
    static getInstance() {
        if (!Global.instance) {
            Global.instance = new PrivateGlobal();
        }
        return Global.instance;
    }
}

module.exports = Global;

 

내 경우는 싱글턴 객체 생성시에 다국어 처리를 위한 json파일을 read 하는 함수를 실행하고

CONST_VAL 에 넣어 전역처럼 사용하도록 처리 하였다.

 

스프링프레임웍에서는 쉽게 되던 것들이 의외로 NodeJS로 넘어오면서

손쉽지 않게 동작하는 것을 알게되었다. 아니면 내 스스로 개발 방식에 대해 

고정관념처럼 박혀있는것이 아닌가 생각하게 되는 하루였다.

갈길이 멀구나 좀더 분발하기를...

 

다음 작업리스트

- 유저 권한별 메뉴 목록 불러오기

- 로그인 후 일반회원 / 관리자 회원 라우팅 
- 구글 로그인 연동 ( 회원 가입시 tokenId 저장 )

- 회원 권환 관리 페이지 작업

profile

it leader

@dev__pixui

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