아직 도메인과 필수,선택의 사항을 반영하지 않았음.



1. 예매 프로시저 

CREATE OR REPLACE PROCEDURE RESERVEPROC
( p_email in varchar2,
  p_class in varchar2,
  p_phonenumber in varchar2,
  p_name in varchar2,
  p_bookingcode in varchar2,
  p_timecode in varchar2,
  p_screencode in varchar2,
  p_moviecode in varchar2,
  p_totalprice in integer,
  p_seatcount in integer,
  p_seatcodes in SEATCODES
 )
 IS 
    I INTEGER;
 BEGIN
    --멤버 마일리지 업데이트
    
    IF p_email IS NOT NULL THEN
      UPDATE MEMBER
      SET MILEAGE = CASE 
                     WHEN class = 'D' THEN MILEAGE+p_totalprice*0.02
                     WHEN class = 'C' THEN MILEAGE+p_totalprice*0.04
                     WHEN class = 'B' THEN  MILEAGE+p_totalprice*0.06
                     WHEN class = 'A' THEN  MILEAGE+p_totalprice*0.08
                     WHEN class = 'S' THEN  MILEAGE+p_totalprice*0.1
                     END
      WHERE EMAIL = p_email;
    ELSE 
      INSERT INTO NONMEMBER
      VALUES (p_phonenumber,p_name);
    END IF;
                   
    --BOOKING테이블 예약레코드 삽입
      INSERT
      INTO BOOKING 
      VALUES (p_bookingcode,p_email,p_phonenumber,p_timecode,p_screencode,p_moviecode,p_totalprice,p_seatcount);

     
    --seatcodearr을 루프 돌면서 BOOKED_SEATS에 삽입하고 PERFORMANCE_SEAT의 사용여부 업데이트.  
    FOR I IN 1 .. p_seatcodes.COUNT
    LOOP
        --BOOKED_SEATS에 INSERT
        INSERT
        INTO BOOKED_SEATS 
        VALUES(p_bookingcode,p_screencode,p_seatcodes(I));
         
        --PERFORMANCE_SEAT UPDATE
        UPDATE
        PERFORMANCE_SEAT 
        SET SEATSTATUS=1 
        WHERE SEATCODE= p_seatcodes(I)
        and SCREENCODE= p_screencode
        and TIMECODE= p_timecode; 
    END LOOP;
    --커밋.
    commit;
END;

그런데 이러한 프로시저를 실행시키기 위해서 node.js에서 선택한 좌석들을 오라클 형식의 배열을 만들어 바인딩 시켜줘야 하는데 아직 node-oracledb에서 array binding을 제공하고 있지 않다.때문에 다음과 같은 블록문을 실행하여 스트링을 파싱하여 프로시저를 실행하도록 하였다.

--좌석 스트링을 파싱하여 예약프로시저 실행.
DECLARE
       p_seatcodes SEATCODES;
       s_seatcodes varchar2(300);
    BEGIN
       s_seatcodes := 'A1,B1,B2';
       SELECT REGEXP_SUBSTR(s_seatcodes, '[^,$]+', 1, LEVEL ) AS 검증항목
                            BULK collect into p_seatcodes
                            FROM DUAL
                            CONNECT BY REGEXP_SUBSTR(s_seatcodes, '[^,$]+', 1, LEVEL ) IS NOT NULL;
       RESERVEPROC('alciakng@uos.ac.kr','D','aa','SUPERPLEX12015-06-012','SUPERPLEX1','M1',60,6,p_seatcodes); 
  END;


2. 예매 취소 프로시저


