'node.js oracle'에 해당되는 글 2건

1. ERD 모델링



- 모델링에서 어려웠던 점


좌석을 등록하게 되면 SEAT테이블에 등록이 되는데 SEAT테이블에서는 일정에 따른 좌석의 사용여부를 관리할 수 없다.

SEAT에 사용여부 컬럼을 넣게 되면 TIME테이블에서 일정코드를 외래키로 받아서 따로 관리해야 되는데, 그렇게 되면 관리자가 좌석을 등록할 때 일정도 함께 등록해야 하는 모순이 생겨버린다. 설령 일정을 NULL허용을 해놓고 SEAT을 등록한다 하더라도 NULL값이 들어가게 되면 나중에 일정등록할 때 SEAT테이블에 UPDATE를 해주면서 다시 등록을 해야하는데 이 쿼리가 좀 만만치 않다.

그래서 PERFORMANCE_SEAT 테이블을 만들어 놓고 SEATSTATUS라는 사용여부 컬럼을 두었다. 관리자는 SEAT테이블에 좌석만 등록하고 일정을 등록할 시에 일정에 따른 좌석정보를 PERFORMANCE_SEAT테이블에 등록하는 데 이 때 다음과 같은 쿼리를 쓴다.




- 코딩시 어려웠던 점


예약할때 BOOKING테이블MEMBER테이블PERFORMANCE_SEAT 테이블, BOOKED_SEATS 테이블 이렇게 4개에 INSERT하고 UPDATE할 때 쿼리가 복잡하다. 이를 프로시저를 통해 해결하고자 한다(추후작성)


2. TEST ROWS


insert into movie values('M1','미쓰홍당무','코믹','200분','김종환','12세','서울시립대','한국','공효진','미쓰홍당무.jpg','2015/04/01','정말 끝내주게 웃깁니다.');

insert into movie values('M2','킹스맨','액션','150분','강주희','15세','서울시립대','미국','Dan Brown','킹스맨.jpg','2015/04/02','멋진액션!');

insert into movie values('M3','살인의추억','스릴러','300분','최윤주','19세','서울시립대','한국','송강호,김상경','살인의추억.jpg','2015/04/25','과연 누가 살인자일까?');

insert into movie values('M4','포화속으로','전쟁','150분','김종환','15세','서울시립대','한국','탑,권상우','포화속으로.jpg','2015/04/21','6.25 현장');

insert into movie values('M5','신세계','느와르','200분','김종환','19세','서울시립대','한국','이정재,황정민,최민식','신세계.jpg','2015/03/24','황정민 이정재 최민식 세남자의 느와르');

insert into movie values('M6','파파로티','드라마','150분','강주희','전체','서울시립대','한국','이제훈,한석규','파파로티.jpg','2015/03/21','테너의 감동적인 실화');

insert into movie values('M7','완득이','드라마','300분','최윤주','전체','서울시립대','한국','김윤석,유아인','완득이.jpg','2015/05/23','사제지간을 그린 드라마');

insert into movie values('M8','화이','스릴러','100분','김종환','19세','서울시립대','한국','여진구,김윤석','화이.jpg','2015/04/21','여진구를 다시보게 되는 작품');



insert into screen values('S1','1관');

insert into screen values('S2','2관');

insert into screen values('S3','3관');

insert into screen values('S4','4관');

insert into screen values('S5','5관');

insert into screen values('S6','6관');

insert into screen values('S7','7관');

insert into screen values('S8','8관');



insert into screen_movie values('S1','M1','2015-04-01','2015-05-29');

insert into screen_movie values('S1','M2','2015-03-28','2015-04-29');

insert into screen_movie values('S1','M3','2015-04-25','2015-06-02');

insert into screen_movie values('S1','M4','2015-03-17','2015-05-10');

insert into screen_movie values('S2','M1','2015-04-01','2015-05-29');

insert into screen_movie values('S2','M2','2015-03-28','2015-04-29');

insert into screen_movie values('S2','M3','2015-04-25','2015-06-02');

insert into screen_movie values('S2','M4','2015-03-17','2015-05-10');

insert into screen_movie values('S3','M1','2015-04-01','2015-05-29');

insert into screen_movie values('S3','M2','2015-03-28','2015-04-29');

insert into screen_movie values('S3','M3','2015-04-25','2015-06-02');

