1-1. 사원번호를 물어보게하고 사원번호를 입력하면 해당 사원의 모든 컬럼의 정보가  EMP745 테이블에 입력되게 하는 PL/SQL을 작성하시

오.

SELECT * FROM EMP745;

-----------------------------------------------------------------------------------------------------

SET SERVEROUTPUT ON;

ACCEPT P_EMP_NO PROMPT 'EMP745테이블로 복사할 사원번호를 입력하세요'


DECLARE 

  V_DEPT_NO NUMBER(4) := 0;

  V_EMP_NO NUMBER(8) := &P_EMP_NO;

  V_EMP_NM VARCHAR2(20);

  V_EMP_ID VARCHAR2(30);

  V_SAL NUMBER(10) :=0;

BEGIN

  SELECT DEPT_NO, EMP_NO, EMP_NM, EMP_ID, SAL 

  INTO V_DEPT_NO, V_EMP_NO, V_EMP_NM, V_EMP_ID, V_SAL

  FROM TB_LS_EMP867

  WHERE EMP_NO = V_EMP_NO;

  DBMS_OUTPUT.PUT_LINE(V_EMP_NM || '님의 레코드는 다음과 같습니다. : ' || V_DEPT_NO || ' | ' || V_EMP_NM || ' | ' || V_EMP_ID || ' | ' || 

V_SAL);

  

  -- EMP745테이블에 DB MIGRATION

  INSERT INTO EMP745 (DEPT_NO, EMP_NO, EMP_NM, EMP_ID, SAL )

  VALUES (V_DEPT_NO, V_EMP_NO, V_EMP_NM, V_EMP_ID, V_SAL);

  

END;

/

-- EMP745 테이블 확인 

SELECT * FROM EMP745;


1-2. 사원번호를 입력하면 해당 사원의 모든 컬럼의 정보가  EMP745 테이블에 입력되게 하는 프로시저를 생성하라.

-- EXEC PR_MIG_EMP745(1)

-- LPAD 함수를 사용하라. LPAD(변수,8,0)


CREATE OR REPLACE PROCEDURE PR_MIG_EMP745

  (P_EMP_NO NUMBER)


IS

  V_DEPT_NO NUMBER(4) := 0;

  V_EMP_NO NUMBER(8) := LPAD(P_EMP_NO,8,0);   --LPAD 함수를 사용

  V_EMP_NM VARCHAR2(20);

  V_EMP_ID VARCHAR2(30);

  V_SAL NUMBER(10) :=0;


BEGIN

  

  SELECT DEPT_NO, EMP_NO, EMP_NM, EMP_ID, SAL 

  INTO V_DEPT_NO, V_EMP_NO, V_EMP_NM, V_EMP_ID, V_SAL

  FROM TB_LS_EMP867

  WHERE EMP_NO = V_EMP_NO;

  DBMS_OUTPUT.PUT_LINE(V_EMP_NM || '님의 레코드는 다음과 같습니다. : ' || V_DEPT_NO || ' | ' || V_EMP_NM || ' | ' || V_EMP_ID || ' | ' || 

V_SAL);

  

  -- EMP745테이블에 DB MIGRATION

  INSERT INTO EMP745 (DEPT_NO, EMP_NO, EMP_NM, EMP_ID, SAL )

  VALUES (V_DEPT_NO, V_EMP_NO, V_EMP_NM, V_EMP_ID, V_SAL);

  

END;

/


EXEC PR_MIG_EMP745(2);

SELECT * FROM EMP745;

-- 1. WHILE .. LOOP 을 중첩으로 사용하여 4단 ~7단까지 출력하는 프로시저를 생성해보아라.


CREATE OR REPLACE PROCEDURE PR_GUGUDAN_4TO7

IS 


  V_OUT_DAN NUMBER(2) := 7;

  V_IN_DAN NUMBER(2) := 9;

  i NUMBER(2) := 3;

  j NUMBER(2) := 0;

  

BEGIN    -- 내가 생각하는 while 문 문법과 조금 다르다.

  <<Outer_loop>>

    WHILE i < V_OUT_DAN LOOP

      i := i+1;

      j := 0;

    DBMS_OUTPUT.PUT_LINE(i);

    <<Inner_loop>>

      WHILE j < V_IN_DAN LOOP

        j := j+1;

        DBMS_OUTPUT.PUT_LINE(j);

        DBMS_OUTPUT.PUT_LINE( i || '*' || j || ' = ' || i*j );

      END LOOP Inner_loop;

    END LOOP Outer_loop;