--예약취소 프로시저
CREATE OR REPLACE PROCEDURE CANCELRESERVEPROC
( p_email in varchar2,
  p_class in varchar2,
  p_bookingcode in varchar2,
  p_totalprice in varchar2
 )
 IS 
    I INTEGER;
 BEGIN
    -- UPDATE PERFORMANCE_SEAT_TABLE
    UPDATE PERFORMANCE_SEAT 
    SET SEATSTATUS=0 
    where (screencode,seatcode,timecode) 
    in (select booked_seats.screencode,booked_seats.seatcode,booking.timecode 
        from booking, booked_seats 
        where booking.bookingcode = booked_seats.bookingcode 
        and booking.bookingcode=p_bookingcode);
    
    --멤버 마일리지 다시 깍아야함
    IF p_email IS NOT NULL THEN
      UPDATE MEMBER
      SET MILEAGE = CASE 
                     WHEN class = 'D' THEN MILEAGE-p_totalprice*0.02
                     WHEN class = 'C' THEN MILEAGE-p_totalprice*0.04
                     WHEN class = 'B' THEN  MILEAGE-p_totalprice*0.06
                     WHEN class = 'A' THEN  MILEAGE-p_totalprice*0.08
                     WHEN class = 'S' THEN  MILEAGE-p_totalprice*0.1
                     END
      WHERE EMAIL = p_email;
    END IF;
    
    --예약테이블에서 삭제(cascade로 booked_seat테이블도 알아서 삭제됨)
    delete 
    from booking 
    where bookingcode = p_bookingcode;
    commit;
END;  


3. 영화 등록 프로시저


CREATE OR REPLACE PROCEDURE ADDMOVIE
(
    name in varchar2,
    genre in varchar2,
    runningtime in varchar2,
    director in varchar2,
    rating in varchar2,
    company in varchar2,
    country in varchar2,
    actors in varchar2,
    image in varchar2,
    opendate in date,
    summary in varchar2
)
IS
    moviecode varchar2(10);
--영화등록 쿼리
begin 
    select 'M'||seq_movie.nextval into moviecode from dual;
    
    insert into movie 
    values(moviecode,name,genre,runningtime,director,rating,company,country,actors,image,opendate,summary);
    
    --이것만 실제에서 빼~
    insert into rating
    values(seq_rating.nextval,moviecode,0);
    commit;
end;

4. 일정등록 프로시저 


CREATE OR REPLACE PROCEDURE ADDTIMEPROC
(
  p_screencode in varchar2,
  p_moviecode in varchar2,
  p_moviedate in DATE,
  p_starttime in varchar2,
  p_endtime in varchar2
)
IS
  p_moviecount INTEGER;
BEGIN
  --상영회차를 count기반으로 계산
  select count(*)+1 
  into p_moviecount
  from time 
  where moviedate=p_MOVIEDATE and screencode=p_SCREENCODE;
  
  --time테이블에 insert
  insert 
  into time 
  values(p_SCREENCODE||to_char(p_MOVIEDATE,'yy-mm-dd')||p_MOVIECOUNT,p_STARTTIME,p_ENDTIME,p_MOVIEDATE,p_MOVIECOUNT,p_SCREENCODE,p_MOVIECODE);
 
  --PERFORMANCE_SEAT TABLE에 현재 등록된 좌석기반으로 insert
  INSERT INTO performance_seat (seatcode,screencode,timecode,seatstatus)
      SELECT
           seat.seatcode AS seatcode,
           seat.screencode AS screencode,
           p_SCREENCODE||to_char(p_MOVIEDATE,'yy-mm-dd')||p_MOVIECOUNT AS timecode,
           0 AS seatstatus
      FROM seat 
      WHERE screencode =p_SCREENCODE;
  
  commit;
END;


5. 워치리스트 추가 프로시저

--워치리스트 추가 프로시저 
CREATE OR REPLACE PROCEDURE WATCHLISTPROC
(p_email in varchar2,
 p_moviecode in varchar2
)
  IS
    IS_ADDED INTEGER;
  BEGIN
--이미 워치리스트에 추가되었는지 검사한다.
      select count(*) 
      into IS_ADDED
      from watchlist 
      where email=p_email and moviecode = p_moviecode;
      
      --추가 되어있지 않으면 추가한다.
      IF IS_ADDED=0 THEN
          insert into watchlist 
          values(p_email,p_moviecode); 
      END IF;

      commit;
END;


블로그 이미지

종환 Revolutionist-JongHwan

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

댓글을 달아 주세요

 

컴퓨터에서 음수 양수를 구별 하기위해 최상위 비트=MSB를 부호비트로 쓰는것이다.

최상위 비트가 0이면 양수, 1이면 음수로 표현 한다.
 

0001은 1, 1001은 -1

여기엔 문제가 있다.

2진수의 계산이 힘들어 진다는 것이다.

 1001 + 0001 = 1010

 (-1)    (1)    (0 이어야 함)
 

의미상으로 는 0000이나와야 하나 실제는 다르게 나온다
 

