[DB 프로젝트] 관계형 데이터베이스 결합 분석 추천
        
        
      사용 기술 스택
- mariadb
 - express
 - pug
 
프로젝트 개요

- 사용자 개인의 데이터베이스 접속정보를 입력받아 사용자 DB의 테이블들을 분석해야한다.
 - 
    
분석은 도메인 스캔이 있다.
 - 사용자 개인의 데이터 베이스 입력은 
IP, PORT, USERNAME, USERPASSWORD, DBNAME, DBTYPE이 있다.- DB는 mssql, mysql(mariadb)일 수 있다.
 - USERNAME과 USERPASSWORD는 데이터베이스 내 사용자계정 정보이다.
 - IP와 DB이름, DB종류, 사용자 계정명으로 시스템사용자가 식별된다.
 
 
로그인
mysql, mssql
- DB에 접속할 정보를 configuration해준다.
 
const getDbConfigByLoginInfo = (loginInfo) => {
	if (loginInfo.dbKind == 'MSSQL')
	{
		return ({
			user : loginInfo.dbUser,
			password : loginInfo.dbPassword,
			database : loginInfo.dbName,
			server : loginInfo.dbHostIp,
			port : parseInt(loginInfo.dbPort) || 1433
		})
	}
	else //mariadb, mysql용
	{
		return ({
			user : loginInfo.dbUser,
			password : loginInfo.dbPassword,
			database : loginInfo.dbName,
			host : loginInfo.dbHostIp,
			port : parseInt(loginInfo.dbPort) || 3306
		})
	}
}
export default getDbConfigByLoginInfo;
- 연결 비동기처리를 위해 async~await문법으로 connection 객체를 얻어서 연결된 DB에 쿼리를 날려 결과를 받아올 수 있다.
 
const mariadb = require('mariadb');
const MariaMyLogin = async (config, query) => {
	const conn = await mariadb.createConnection(config);
	console.log("maria connected");
	if (query)
	{
		try {
			const res = await conn.query(query);
			console.log("current user config:", config);
			console.log("get a result in query:", query, "res: ", res);
			return (res);
		} catch(e){
			console.log(e)
			throw(e);
		} finally {
			conn.end();
		}
	}
};
export default MariaMyLogin;
로그인 로직
- 사용자 데이터베이스 관련 정보를 얻어서 로그인을 합니다.
 - 사용자 데이터베이스 관련해 정보를 백엔드 DB에서 가지고 있어야, 해당 사용자가 스캔했던 정보를 식별할 수 있습니다.
 - 회원가입 절차가 원래 필요한 이유는 사용자에게 고유한 식별자를 줌으로써 해당 값에 인덱스를 걸어 테이블에서 빠르게 사용자를 식별할 수 있다는 것에 있다.
 - 별도의 회원가입 절차가 없기때문에, 서버에 한 번이라도 로그인했던 사용자의 정보를 서버DB에 저장해주도록 합니다.
 
- FORM에서 사용자의 데이터 입력
 - POST /login
 - 해당 정보로 접속할 수 있는지 확인 -> 실패시 
/로 리다이렉션 - 로그인 가능한 사용자인 경우, DB에 해당 사용자가 있는지 없는지 확인해야함.
 - 사용자 개인 식별 : 
IP주소, 사용자명, 데이터베이스 종류, 데이터베이스 명 - 위의 값으로 서버DB의 tb_user에 값이 있는지 확인하고, 없으면 생성.
 - user_seq를 로그인 세션에 저장한다.
 
- 사용자 데이터베이스의 비밀번호를 어디에 저장할 것인가가 문제
 - 데이터베이스에 접속하는 쿼리를 날리기 위해서는 어딘가 사용자의 DB비밀번호가 저장되어있어야만하고, 이를 계속 사용해야하는 문제가 있다.
 - 
    
따라서 서버의 세션 메모리에 저장해두려고한다.
 - 이제부터 세션의 
user_seq를 사용할 수 있다. 
테이블 속성 도메인 스캔
템플릿 생성
domain-scan
tableNames
- pug에서 mixin은 
변수에 대해 반복적인 작업을 하는 템플릿이다. - res.render의 매개변수로 던져진 
tableNames에 대해 적용된다. 
mixin tableNames(tableName)
    .tableName_wrapper
        a(href=`/domain-scan/${tableName}`).tableName_mixin=tableName
테스트테이블 생성
create table dump (
t1 int(10),
t2 float,
t3 double,
t4 boolean,
t5 bit,
t6 decimal,
t8 text,
t9 char(10),
t10 varchar(20),
t11 date,
t12 datetime,
t13 timestamp,
t14 boolean,
t15 binary,
t16 enum('N', 'Y')
);
domain-scan-result
- 도메인 스캔 결과는 2가지 종류가 있다.
 - 수치속성과 범주속성이 있다.
 - 해당 속성들의 속성값들은 
SHOW COLUMNS FROM ${테이블명};으로 확인할 수 있다. - 이 속성값들을 기준으로 테이블들의 속성을 수치속성과 범주속성으로 구분한다.
 
[
  {
    Field: 'pk',
    Type: 'int(11)',
    Null: 'YES',
    Key: '',
    Default: null,
    Extra: ''
  },
  {
    Field: 'test',
    Type: 'varchar(10)',
    Null: 'YES',
    Key: '',
    Default: null,
    Extra: ''
  },
  meta : [
	  ...
  ]
];
- 이렇게 값을 리턴해주게되는데, SQL 문에서 조금 제약을 걸어 수치속성 int, float, double 속성만 가져오도록 할 수 있다.
    
- 수치속성
        
SHOW COLUMNS from ${id} WHERE TYPE LIKE '%int%' OR TYPE LIKE 'double%' OR TYPE LIKE 'float%' OR TYPE LIKE 'boolean' OR TYPE LIKE 'bit' OR TYPE LIKE 'decimal'; - 범주속성
        
SHOW COLUMNS from ${id} WHERE TYPE LIKE '%char%' OR TYPE LIKE '%text%' OR TYPE LIKE '%date%' OR TYPE LIKE '%time%' OR TYPE LIKE 'binary' OR TYPE LIKE 'enum'; 
 - 수치속성
        
 
테이블 속성 편집
댓글남기기