END;

/


EXEC PR_GUGUDAN_4TO7;



2-1. 부서번호를 물어보게 하고 부서번호를 입력하면 해당 부서번호의 토탈월급을 출력되게 하시오.


SET SERVEROUTPUT ON

SET VERIFY OFF

ACCEPT P_DEPT_NO PROMPT '부서번호를 입력하시오!'

DECLARE 

  V_DEPT_NO NUMBER(4) := &P_DEPT_NO; --&를 배먹으면 안된다.

  V_SUM_SAL NUMBER(10) := 0;

BEGIN 

  SELECT SUM(SAL) 

  INTO V_SUM_SAL

  FROM TB_LS_EMP867

  WHERE DEPT_NO = V_DEPT_NO;

  

  DBMS_OUTPUT.put_line('TOTAL SALAD: '||V_SUM_SAL);

END;

/



2-2. 부서번호를 입력하면 해당 부서번호의 토탈월급을 출력되게 하는 프로시저를 만들어라.

-- 프로시저호출 EXEC PR_DEPT_TOT_SAL(82)은 82번으로 해라.

CREATE OR REPLACE PROCEDURE PR_DEPT_TOT_SAL

  ( P_DEPT_NO IN NUMBER ) 

IS


BEGIN

  DECLARE

  V_DEPT_SAL NUMBER(10):= 0;


  BEGIN 

    SELECT SUM(SAL) 

    INTO V_DEPT_SAL

    FROM TB_LS_EMP867 

    WHERE DEPT_NO = P_DEPT_NO;

    DBMS_OUTPUT.PUT_LINE(V_DEPT_SAL);

  END;

  

END;

/


EXEC PR_DEPT_TOT_SAL(82);


-- 부서번호를 입력하면 해당 부서번호의 토탈월급을 출력되게 하는 프로시저를 만들어라.

-- 프로시저호출 EXEC PR_DEPT_TOT_SAL(82)은 82번으로 해라.

CREATE OR REPLACE PROCEDURE PR_DEPT_TOT_SAL

  ( P_DEPT_NO IN NUMBER ) 

IS 

  V_DEPT_SAL NUMBER(10):= 0;  -- DECLARE는 생략가능하다.


  BEGIN 

    SELECT SUM(SAL) 

    INTO V_DEPT_SAL

    FROM TB_LS_EMP867 

    WHERE DEPT_NO = P_DEPT_NO;

    DBMS_OUTPUT.PUT_LINE(V_DEPT_SAL);

  END;

  

/


EXEC PR_DEPT_TOT_SAL(82);



3-1. 사원번호를 물어보게 하고 사원의 부서번호, 이름, 월급, 아이디를 출력하게 하시오.

SET SERVEROUTPUT ON

ACCEPT P_EMP_NO PROMPT '사원번호를 입력하시오!'

DECLARE 

  V_EMP_NO NUMBER(8) := LPAD(&EMP_NO,8,0);

  V_EMP_NM VARCHAR2(30);

  V_EMP_ID VARCHAR2(30);

  V_SAL NUMBER(20) := 0;

  V_DEPT_NO NUMBER(4) := 0;


BEGIN 

  SELECT EMP_NM, EMP_ID, SAL, DEPT_NO 

  INTO V_EMP_NM, V_EMP_ID, V_SAL, V_DEPT_NO

  FROM TB_LS_EMP867

  WHERE EMP_NO = V_EMP_NO;

  DBMS_OUTPUT.put_line('이름: ' || V_EMP_NM);

  DBMS_OUTPUT.put_line('부서번호: ' || V_DEPT_NO);

  DBMS_OUTPUT.put_line('아이디: ' || V_EMP_ID);

  DBMS_OUTPUT.put_line('월급: ' || V_SAL);

END;  

/



3-2. 사원번호를 입력하면 해당사원의 부서번호, 이름, 월급, 아이디를 출력하는 프로시저를 만들어라.

-- 프로시저호출 EXEC PR_MEM_INFO(1)은 1번으로 해라. 

CREATE OR REPLACE PROCEDURE PR_MEM_INFO 

  (P_EMP_NO IN NUMBER) -- 프로시저의 IN, OUT 변수를 만들때에는 BYTE수를 쓰지 않아야한다. NUMBER(8)이런거 ERROR