이 것을 해결하기 위해 나온것이 1의 보수이다.


1의 보수란, 음수 표현시에 0을 1로, 1을 0으로 바꿔주는 것
 

1의 보수로 표현하자면,

0001은 1, 1110은 -1이 된다.

계산을 다시 해보면
 

1110 + 0001 = 1111

 (-1)   (1)    (0이어야 함)


 

계산 해보면 0000이 아닌 1111이 나왔다.

이렇게 나오는 이유는 1의 보수가 1111,0000의 두가지 의 영을 갖기 때문이다.(이것이 1의 보수의 문제점)


 

1101 + 0001 = 1110

(-2)      (1)      (-1)

계산이 맞다.


 

1의 보수의 문제점을 해결 하기 위해 나온것이 2의 보수이다.

2의 보수란 0을 1로, 1을 0으로 모두 바꿔준후에 1을 더하는 방법이다.

0001은 1, 1111은 -1이된다.


 

다시 계산해 보면
 

1111 + 0001 = 10000

(-1)   (1)      (0이어야 함)
 

의 결과 가 나오는데 이 값은 맞게 된다. 최상위 비트가 1이지만 범위를 벗어났기 때문에

무시하기 때문이다. 따라서 0000 => 0이 된다.
 

1의 보수나 2의보수 는 감산기가 필요 없이 더하기만으로 뺄셈이 가능하다.

1의 보수는 결과에 캐리가 발생시 캐리값을 연산해주어야 한다.

그에 반해 2의 보수는 발생한 캐리를 무시 하기때문에 다른 처리를 할필요 가 없다.


쉽게 2의 보수를 표현하는 방법으로는 밑의 13을 예로 들면
오른쪽에서 왼쪽으로 가는도중 최초로 나오는 일까지 그대로 써주고 나머지는 보수를 취해주면
2의보수가된다.


<컴퓨터가 보수를 쓰는이유>

보수를 쓰는 이유는 컴퓨터가 (-)라는 개념이 없기 때문이다.

컴퓨터가 인식할 수 있는 것은 전기가 들어왔다(ON)전기가 나갔다(OFF)이것만 인식이

가능한데 음(-)이라는 개념은 컴퓨터에서 인식할수 없기 때문에 보수를 씁니다

1의 보수는 0이라는 개념이 없을때는 그냥 사용해도 좋으나

0의 개념이 들어갈 경우 1의 보수로 한다면 (+)0과 (-)0이 나오게 됩니다

분명히 0은 하나밖에 없는데 음, 양의 개념으로 나뉜다면 컴퓨터가 오작동 합니다

이를 방지하기 위해 2의 보수를 사용합니다.

2의 보수는 0의 개념이 단 하나로 지정되기 때문에 컴터가 오작동 할 이유가 없죠

그냥 쓰실때는 1의 보수도 괜찮으나

0의 개념을 쓰실경우는 2의 보수를 이용하여 사용하시는게 낫죠

결론은

음수 계산 및 기타 계산은 1의 보수 또는 2의 보수 둘 다 사용이 가능하지만

0의 개념을 하나로 통합하여 사용하기 위해서는

2의 보수를 사용하는게 좋다.

 

'이론 > 컴퓨터구조' 카테고리의 다른 글

2의 보수를 쓰는이유와 2의 보수 표현법  (2) 2015.05.29
블로그 이미지

종환 Revolutionist-JongHwan

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

댓글을 달아 주세요

ssh

서버/pass 2015.05.22 13:36

http://ko.wikipedia.org/wiki/%EC%8B%9C%ED%81%90%EC%96%B4_%EC%85%B8


시큐어 셸(Secure ShellSSH)은 네트워크 상의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사할 수 있도록 해 주는 응용 프로그램 또는 그 프로토콜을 가리킨다. 기존의 rshrlogin텔넷 등을 대체하기 위해 설계되었으며, 강력한 인증 방법 및 안전하지 못한 네트워크에서 안전하게 통신을 할 수 있는 기능을 제공한다. 기본적으로는 22번 포트를 사용한다.

SSH는 암호화 기법을 사용하기 때문에, 통신이 노출된다 하더라도 이해할 수 없는 암호화된 문자로 보인다.

