[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';
- 수치속성
테이블 속성 편집
댓글남기기