IS

  V_EMP_NM VARCHAR2(30);

  V_EMP_ID VARCHAR2(30);

  V_SAL NUMBER(20) := 0;

  V_DEPT_NO NUMBER(4) := 0;

  

BEGIN

  SELECT EMP_NM, EMP_ID, SAL, DEPT_NO 

  INTO V_EMP_NM, V_EMP_ID, V_SAL, V_DEPT_NO

  FROM TB_LS_EMP867

  WHERE EMP_NO = P_EMP_NO;

  DBMS_OUTPUT.put_line('이름: ' || V_EMP_NM);

  DBMS_OUTPUT.put_line('부서번호: ' || V_DEPT_NO);

  DBMS_OUTPUT.put_line('아이디: ' || V_EMP_ID);

  DBMS_OUTPUT.put_line('월급: ' || V_SAL);

END;

/


EXEC PR_MEM_INFO(1);

-- ★☆★☆★ basic loop (FOR LOOP)

-- 1.숫자 1부터 20까지 출력하는데 for loop 문으로 구현해서 출력하시오.


SET SERVEROUTPUT ON -- default : serveroutput (dbms_output.put_line) 이 OFF 상태이다.


BEGIN 

  FOR i IN 1..20 LOOP

    DBMS_OUTPUT.PUT_LINE('출력숫자 : ' || i );

  END LOOP;

END;  

/


-- 2. FOR .. LOOP 사용하여 구구단 6단을 출력하시오.


DECLARE 

  V_COUNT NUMBER(10) := 0;

BEGIN 

  FOR i IN 1..9 LOOP

    V_COUNT := 6 * i;

    DBMS_OUTPUT.PUT_LINE ( '6' || ' * ' || i || ' = ' || 6*i); 

  END LOOP;

END;

/


--3. FOR LOOP 을 중첩해서 구구단 2단 ~ 4단까지 출력하시오.


BEGIN   

  FOR i IN 2..4 LOOP

    FOR j IN 1..9 LOOP

    DBMS_OUTPUT.PUT_LINE( i || ' * ' || j  || ' = ' || i*j);  

    END LOOP;

  END LOOP;

END;

/


-- LPAD 함수: 좌측에 자리수 만큼 채워주는 함수

-- 사용법 : LPAD(변수, 길이, 변형자)

-- ex) SELECT LPAD('123',8,0) FROM DUAL


--4. TB_LS_EMP867 테이블을 생성하고 for 문을 이용해서 data를 입력하시오.


CREATE TABLE TB_LS_EMP867

  ( EMP_NO  NUMBER(8), EMP_ID VARCHAR2(12) );

  

DECLARE 

  V_EMP_NO VARCHAR2(8):= 0; 

  V_EMP_ID VARCHAR2(12);


BEGIN 

  FOR i IN 1..20 LOOP

    INSERT INTO TB_LS_EMP867(EMP_NO, EMP_ID)

    VALUES (LPAD((i),8,0),'KOR-'|| LPAD((i),8,0));

  END LOOP;  

END;

/

SELECT * FROM TB_LS_EMP867;


--5. 프로시저를 만들어보자.

CREATE OR REPLACE PROCEDURE PR_ISRT_TAB_EMP

IS

BEGIN

  DECLARE 

    V_EMP_NO VARCHAR2(8):= 0; 

    V_EMP_ID VARCHAR2(12);

  

  BEGIN 

    FOR i IN 1..20 LOOP

      INSERT INTO TB_LS_EMP867(EMP_NO, EMP_ID)

      VALUES (LPAD((i),8,0),'KOR-'|| LPAD((i),8,0));

    END LOOP;  

  END;

END;   

/


EXEC PR_ISRT_TAB_EMP;

--EXECUTE PR_ISRT_TAB_EMP;

--CALL PR_ISRT_TAB_EMP;


SELECT * FROM TB_LS_EMP867;


1. eclipse 를 설치하기 위해서는 ( 현재 Mars 다음 Neon 버전 )

jdk 1.8 이상이어야한다. 따라서 jdk 1.7 이하 버전이 설치 되어있으면 해당 eclipse 를 설치할 수 없다. 


2. 아래 url 로 들어가서 jdk를 down 받는다.  (1.8)

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html


3. 다운받은 jdk ( Java Development tool Kit )를  설치한다.


4. jdk 설치 후  환경변수를 설정해야한다.