•SSH(Secure Shell)는 버클리 서비스들(rsh, rcp, rlogin, rexec)및 telnet, ftp 서비스를 좀 더 보안이 강화된 명령으로 대체하기 위해 만들었다. 1995년 핀란드의 Tatu Ylönen이 개발해공개했고, 많은 반향을 이뤘다. 1995년 말 Ylönen은 SSH Communications Security사를 설립하고, 상용화되었다. 소스코드는 공개되었지만 여러가지 제약이 있었다고 하는데, 이에 SSH 1.2.12 릴리즈를 기반으로 OpenSSH 프로젝트가 결성되고 BSD 라이선스로 개발하기 시작했다. OpenSSH가 처음 선보인건 1999년 OpenBSD 2.6 릴리즈 부터다. 이후 계속 보완되어 오늘날에 이르게 되었다. •SSH의 주요 기능은 다음과 같다. ◦보안 접속을 통한 rsh, rcp, rlogin, rexec, telnet, ftp 등을 제공 .◦IP spoofing (IP스푸핑, 아이피 위/변조 기법중 하나)을 방지하기 위한 기능을 제공. ◦X11 패킷 포워딩 및 일반적인 TCP/IP 패킷 포워딩을 제공.

•SSH에 사용되는 암호화 알고리즘은 유럽에서 개발되었기 때문에, 미국의 수출 제한에도 걸리지 않는다.



'서버 > pass' 카테고리의 다른 글

ssh  (0) 2015.05.22
블로그 이미지

종환 Revolutionist-JongHwan

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

Tag ssh

댓글을 달아 주세요

출처 : http://rayg.tistory.com/81

 

 

2, 3년 전 ETL 비슷한 프로그램을 개발해서 여러 기관에 있는 서버에 배포한 적이 있었다. 각각 서버나 DBMS 환경이 다르긴 했지만, 운영하는데 별 문제는 없었다. 그렇게 운영하다가 신규 기능을 배포하게 되었는데, 유독 한 곳에서만 ORA-01861 이 발생했다. 


java.sql.SQLException: ORA-01861: literal does not match format string


처음에는 DBMS에 대한 의심을 하지 못했다. 서버 환경이 비슷한 다른 기관들은 이미 적용해서 운영 중이었기 때문이다. 인터넷이 안되는 기관이라 검색도 못해보고, 후일을 기약하며 철수했던 기억이 난다. 며칠 뒤 별 준비없이 다시 방문을 했는데, 이상없이 동작 하는게 아닌가. 뭐에 홀린 듯 했지만 바쁜 상황이었던 터라 그냥 지나갔었다. 


오늘 검색을 하다가 우연히 당시의 일을 떠올리게 되었다. 오라클에서 TO_DATE, TO_CHAR 함수를 사용할 때 형식을 지정하지 않는 경우, NLS_DATE_FORMAT 에 따라 위와 같은 오류가 발생할 수 있다는 것이다. 유추해 보건대 누군가 공교롭게도 마침 그 시점에 설정을 바꾸었다가, 원복을 시킨게 아닐까 싶다. 


아무튼 오늘의 결론은 오라클에서 TO_DATE, TO_CHAR을 사용한다면 반드시 형식을 지정해야 한다는 것!

블로그 이미지

종환 Revolutionist-JongHwan

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

댓글을 달아 주세요

1. 현재까지 작성한 예약 프로시저

--seatcodes라는 배열 타입 생성 CREATE OR REPLACE TYPE SEATCODES AS TABLE OF VARCHAR(3); --예약 프로시저 CREATE OR REPLACE PROCEDURE ReserveProc (bookingcode in varchar2, email in varchar2, timecode in varchar2, screencode in varchar2, moviecode in varchar2, totalprice in integer, seatcount in integer, --seatcodes라는 타입을 만들었다. seatcodearr in seatcodes, email in varchar2, class in varchar2 ) IS I BINARY_INTEGER; BEGIN --멤버 마일리지 업데이트 UPDATE MEMBER SET MILEAGE = CASE WHEN class = 'D' THEN MILEAGE+totalprice*0.02 WHEN class = 'C' THEN MILEAGE+totalprice*0.04 WHEN class = 'B' THEN MILEAGE+totalprice*0.06 WHEN class = 'A' THEN MILEAGE+totalprice*0.08 WHEN class = 'S' THEN MILEAGE+totalprice*0.1 END; --BOOKING테이블 예약레코드 삽입 INSERT INTO BOOKING VALUES (bookingcode,email,timecode,screencode,moviecode,totalprice,seatcount); --seatcodearr을 루프 돌면서 BOOKED_SEATS에 삽입하고 PERFORMANCE_SEAT의 사용여부 업데이트. FOR I IN 1 .. seatcodearr.COUNT LOOP --BOOKED_SEATS에 INSERT INSERT INTO BOOKED_SEATS VALUES(bookingcode,seatcodearr(I)); --PERFORMANCE_SEAT UPDATE UPDATE PERFORMANCE_SEAT SET SEATSTATUS=1 WHERE SEATCODE= seatcodearr(I) and TIMECODE= timecode; END LOOP; --커밋. commit; END;