insert into screen_movie values('S3','M4','2015-03-17','2015-05-10');

insert into screen_movie values('S4','M1','2015-04-01','2015-05-29');

insert into screen_movie values('S4','M2','2015-03-28','2015-04-29');

insert into screen_movie values('S4','M3','2015-04-25','2015-06-02');

insert into screen_movie values('S4','M4','2015-03-17','2015-05-10');

insert into screen_movie values('S5','M1','2015-04-01','2015-05-29');

insert into screen_movie values('S5','M2','2015-03-28','2015-04-29');

insert into screen_movie values('S5','M3','2015-04-25','2015-06-02');

insert into screen_movie values('S5','M4','2015-03-17','2015-05-10');

insert into screen_movie values('S6','M1','2015-04-01','2015-05-29');

insert into screen_movie values('S6','M2','2015-03-28','2015-04-29');

insert into screen_movie values('S6','M3','2015-04-25','2015-06-02');

insert into screen_movie values('S6','M4','2015-03-17','2015-05-10');

insert into screen_movie values('S7','M1','2015-04-01','2015-05-29');

insert into screen_movie values('S7','M2','2015-03-28','2015-04-29');

insert into screen_movie values('S7','M3','2015-04-25','2015-06-02');

insert into screen_movie values('S7','M4','2015-03-17','2015-05-10');

insert into screen_movie values('S8','M1','2015-04-01','2015-05-29');

insert into screen_movie values('S8','M2','2015-03-28','2015-04-29');

insert into screen_movie values('S8','M3','2015-04-25','2015-06-02');

insert into screen_movie values('S8','M4','2015-03-17','2015-05-10');



insert into time values('S12015-05-011','07:20','09:20','2015-05-01',1,'S1','M1');

insert into time values('S12015-05-012','10:20','12:20','2015-05-01',2,'S1','M2');

insert into time values('S12015-05-013','13:20','15:20','2015-05-01',3,'S1','M3');

insert into time values('S12015-05-014','16:20','18:20','2015-05-01',4,'S1','M4');



insert into time values('S22015-05-011','07:20','09:20','2015-05-01',1,'S2','M1');

insert into time values('S22015-05-012','10:20','12:20','2015-05-01',2,'S2','M2');

insert into time values('S22015-05-013','13:20','15:20','2015-05-01',3,'S2','M3');

insert into time values('S22015-05-014','16:20','18:20','2015-05-01',4,'S2','M4');

insert into time values('S22015-05-015','18:40','20:20','2015-05-01',5,'S2','M1');



insert into time values('S32015-05-011','07:20','09:20','2015-05-01',1,'S3','M1');

insert into time values('S32015-05-012','10:20','12:20','2015-05-01',2,'S3','M2');

insert into time values('S32015-05-013','13:20','15:20','2015-05-01',3,'S3','M3');

insert into time values('S32015-05-014','16:20','18:20','2015-05-01',4,'S3','M4');



insert into time values('S42015-05-011','07:20','09:20','2015-05-01',1,'S4','M1');

insert into time values('S42015-05-012','10:20','12:20','2015-05-01',2,'S4','M2');

insert into time values('S42015-05-013','13:20','15:20','2015-05-01',3,'S4','M3');

insert into time values('S42015-05-014','16:20','18:20','2015-05-01',4,'S4','M4');



insert into seat values('A1','S1','A','1');

insert into seat values('A2','S1','A','2');

insert into seat values('A3','S1','A','3');

insert into seat values('A4','S1','A','4');

insert into seat values('A5','S1','A','5');

insert into seat values('A6','S1','A','6');

insert into seat values('A7','S1','A','7');

insert into seat values('A8','S1','A','8');

insert into seat values('A9','S1','A','9');

insert into seat values('A10','S1','A','10');

insert into seat values('A11','S1','A','11');

insert into seat values('A12','S1','A','12');

insert into seat values('A13','S1','A','13');

insert into seat values('A14','S1','A','14');

insert into seat values('A15','S1','A','15');

insert into seat values('A16','S1','A','16');

insert into seat values('A17','S1','A','17');

insert into seat values('A18','S1','A','18');

insert into seat values('B1','S1','B','1');

insert into seat values('B2','S1','B','2');

insert into seat values('B3','S1','B','3');

insert into seat values('B4','S1','B','4');