해당 jdk1.8 은 /Library/Java/JavaVirtualMachines 밑에 생성된다.

/Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home 을 PATH 설정해줘야한다.


5. 터미널을 실행한다.  cd /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents 

cd Home


6. i 를 입력하여 insert 모드로 들어간다. 

export JAVA_HOME = /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home 를 추가해준다.


7. ESC 를 입력하여 insert 모드에서 빠져나온다. 


8. 이클립스(eclipse)를 install 한다.


참고할 url :

 http://ishappy.tistory.com/entry/MAC-OS-X-%EC%97%90-JDK-%EC%84%A4%EC%B9%98%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95

 Mac vi mode 명령어 참고 :

1. http://parklize.blogspot.kr/2014/10/mac-vim-command.html

2. http://devfalledinmac.tistory.com/12


1. 터미널 실행 방법 

 control + space 를 입력하면 Spotlight 검색이 가능하다 여기서 터미널 혹은terminal을 실행 시켜주면된다.


2. 기본적인 터미널 명령어들

ls : 디렉토리에 있는 파일 및 폴더의 리스트를 보여준다.  ( Windows : dir )

cd : change directory 로 폴더(디렉토리)를 변경한다.  ( Windo

ws : cd )

clear : clear screen 으로 화면에 있는 모든 글씨를 깨끗하게 비워준다.  ( Windows : cls )

cp : 저장된 디렉토리로 파일을 복사해준다.  ( Windows : copy )

rm : 파일을 삭제한다.  ( Windows : del ) 

ipconfig getifaddren0 : ip와 같은 네트워크 설정을 본다.  ( Windows : ipconfig ) 

logout :콘솔을 종료한다.  ( Windows : exit )  


3. macOS 확인 

좌측 상단 Apple  ( 사과 모양 클릭 ) 이 Mac 에 관하여 선택

 

지금까지 app.js 파일의 내용을 변경하고나서는 매번 node app.js 라고 커맨드창에 입력하여 재실행해줬다. 

만약 supervisor 모듈을 사용할 경우에는 app.js 파일의 내용을 수정하더라도, 다시 재시작을 하지 않고도 자동으로 재실행 되게 할 수 있다.  

npm install supervisor -g 를 입력하여 설치해주자.


node app.js 로 실행시키지않고,

supervisor app.js 로 실행시켜주자.



app.js 파일을 열어서 수정한 후에 save 시켜주면,

자동으로 서버가 재시작 되는 것을 확인 할 수 있다. 



const express =require('express');    // 모듈을 가져오자.

const app= express();   //express().get 이런식으로 사용해도 되지만! 가독성을 높여주기 위하여 app이라는 상수에 담아주자.

const bodyParser = require('body-parser'); 


app.locals.pretty= true;     // 코드를예쁘게해준다.

app.set('view engine','jade');

app.set('views','./views');


// use라는 api를 사용하여 express의 정적서비스를 app.js에서 사용할 수 있도록 연결시키자.

// public 디렉토리 안의 정적인 파일들을 직접적으로 사용할 수 있게 하는 코드

app.use(express.static('public'));  


// use라는 api를 사용하여 body-parser를 app.js에서 사용할 수 있도록 연결시키자.

app.use(bodyParser.urlencoded({extended: false}));

// 이렇게 미들웨어를 들여오고 use로 이 미들웨어(body-parser를 연결시켜서 request 객체의 body api를 사용할 수 있게 만든다.)



app.get('/', function(request, response){     // get 방식  // get을 라우터(길 안내자)로 생각하자.

response.send('hello world');

});


app.get('/rout',function(req, res){

res.send('<h1>hello router</h1>, <img src="/router.png">');

});


app.get('/login', function(req, res){

res.send('Login please');

});


app.get('/template', function(req, res){

res.render('temp',{_title:'jade',time:Date()});

});


app.listen(3000, function(){

console.log('connected 3000 port');

});



//서로 다른 네트워크를 중계해주는 장치. 보내지는 송신정보에서 수신처 주소를 읽어 가장 적절한 통신통로를 지정하고, 다른 통신망으로 전송하는 장치를 말한다.


//============================================================================================

// 정적인 파일을 모아놓은 (나의 경우 public)디렉토리는 패키지로 선언한 해당 디렉토리(package.json 파일이 있는..)에 위치시키자.  



// 작은 따옴표아니다. 물결표시 밑에 그래이브액센트?

