예정 작업 리스트
- 로그인 후 일반회원 / 관리자 회원 라우팅
- 구글 로그인 연동 ( 회원 가입시 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
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 저장 )
- 회원 권환 관리 페이지 작업
'개발일지 > WEB' 카테고리의 다른 글
NodeJs 웹 프로젝트 개발일지 #5 (0) | 2021.07.21 |
---|---|
NodeJs 웹 프로젝트 개발일지 #4 (0) | 2021.07.13 |
NodeJs 웹 프로젝트 개발일지 #3 (0) | 2021.06.17 |
NodeJs 웹 프로젝트 개발일지 #1 (0) | 2021.06.07 |
NodeJs 웹 프로젝트 시작 (0) | 2021.05.27 |