오류타입

  • 오류: PL/SQL: Compilation unit analysis terminated
  • 오류(1,1): PLS-00410: duplicate fields in RECORD,TABLE or argument list are not permitted 



해결 ?


위와 같은오류는 아규먼트 선언부분에 중복변수가 있을 때 발생 

위의 코드를 보면 email이 중복이다. 

중복변수를 지워주면서 변수명도 바꿔주었다. 


CREATE OR REPLACE PROCEDURE RESERVEPROC
(p_bookingcode in varchar2,
 p_email in varchar2,
 p_timecode in varchar2,
 p_screencode in varchar2,
 p_moviecode in varchar2,
 p_totalprice in integer,
 p_seatcount in integer,
 p_seatcodes in seatcodes,
 p_class in varchar2
 )
 IS 
    I INTEGER;
 BEGIN
    --멤버 마일리지 업데이트
    UPDATE MEMBER
    SET MILEAGE = CASE 
                   WHEN class = 'D' THEN MILEAGE+p_totalprice*0.02
                   WHEN class = 'C' THEN MILEAGE+p_totalprice*0.04
                   WHEN class = 'B' THEN  MILEAGE+p_totalprice*0.06
                   WHEN class = 'A' THEN  MILEAGE+p_totalprice*0.08
                   WHEN class = 'S' THEN  MILEAGE+p_totalprice*0.1
                   END;
                   
    --BOOKING테이블 예약레코드 삽입               
    INSERT
    INTO BOOKING 
    VALUES (p_bookingcode,p_email,p_timecode,p_screencode,p_moviecode,p_totalprice,p_seatcount);               
     
    --seatcodearr을 루프 돌면서 BOOKED_SEATS에 삽입하고 PERFORMANCE_SEAT의 사용여부 업데이트.  
    FOR I IN 1 .. p_seatcodes.COUNT
    LOOP
        --BOOKED_SEATS에 INSERT
        INSERT
        INTO BOOKED_SEATS 
        VALUES(p_bookingcode,p_seatcodes(I));
         
        --PERFORMANCE_SEAT UPDATE
        UPDATE
        PERFORMANCE_SEAT 
        SET SEATSTATUS=1 
        WHERE SEATCODE= p_seatcodes(I)
        and TIMECODE= p_timecode;
    END LOOP;
    --커밋.
    commit;
END;



프로시저를 조회하니..


 select * from user_objects where object_type = 'PROCEDURE'; 

status가 valid하다고 나온다.성공!

블로그 이미지

종환 Revolutionist-JongHwan

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

댓글을 달아 주세요

출처 - http://www.gurubee.net/lecture/1041


프로시저(Procedure)란?

  특정 작업을 수행 하는, 이름이 있는 PL/SQL BLOCK 이다.

  매개 변수를 받을 수 있고, 반복적으로 사용 할 수 있는 BLOCK 이다.

  보통 연속 실행 또는 구현이 복잡한 트랜잭션을 수행하는 PL/SQL BLOCK을 데이터베이스에 저장하기 위해 생성 한다.

프로시저 문법

 
CREATE OR REPLACE procedure name 
   IN argument 
   OUT argument 
   IN OUT argument 

IS 

   [변수의 선언]

BEGIN  --> 필수 

   [PL/SQL Block] 
   -- SQL문장, PL/SQL제어 문장 

   [EXCEPTION]  --> 선택
  -- error가 발생할 때 수행하는 문장