// var a = ``; 그래이브 액센트 ``를 사용하여 html코드를 변수에 담아 해당 변수를 사용할 수 있다. 


 

app.get('/dynamic', function(req, res){

var time =Date(); 

var lis = '';

for(var i=0; i<5; i++){

lis = lis + '<li> coding</li>';

}

var output = `<!DOCTYPE html> 

<html>

<head>

<meta charset="utf-8">

</head>

<body>

Hello, Dynamic!

<ul>

${lis} 

<!--변수를 담아서 표현하는 방법 use 그래이브 액센트-->

</ul>

${time}

</body>

</html>`;        

res.send(output);

});


//============================================================================================


// 주의할 부분

// app.get('/info',function(req, res){

// res.send('hello')   로직상 가장 위에 있는 것만 응답객체에 실어서 보내지고 그다음껀 보내지지 않는다. 

// res.send(req.query.id);  

// });

app.get('/info',function(req, res){

res.send(req.query.name+','+req.query.id);     // req요청객체에 쿼리스트 링을 실어서!

});



app.get('/topic',function(req, res){

var topics =[

'javascript is the client language'

,'nodejs is the server side javascript'

,'express is a module of extra modules'

];


//`의 경우 작은 따옴표아닌것 알아두자.


var output = `

<a href = "/topic?id=0">Java Script</a><br/>

<a href = "/topic?id=1">Node js</a><br/>

<a href = "/topic?id=2">Express</a><br/>

${topics[req.query.id]}

`;

res.send(output);

});


//============================================================================================



app.get('/board/:number',function(req, res){

var boards =[

'javascript is the client language'

,'nodejs is the server side javascript'

,'express is a module of extra modules'

];



var output = `

<a href = "/board/0">Java Script</a><br/>

<a href = "/board/1">Node js</a><br/>

<a href = "/board/2">Express</a><br/>

${boards[req.params.number]}

`;

res.send(output);

});


//============================================================================================



app.get('/content/:number/:mode/:name',function(req, res){

var output=`

<h1>number : ${req.params.number}</h1>

<h2>mode : ${req.params.mode}</h2>

<h3>name : ${req.params.name}</h3>

`;

res.send(output);

});


// path 의 갯수를 맞춰줘야만한다. 만약 http://127.0.0.1:3000/content/0/1 정상적으로 화면이 뿌려지지 않는다. 


//============================================================================================


app.get('/form',function(req, res){

res.render('form');

});


app.get('/form_receiver', function(req, res){

var tit = req.query.title;

var des = req.query.description;

var output = `

<h2>title : ${tit} </h2>

<h2>description : ${des} </h2>

`;

res.send(output);

}); 


//============================================================================================



// post방식을 처리할 때는 app.post로 하는 것이 맞다. 

// 아래의 경우에는 request객체의 query를 사용한 것

// undefined 가 뜬다. title, description에 undefined .

// app.post('/form_receiver',function(req, res){

// var tit = req.query.title;

// var dsc = req.query.description;

// res.send('title: '+ tit+' and descriptrion: '+ dsc);

// });



// 기본적으로 request 객체 req 안에 사용자가 요청한 정보들이 들어가 있다.

// 즉, req의 query를 사용하여 title을 받아올 수 없다.

// 그럼 어떻게 post 방식으로 처리하였을 때 form_receiver 패쓰로 접근시 값을 나타낼 수 있는가.

// req 객체의 query가아닌 body로 받아줘야한다.

// 그런데 제약이 있다. body api를 사용하기 위해서는 body-parser 혹은 multer와 같은 middleware(미들웨어)를 사용하여 제어해야한다.

// body-parser 모듈을 설치해보자. npm install body-parser --save

// var bodyparser = require('body-parser'); 를 app.js에 입력하여 해당 모듈을 들여오자.

// app.js로 들어오는 모든 요청들은 body-parser라는 미들웨어를 먼저 통과한 다음에 라우터가 동작하게 된다.


// 결론

// get 방식의 경우에는 express 가 기본적으로 query api를 제공하지만 , 

// post방식의 경우에는 기본적으로 body api를 제공하지 않으므로,

// body-parser 혹은 multer와같은 미들웨어가 따로 필요하다.

// 그래서 위와같은 미들웨어를 npm으로 설치한 후에 1.require --> 2.use 를 이용하여 사용한다. 