insert into seat values('B5','S1','B','5');

insert into seat values('B6','S1','B','6');

insert into seat values('B7','S1','B','7');

insert into seat values('B8','S1','B','8');

insert into seat values('B9','S1','B','9');

insert into seat values('B10','S1','B','10');

insert into seat values('B11','S1','B','11');

insert into seat values('B12','S1','B','12');

insert into seat values('B13','S1','B','13');

insert into seat values('B14','S1','B','14');

insert into seat values('B15','S1','B','15');

insert into seat values('B16','S1','B','16');

insert into seat values('B17','S1','B','17');

insert into seat values('B18','S1','B','18');



블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.

학교 텀프로젝트로 db설계 과목을 듣게 되었다....그런데 rdb를 무조건 oracle을 써야만 하니..

jsp,서블릿은 경험이 많이 부족하고 node.js 로 연동을 시도해 보았다.


1. oracledb 모듈설치(oracle 사에서 공식지원하는 모듈) 


우선 oracle 공식홈페이지의 node.js support를 참고하였다.

https://blogs.oracle.com/opal/entry/introducing_node_oracledb_a_node

git-hub 오픈소스 프로젝트로 나와있다. 윈도우 사용자 이기때문에 

https://github.com/oracle/node-oracledb/blob/master/INSTALL.md 을 참고하여 oracle에서 공식지원하는 node.js 모듈인 oracledb 모듈을 설치하는데 성공하였다.


2. node.js와의 연동 test


dbconfig.js


var oracledb = require('oracledb');
 
module.exports = {
		  user          : "JH",
		  password      : "JH",
		  connectString : "localhost/XE"
};



movieController.js

exports.addMovie = function(req,res){
	
	oracledb.getConnection(dbConfig,
		function(err,connection){
		
			 if (err) {
			      console.error(err.message);
			      return;
			 }
			 console.log(req.body);
			 connection.execute(
			 "insert into Movie VALUES(:CODE,:NAME,:CATEGORY,:RUNNINGTIME,:DIRECTOR,:OUTLINE,:IMAGE)"
		    ,[1,req.body.name,req.body.category,req.body.runningtime,req.body.director,req.body.outline,req.body.image]
		    ,
			 function(err){
				if(err){
					console.log(err.message);
					return;
				}
				connection.commit(function(err){
					if(err){
						console.log(err.message);
						return;
					}
					res.render('addMovie');
				 })
		     });
          });
}






위와 같은 방식으로 config 폴더에 db configure set을 하고 controller에서 간단한 insert를 해보았다..


아래는 간단하게 만든 html 폼이다. 



이렇게 폼까지 만들고 db에 insert를 해보았으나 한글깨짐 문제가 발생한다. 

select하고 콘솔에 출력해보았더니(빨간색 동그라미 친부분) 한글이 깨져서 나온다.


열심히 구글링 해서 (http://www.enjoydev.net/xe_new/index.php?mid=en_devboard&category=556&document_srl=289&listStyle=viewer)


sysdba로 접속 후..

update sys.props$ set value$='KO16MSWIN949' where name='NLS_CHARACTERSET'; 
update sys.props$ set value$='KO16MSWIN949' where name='NLS_NCHAR_CHARACTERSET'; 
update sys.props$ set value$='KOREAN_KOREA.KO16MSWIN949' where name='NLS_LANGUAGE';

위와 같이 캐릭터셋을 변경한 후 오라클 재가동.

commit;

shutdown immediate;

startup;


NLS_LANG 변경.

시작>실행>regedit을 실행 후 oracle>key_xe>nls_lang 값을

korean_korea.ut8로 변경하였다..

oracle character set을 변경하는 방법까지 적용하였으나, 결과는 마찬가지다.





3. oracle node.js 파트 담당자가 언어 서포트가 아직 안된다고 한다... (git-hub issue page 공식답변)


문제해결!

 

실행 -> regedit -> NLS_LANG을 AMERICAN_AMERICA.UTF8로 설정 후 한글이 정상적으로 출력되었다.


NLS_LANG이 KOREAN이면 오히려 한글 출력이 안되고 꼭 아메리칸 아메리카 UTF8로 설정해야 한다.


블로그 이미지

종환 Revolutionist-JongHwan

github.com/alciakng 항상 겸손하자.