END;  --> 필수 
    
  • CREATE OR REPLACE 구문을 사용하여 생성 한다.
  • IS 로 PL/SQL의 블록을 시작 한다.
  • LOCAL 변수는 IS 와 BEGIN 사이에 선언 한다.

프로시저 작성 예제

-- 프로시저의 이름은 update_sal이다 
-- update_sal 프로시저는 사번을 입력받아 급여를 인상 한다. 
-- 프로시저를 끝마칠 때에는 항상 "/"를 지정 한다.
SQL> CREATE OR REPLACE PROCEDURE update_sal 
     /* IN  Parameter */
     (v_empno    IN    NUMBER) 
         
     IS 

     BEGIN 

       UPDATE emp 
       SET sal = sal  * 1.1 
       WHERE empno = v_empno; 

       COMMIT; 

     END update_sal; 
     /     
    

프로시저 실행 예제

EXECUTE 문을 이용해 프로시저를 실행 한다.

SQL> EXECUTE update_sal(7369);
PL/SQL 처리가 정상적으로 완료되었습니다.

-- 7369번 사원의 급여가 10% 인상 되었는지 확인해 보기 바란다.
    


블로그 이미지

종환 Revolutionist-JongHwan

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

댓글을 달아 주세요

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 항상 겸손하자.

댓글을 달아 주세요


1. 우선 npm install 명령어로 paypal rest api sdk 모듈을 설치해준다.



2. 환경설정을 해준다.(자신만의 config.js 파일을 만든다)



3. 필자는 MVC 패턴으로 config폴더에 route.js 폴더를 만들고 라우팅 해주었다.



4. controllers 폴더내에 paypalController.js를 생성하고 paypalCreate, paypalExecute 함수를 작성한다.


코드는 영화예매 사이트 결제에 관한 것으로 다른 로직은 무시하고 payment라는 객체를 생성하고 paypal.payment.create로 paypal 결제를 생성한다는 점과 paypal.payment.execute에서는 session에 저장해 놓은 paymentId를 parameter로 결제 실행을 한다는 점을 유의하여 보면 되겠다.



cf. 추가적으로 invoice생성을 하여 결제 완료시 invoice를 얻어와서 db처리를 해줄 수도 있는데 이는 https://github.com/paypal/PayPal-node-SDK/를 참조하길 바란다.


5. 뷰를 생성한다.


뷰 생성시에는 아까 라우팅했던 /paypalCreate 을 호출할 때 보내줄 인자에 신경을 써야한다.

즉, paypal.payment.create가 정상적으로 결제를 생성하려면 payment 객체가 정상이여야 하는데 

payment정보는 /paypalCreate를 호출할 때 보내준 parameter에 의해 결정된다.


반드시 포함해야 하는 인자를 알려주는 아래 폼을 보자.



method, amount, currency는 반드시 포함되어야 한다.

method는 paypal or credit 신용카드로 하여 credit일 때에는 신용카드 정보를 같이 넘겨주어 위의 paypalController.js에서 소개한 방법대로 처리하면 되겠고,

amount는 총 액이다.

currency는 통화단위이다.



'프로그램 > node.js' 카테고리의 다른 글

node.js와 paypal 결제시스템 연동(1)  (0) 2015.05.13
passport-local  (0) 2015.03.27
인코딩문제(iconv를 통한 해결)  (0) 2015.03.27
node.js http request 모듈  (0) 2015.03.27
node-gyp 관련에러  (0) 2015.03.27
npm install 관련 오류  (0) 2015.03.27
블로그 이미지

종환 Revolutionist-JongHwan

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

댓글을 달아 주세요

 

 

영화예매 db를 짜고있다...

 

test row들..

 

insert into movie values('m1','미쓰홍당무','코믹','200분','김종환','정말 끝내주게 웃깁니다.','미쓰홍당무',0,'서울시립대');
insert into movie values('m2','킹스맨','액션','150분','강주희','액션 좋아요.','킹스맨',0,'서울시립대');
insert into movie values('m3','살인의추억','스릴러','300분','최윤주','정말 스릴있어요','미쓰홍당무',0,'서울시립대');
insert into movie values('m4','천재','드라마','100분','김종환','이사람 천잰가?','천재',0,'서울시립대');

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('s1','m1','07:20','09:20','2015-04-01',1);
insert into time values('s1','m2','10:20','12:20','2015-04-01',2);
insert into time values('s1','m3','13:20','15:20','2015-04-01',3);
insert into time values('s1','m4','16:20','18:20','2015-04-01',4);