// url에 127.0.0.1:3000/post로 접근할 경우에는 get방식으로 접근해야한다. 

// 그 이유는 url에 path를 입력하고 들어가는 것이므로 post방식으로 접근해서는 안된다. 올바르게 찾아가지 못한다.

app.get('/post',function(req, res){

res.render('post');

});


// request 객체의 body를 사용해보자.

app.post('/form_receiver',function(req, res){

var tit = req.body.title;

var des = req.body.description;

var output = `

<h2>title : ${tit}</h2>

<h2>description : ${des}</h2>

`;

res.send(output);

});




'nodejs' 카테고리의 다른 글

(22) supervisor 를 사용해보자.  (1) 2016.06.07
(20) 데이터 전송 (POST 방식)  (0) 2016.06.02
(19) 데이터 전송 (GET 방식)  (0) 2016.06.02
(18) GET vs POST  (0) 2016.06.01
(17) semantic url (의미론적 url) vs 쿼리스트링 방식  (0) 2016.06.01

어떻게 하면 post방식으로 보낸 데이터를 서버측에서 확인할 수 있는가?


요약.

// get 방식의 경우에는 express 가 기본적으로 query api를 제공하지만 , 

// post방식의 경우에는 기본적으로 body api를 제공하지 않으므로,

// body-parser 혹은 multer와 같은 미들웨어가 따로 필요하다.

// 따라서 위와같은 미들웨어를 npm으로 설치한 후에 1.require --> 2.use 를 이용하여 사용한다. 


==========================================================

post.jade


doctype html

html

head    

meta(charset='utf-8')

body

form(action='/form_receiver' method='post')

p

input(type='text' name='title')

p

textarea(name='description')

p

input(type='submit' value='forward Server')



// post 방식으로 해보자.

// post 방식을 사용했을 경우에는 정상적으로 아래의 정보들이 넘어가지를 않는다.

==========================================================


app.get('/postGo', function(req, res){

res.render('post');    

});

// express 의 get으로 처리하면 안된다.

post방식을 처리할 때는 app.post로 하는 것이 맞다. 



아래의 경우에는 request객체의 query를 사용한 것

// undefined 가 뜬다. title, description에 undefined .

// app.post('/form_receiver',function(req, res){

// var tit = req.query.title;

// var dsc = req.query.description;

// res.send('title: '+ tit+' and descriptrion: '+ dsc);

// });


기본적으로 request 객체 req 안에 사용자가 요청한 정보들이 들어가 있다.

즉, req 의 query를 사용하여 title을 받아올 수 없다.

그럼 어떻게 post 방식으로 처리하였을 때 form_receiver 패쓰로 접근시 값을 나타낼 수 있는가.

req 객체의 query가아닌 body로 받아줘야한다.

제약이 있다. body api를 사용하기 위해서는 body-parser 혹은 multer와 같은 middleware(미들웨어)를 사용하여 제어해야한다.

body-parser 모듈을 설치해보자. npm install body-parser --save



var bodyparser = require('body-parser'); 를 app.js 입력하여 해당 모듈을 들여오자.

app.js로 들어오는 모든 요청들은 body-parser라는 미들웨어를 먼저 통과한 다음에 라우터가 동작하게 된다.

이렇게 미들웨어를 들여오고 use로 이 미들웨어(body-parser를 연결시켜서 request 객체의 body api를 사용할 수 있게 만든다.

================================================================

++ app.js 


const bodyParser = require('body-parser'); 

app.use(bodyParser.urlencoded({extended: false}));


// request 객체의 body를 사용해보자.

app.post('/form_receiver',function(req, res){

var tit = req.body.title;

var dsc = req.body.description;

res.send('title: '+ tit+' and descriptrion: '+ dsc);

});

================================================================


get 방식과 달리, url 상에서 요청정보에 대한 값이 나타나지 않음을 볼 수 있다. 


express(모듈)와 jade(모듈)를 로드하여 get방식으로 데이터를 전송하는 것을 알아보자. 


views 폴더 밑에 form.jade 파일을 위치시켜 놓았다.


==================================================================

// form.jade 파일을 봐주자.


doctype html

html

head

meta(charset='utf-8')

body

form(action='/form_receiver' method='get')      // 디폴트값은 get방식이다.    

p

input(type='text' name='title')     // post 방식으로 데이터를 전송하는 경우 Cannot GET

p                                                         //  / form_receiver?.....이 나타난다. 

textarea(name='description')

p

input(type='submit' value='forward Server')


// jade의 주석처리는 이것으로 한다.

// get 방식을 해보았다.

==================================================================

++app.js 에 추가해주자.


app.get('/form',function(req, res){

res.render('form');

});

==================================================================

url: 127.0.0.1:3000/form 으로 접근시에 views 안에 위치한 form.jade 파일을 랜더링하는 것 알아두자. (res.render('form'))


node app.js를 실행시켜주자.

// text 박스와 textarea 에 값을 입력해주자.


페이지 소스보기를 해보자.



// form_receiver 에대한 패쓰를 지정해주지 않았으므로 아래와같이 Connot GET ~~가 출력된다.

폼태그에서 GET 방식으로 name=title, description과 value=12,123을 넘길 경우 웹브라우저에서 자동적으로 쿼리스트링을 생성해주는 것 알아두자.


=====================================================================================

++ app.js 에 라우터(/form_receiver)를 만들어주자.


app.get('/form_receiver', function(req, res){

var tit = req.query.title;

var des = req.query.description;

var output = `

<h2>title : ${tit} </h2>

<h2>description : ${des} </h2>

`;

res.send(output);

}); 

======================================================================================

가장 위의 forward Server 서브밋버튼을 누를 경우 form_receiver 패쓰로 가게 된다. 이 때는 아래와 같은 화면을 뿌려준다. 


 post 방식으로 데이터를 전송하는 경우에는 Cannot /form_receiver ...가 출력된다. 

그리고 url 뒤의 쿼리 스트링이 나타나지 않는다. 

이때는 사용자가 입력한 정보가 서버로 잘 전송이 된 상태지만 post방식의 경우에 url 대신 header 에 정보를 실어서 전송하기 때문에 url에 그 값들이 보이지 않는 것이다. 단순히 방법의 차이이다.  


어떻게하면 post방식으로 보낸 데이터를 서버측에서 확인할 수 있는가?를  다음 글에서 알아보자. 

간단하게 이해해보자.  게시판을 만든다고 가정해보자.

Get방식은 정보를 URL에 붙여서 넘기게 되며, Post방식은 Header를 통해 정보를 전송하는 방식이다.


1. 

사용자가 서버에 정보를 전달하고 일반적으로 정보를 요청할 경우에는 주로 GET 방식으로 (select) 한다.

GET은 Select적인 성향을 가지고 있다. GET은 서버에서 어떤 데이터를 가져와서 보여준다거나 하는 용도이지 서버의 값이나 상태등을 바꾸지 않는다. (게시판의 리스트라던지 글보기 기능 같은 것)

정보를 요청하고 서버로부터 정보를 가져오는 곳에 GET을 사용해야 이유: 웹의 주요 목적이라고 할 수 있는 link문제이다. 

기본적으로 웹에서 모든 리소스는 link할 수 있는 url을 가지고 있어야하기때문이다.  특정페이지의 주소를 다른 사람에게  주기 위해 주소창의 URL을 복사해서 줄 때를 생각하면 된다. 단점은 url로 전달할 수 있는 요청 정보의 양이 한정되어 있다는 것이다. 또한 그 정보들이 노출되므로 보안상에 문제가 될 수 있다는 것이다. 


2. 

반면, POST는 서버의 값이나 상태를 바꾸기 위해서 사용한다. 

사용자가 서버부터 정보를 전달하고 특정 정보를 가져오는 것 보다, 사용자의 정보를 서버에 전송하는데 더 큰 비중을 둘 때에는 POST 방식으로 정보를 전달한다. ex)로그인을 생각하면 편하다.

(insert, modify)

( 글쓰기를 하면 글의 내용이 DB에 저장이 되고 수정을 하면 DB값이 수정된다. )

POST를 방식을 사용할 결우에는 값이 내부적으로 http header에 숨겨져서 전달된다. 

글을 저장하는 경우에는 URL을 제공할 필요가 없기 때문에 POST를 해도 상관이 없는 것이다.

전달할 수 있는 데이터의 양이 제한적이지 않고, url상에 정보가 노출되지는 않지만, get 방식에 비해 처리속도가 늦어진다는 것이 단점이다. (url 상에서 정보가 노출되지 않는다고 해서 보안상 문제가 없다고 할 수 없다.  이문제에 대해서는 차 후에 알아보자.)










+ Recent posts