insert into time values('s2','m1','07:20','09:20','2015-04-01',1);
insert into time values('s2','m2','10:20','12:20','2015-04-01',2);
insert into time values('s2','m3','13:20','15:20','2015-04-01',3);
insert into time values('s2','m4','16:20','18:20','2015-04-01',4);

insert into time values('s3','m1','07:20','09:20','2015-04-01',1);
insert into time values('s3','m2','10:20','12:20','2015-04-01',2);
insert into time values('s3','m3','13:20','15:20','2015-04-01',3);
insert into time values('s3','m4','16:20','18:20','2015-04-01',4);

insert into time values('s4','m1','07:20','09:20','2015-04-01',1);
insert into time values('s4','m2','10:20','12:20','2015-04-01',2);
insert into time values('s4','m3','13:20','15:20','2015-04-01',3);
insert into time values('s4','m4','16:20','18:20','2015-04-01',4);

 



insert into seat values('s1','a','1');

insert into seat values('s1','a','2');

insert into seat values('s1','a','3');

insert into seat values('s1','a','4');

insert into seat values('s1','a','5');

insert into seat values('s1','a','6');

insert into seat values('s1','a','7');

insert into seat values('s1','a','8');

insert into seat values('s1','a','9');

insert into seat values('s1','a','10');

insert into seat values('s1','a','11');

insert into seat values('s1','a','12');

insert into seat values('s1','a','13');

insert into seat values('s1','a','14');

insert into seat values('s1','a','15');

insert into seat values('s1','a','16');

insert into seat values('s1','a','17');

insert into seat values('s1','a','18');

insert into seat values('s1','b','1');

insert into seat values('s1','b','2');

insert into seat values('s1','b','3');

insert into seat values('s1','b','4');

insert into seat values('s1','b','5');

insert into seat values('s1','b','6');

insert into seat values('s1','b','7');

insert into seat values('s1','b','8');

insert into seat values('s1','b','9');

insert into seat values('s1','b','10');

insert into seat values('s1','b','11');

insert into seat values('s1','b','12');

insert into seat values('s1','b','13');

insert into seat values('s1','b','14');

insert into seat values('s1','b','15');

insert into seat values('s1','b','16');

insert into seat values('s1','b','17');

insert into seat values('s1','b','18');


commit;

 

부트스트랩 기반으로 영화 리스트 ui를 만들고 이에 필요한 query를 짜야한다.

 

(1) 특정 상영관과 날짜를 선택했을때 영화목록을 받아오고 (선호도, 개봉일자) 중 하나를 택하여 정렬할수 있는 쿼리

 

(2) (1)에 더하여 영화를 카테고리별로 받아오는 쿼리

 

 

ex)

//스크린코드가 s1인 스크린에 상영중인 영화를 출력하는 쿼리.
select * from movie where moviecode IN (select moviecode from screen_movie where SCREENCODE='s1');
//스크린코드가 s1이고 현재날짜가 해당영화의 시작일과 종료일 사이에 있을때 해당하는 영화를 출력하는 쿼리.
select * from movie where moviecode IN (select moviecode from screen_movie where SCREENCODE='s1' and '2015-05-20' > STARTDATE and '2015-05-20'< ENDDATE);
//스크린코드가 s1이고 현재날짜가 해당영화의 시작일과 종료일 사이에 있고 장르가 코믹인 영화를 출력하는 쿼리.
select * from movie where moviecode IN (select moviecode from screen_movie where SCREENCODE='s1' and '2015-05-20' > STARTDATE and '2015-05-20'< ENDDATE) and genre='코믹';
//스크린코드가 s1이고 현재날짜가 해당영화의 시작일과 종료일 사이에 있고 장르가 코믹인 영화를 선호도가 높은 영화부터 정렬하여 출력하는 쿼리.
select * from movie where moviecode IN (select moviecode from screen_movie where SCREENCODE='s1' and '2015-05-20' > STARTDATE and '2015-05-20'< ENDDATE) and genre='코믹' order by rating DESC;

블로그 이미지

종환 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 항상 겸손하자.

댓글을 달아 주세요