<repo_name>wnsgur0504/Node.js_workspace<file_sep>/project1014/server.js
/*웹서버 구축하기*/ 
// 모듈이란? 기능을 모아놓은 자바스크립트 파일
var http = require("http"); // http 내부 모듈 
var url = require("url"); //url 분석모듈
var fs = require("fs"); //file system
var mysql = require("mysql");
var ejs = require("ejs"); //node 서버에서만 실행가능한 문서
                                    // html로 채워졌다고 하여, html문서로 보면 안됨.

var port = 7878;

// mysql 접속 문자열
let conStr = {
    url:"localhost",
    user:"root",
    password:"<PASSWORD>",
    database:"node"
};
var con; //mysql 접속 정보를 가진 객체, 이 객체로 sql문 수행가능


// 서버 객체 생성
var server = http.createServer(function(req, res){
    
    // 클라이언트가 원하는 요청을 처리하려면, URL을 분석하여 URI추출해서 조건을 따져보자
    var urlJson = url.parse(req.url, true); //분석결과를 json으로 반환해줌
    console.log("URL 분석 결과는 ", urlJson);
    res.writeHead(200, {"Content-Type":"text/html; charset=utf-8"});
    
    if(urlJson.pathname=="/"){
        fs.readFile("./index.html", "utf-8", function(error, data){
            if(error){
                console.log("index 파일 읽기 에러 :" ,error);
            }else{
                res.end(data);
            }
        });
    }else if(urlJson.pathname=="/member/registForm"){
        fs.readFile("./registForm.html", "utf-8", function(error, data){
            if(error){
                console.log("registForm 읽기 에러 :" ,error);
            }else{
                res.end(data);
            }
        });
    }else if(urlJson.pathname=="/member/loginForm"){
        fs.readFile("./loginForm.html", "utf-8", function(error, data){
            if(error){
                console.log("loginForm 읽기 에러 :" ,error);
            }else{
                res.end(data);
            }
        });
    }else if(urlJson.pathname=="/member/regist"){
        // 브라우저에서 전송된 파라미터를 먼저 받아야 된다.
        // get방식의 파라미터 받기
        // 회원정보는 member2 테이블에 넣고
        var params = urlJson.query;
        var sql = "insert into member2(uid, password, uname, phone, email, receive, addr, memo)";
        sql += " values(?, ?, ?, ?, ?, ?, ? ,?)"; //물음표는 바인드 변수를 의미
        

        con.query(sql,
            [params.uid, 
            params.password, 
            params.uname, 
            params.phone, 
            params.email, 
            params.receive, 
            params.addr,
            params.memo], function(error, result, fields){
                if(error){
                    console.log("회원정보 insert 실패 : ", error);
                }else{
                    // mysql에서 지원하는 last_insert_id()를 조회해서 
                    // 방금 insert된 회원의 pk를 조회해보자
                    sql = "select last_insert_id() as member2_id";

                    con.query(sql, function(error, record, fields){
                        if(error){
                            console.log("pk가져오기 실패 : ", error);
                        }else{
                            // member2 정보가 insert 성공 시 
                            // 스킬정보는 member_skill에 넣자(배열 길이만큼)
                            // console.log("record : ", record);
                            var member2_id = record[0].member2_id;
                            for(var i=0;i<params.skill_id.length;i++){
                                sql = "insert into member_skill(member2_id, skill_id) values("+member2_id+","+params.skill_id[i]+")";
                                // console.log("스킬 등록 쿼리 : ", sql);
                                // 쿼리 실행
                                con.query(sql, function(err){
                                    if(err){
                                        console.log("회원정보 등록 실패");
                                    }else{
                                        res.end("회원정보 등록 완료")
                                    }
                                });
                            }
                        }
                    }); //select 쿼리문 수행

                    
                    
                }
            });
    }else if(urlJson.pathname=="/member/list"){
        // 회원목록보여주기
        var sql = "select * from member2";
        con.query(sql, function(error, record, fields){
            if(error){

            }else{
                 // console.log("회원목록 : ", record);
                // 테이블로 구성하여 출력
                var tag = "<table width='100%' border='1px'>";
                tag +="<tr>";
                tag +="<th>member2_id</th>";
                tag +="<th>uid</th>";
                tag +="<th>password</th>";
                tag +="<th>uname</th>";
                tag +="<th>phone</th>";
                tag +="<th>email</th>";
                tag +="<th>receive</th>";
                tag +="<th>addr</th>";
                tag +="<th>memo</th>";
                tag +="</tr>";

                for(var i=0;i<record.length;i++){
                    tag +="<tr>";
                    tag +="<td><a href='/member/detail?member2_id="+record[i].member2_id+"'>"+record[i].member2_id+"</a></td>"
                    tag +="<td>"+record[i].uid+"</td>"
                    tag +="<td>"+record[i].password+"</td>"
                    tag +="<td>"+record[i].uname+"</td>"
                    tag +="<td>"+record[i].phone+"</td>"
                    tag +="<td>"+record[i].email+"</td>"
                    tag +="<td>"+record[i].receive+"</td>"
                    tag +="<td>"+record[i].addr+"</td>"
                    tag +="<td>"+record[i].memo+"</td>"
                    tag +="</tr>";
                }
                tag += "<tr>";
                tag += "<td colspan='9'><a href='/'>메인으로</a></td>";
                tag += "</tr>";
                tag += "</table>";
                
                res.end(tag);
            }
        });
    }else if(urlJson.pathname=="/member/detail"){ //회원의 상세정보
        var member2_id = urlJson.query.member2_id;
        var sql = "select * from member2 where member2_id="+member2_id;
        con.query(sql ,function(error, record, fields){
            if(error){
                console.log("회원 상세조회 실패 : ", error);
            }else{
                var member = record[0];
                fs.readFile("./detail.ejs", "utf-8", function(error, data){
                    if(error){
                        console.log("detail.html 읽기 실패 : ", error);
                    }else{
                        res.end(ejs.render(data, { //detail.ejs에게 json형태의 데이터(변수에 담긴)를 보낸다 
                            uid:member.uid,
                            uname:member.uname,
                            phone:member.phone,
                            addr:member.addr,
                            memo:member.memo
                        }));
                    }
                });
            }
        });
        
    }else if(urlJson.pathname=="/fruit"){
        var f1 = "apple";
        var f2 = "banana";
        fs.readFile("./test.ejs", "utf-8", function(error, data){
            // ejs를 그냥 파일로 문자취급해서 보내면 원본 코드까지 가버리기
            // 때문에, 서버에서 실행은 한 후, 그 결과를 보내야한다..(jsp, php, asp의 원리)

            res.end(ejs.render(data,{
                "fruit":f1
            }));
        });
    }

    // 200이란?? HTTP 상태코드
    // 404 - file not found
    // 500 - critical error
    
});

function getConnection(){
    con = mysql.createConnection(conStr); //DBMS정보인 json 매개변수
}
// 서버가동
server.listen(port, function(){
    console.log("Server is running at "+port+"...");
    getConnection();
});<file_sep>/project1012/server4.js
/*----------------------------------------
MySQL 연동 해보자
----------------------------------------*/ 
var mysql = require("mysql");

// 접속에 필요한 정보
let conStr = {
    url:"localhost",
    user:"root",
    password:"<PASSWORD>",
    database:"node"
}

//접속시도 후, 접속정보가 반환된다..
var con = mysql.createConnection(conStr);

//반환된 con을 이용하여 쿼리문 수행
var sql = "insert into member(firstname, lastname, local, msg)";
sql += "values ('준혁', '최', 'Seoul', '하이하이 ^^;')";

con.query(sql, function(error, result, fields){
    if(error){
        console.log("등록실패;");
    }else{
        console.log("등록성공!");
    }
}); //쿼리실행
<file_sep>/project1012/module.js
/*
Node.js가 전세계적으로 열풍을 일으킨 이유는?
가장 큰 이유가, 바로 모듈때문이다!

모듈이란? 우리가 지금까지 자바스크립트 라이브러리를, 파일로 저장해놓은 단위
node.js모듈의 특징 : 전세계 많은 개발자들이 각자 자신이 개발한 모듈을 공유하고 있다.
                            따라서 지금 이순간에도 새로운 모듈이 계속 추가되고 있다..

[모듈의 유형]
1) 내장 모듈
    - os 모듈
    - url 모듈
    - file system 모듈 (★★★)
2) 사용자 정의 모듈
*/ 

// os 모듈
// 자바스크립트와는 달리, 모듈을 가져올 때는 require()함수를 이용해야한다..
// var os = require("os"); //이미 내장된 모듈중 os모듈을 가져오기
// console.log(os.hostname()); //컴퓨터 이름
// console.log(os.cpus()); //cpu

// url 모듈 : url정보를 분석해주는 모듈
// var url = require("url");

// // url을 분석하여, 그 결과를 result변수에 담아보자!
// var result = url.parse("https://terms.naver.com/search.nhn?query=apple")
// console.log("검색어는 ",result.query);

// file system 모듈 : javascript에선 불가능했던 파일접근을 가능케 해주는 모듈
// 로컬상의 파일을 읽어오거나, 쓸수 있는 모듈
var fs = require("fs");
// 지정한 경로의 파일을 읽어서, 다 읽혀지면, 두번째 인수인익명함수를
// 호출한다. 이렇게 특정 이벤트가 발생할 때, 시스템에 의해 역으로 호출되는 유형의 함수를
// Callback함수라 한다!!!
//callback함수의 첫번째 매개변수 (error) :에러 정보를 담고 있는 객체 반환
//callback함수의 두번째 매개변수(data) : 실제 읽어들인 파일의 내용을 담고 있다..
fs.readFile("./data/memo.txt", "utf-8",function(error, data){
    console.log("파일을 모두 읽기 완료!");
    console.log(data);
});<file_sep>/project1012/server3.js
/*
Node.js에서 오라클과 연동해보자!!
*/ 

// 오라클을 접속하려면, 접속을 담당하는 모듈을 사용해야한다.
// 우리가 node.js를 설치하면 아주 기본적인 모듈만 내장되어 있기 때문에
// 개발에 필요한 모듈은 그때 그때 다운으로 받아 설치해야한다!! (인기비결)

var oracledb = require("oracledb");

// 변경할 목적의 데이터가 아니라면, 상수로 선언하자!
let conStr = {
    user:"user0907",
    password:"<PASSWORD>",
    connectionString:"localhost/XE"    
}; //오라클에 접속할 때 필요한 정보!!

// 오라클에 접속을 시도해본다!!
// 콜백함수
oracledb.getConnection(conStr, function(error, con){
    if(error){ //실패 시
        console.log("접속 실패 : ", error);
    }else{
        // 테이블에 데이터를 넣어보자!
        // 접속객체를 이용하여 insert쿼리를 날려보자!
        console.log("접속 성공");
        insert(con);
    }
});

function insert(con){
    var sql = "insert into member2(member2_id, firstname, lastname, local, msg)";
    sql += "values(seq_member2.nextval, 'JunHyuk', 'Choi', 'America', 'Hello ORACLE!')";
    
    // 쿼리 실행
    con.execute(sql, function(error, result, fields){
        if(error){
            console.log("삽입 실패 : ", error);
        }else{
            console.log("삽입 성공");
        }
    });
}<file_sep>/project1012/test.js
/*
node.js의 저장형식은 당연히 확장자가 .js이다.

node.js는 html문서를 제어했던 예전의 js와는 목적이 다르므로,
실행또한 html문서에서 하는 것이 아니라, 단독 실행하면 된다.
따라서 test.js 파일이 있는 곳으로 가서, node 파일명 으로 실행하면 된다.
*/ 
console.log("Hello JS World!");<file_sep>/project1014/server3.js
/*
    ejs를 이해해보자
    ejs란? 
        - 오직, Node.js 서버측에서 해석 및 실행될 수 있는 파일 
        - js의 문법 사용이 가능 (if, for, 변수선언....)
        - 다른 서버 측 스크립트 언어인 PHP, ASP, JSP와 같은 목적
*/ 
var http = require("http");
var fs = require("fs");
var ejs = require("ejs");

var server = http.createServer(function(req, res){
    fs.readFile("./list.ejs", "utf-8", function(error, data){
        if(error){
            console.log("list 파일 읽기 에러 : ", error);
        }else{
            res.writeHead(200, {"Content-Type":"text/html; charset=utf8"});
            res.end(ejs.render(data));
        }
    });
});

server.listen(7979, function(){
    console.log("Node Server is running port at 7979...");
});



<file_sep>/project1014/server2.js
var http = require("http");
var url = require("url");
// var body = require("body");
var querystring = require("querystring"); //get뿐만아니라 post까지 파싱가능 

var server = http.createServer(function(req, res){
    // console.log("클라이언트 요청 방식 : ", req.method);
    var method = req.method;    
    
    if(method=="GET"){
        
        var urlJson = url.parse(req.url, true);
        var paramJson = urlJson.query;
        
        res.writeHead(200, {"Content-Type":"text/html; charset=utf-8"});
        res.end("클라이언트가 GET방식으로 요청했네요.<br> ID :  "+paramJson.id+"<br> Pass : "+paramJson.pass);

        // console.log("GET URL 분석 : ", urlJson);
        // console.log("ID : ", paramJson.id);
        // console.log("Pass : ", paramJson.pass);        

    }else if(method=="POST"){

        // Post방식으로 전달된 데이터를 받기 위한 이벤트를 감지해보자!!
        res.writeHead(200, {"Content-Type":"text/html; charset=utf-8"});
        res.end("클라이언트가 POST방식으로 요청했네요");

        // body로 전송된 데이터는 url 분석(parse)만으로는 해결이 안된다!
        // var urlJson = querystring.parse(req.url);

        req.on("data", function(param){
            // var postParam = url.parse(new String(param).toString(), true);
            var postParam = querystring.parse(new String(param).toString());
            console.log("POST 전송된 파라미터는 : ", postParam);
            console.log("ID : "+postParam.id+" PW : " +postParam.pass);
        });
        
    }    
});

server.listen(9999, function(){
    console.log("My Server is running at 9999....");
});
<file_sep>/project1013/server.js
/*
http 웹서버 구축하기
*/ 
var http = require("http"); //필요한 모듈 가져오기
var fs = require("fs");
var url = require("url"); //url 정보를 해석해주는 모듈
var mysql = require("mysql"); //외부모듈이기 때문에, npm install 설치 필요
var port = 8888;
var con; //접속 정보를 가진 객체를 받는 전역 변수

// 서버객체 생성
// request, response는 이미 Node.js 자체적으로 존재하는 객체
var server = http.createServer(function(req, res){
    // 클라이언트의 요청에 대한 응답처리... (html 문서를 주고 받고 있음)
    
    // 클라이언트의 요청 내용이 다양하므로, 각 요청을 처리할 조건문이 있어야 한다..
    // 따라서, 클라이언트가 원하는 것이 무엇인지부터 파악!
    console.log("클라이언트의 요청 url : ", req.url);
    
    // url 모듈을 이용하여 전체 주소를 대상으로 해석시작
    
    // 파싱 시, true 옵션을 주면 파라미터들을 JSON형태로 준다.
    var result = url.parse(req.url, true); 
    var params = result.query; //파라미터를 담고 있는 json객체반환
    
    res.writeHead(200, {"Content-Type":"text/html; charset=utf-8"});

    if(result.pathname=="/login"){
        console.log("mysql 연동하여 회원 존재여부 확인");
        
        

        // mysql 연동
        var sql = "select * from hclass where id='"+params.m_id+"' and pass='"+params.m_pw+"'";
        // console.log(sql);
        con.query(sql, function(error, record, fields){
            if(error){
                console.log("쿼리 실행 실패", error);
            }else{
                // console.log("record : ", record);
                if(record.length==0){
                    // 로그인 실패 시
                    console.log("회원 인증실패");
                    res.end("<script>alert('회원정보가 일치하지 않습니다.'); history.back();</script>");
                }else{
                    // 로그인 성공 시 
                    console.log("회원 인증성공");
                    res.end("<script>alert('로그인을 성공하셨습니다.')</script>");
                }
            }
        });
        // var sql = "select * from hclass where id='파라미터ID값' and pass='<PASSWORD>'";
    }else if(result.pathname=="/board"){
        console.log("게시판 화면");
        res.end("미구현..");
    }else if(result.pathname=="/loginForm"){
        // 우리가 제작한 loginForm.html은 로컬 파일로 열면 안되고,
        // 모든 클라이언트가 인터넷 상의 주소로 접근하게 하기 위해서
        // 서버가 html내용을 읽고, 그 내용을 클라이언트로 보내야 한다.
        fs.readFile("./loginForm.html", "utf-8", function(error, data){
            if(error){
                console.log("error 발생!/",error);
            }else{
                // 읽기 성공이므로, 클라이언트의 응답정보로 보내자
                // HTTP 프로토콜로 데이터를 주고 받을때는, 이미 정해진 규약이 있으므로 눈에 보이지않는
                // 수많은 설정 정보값들을 서버와 클라이언트간 교환한다
                res.end(data);
            }
        })
    }

    // 전체 url중에서도 uri만 추출해보자!
    // 따라서, 전체 url을 해석해야한다.. 해석은 parsing한다고 한다.
});

// mysql 접속
function connectDB(){
    con = mysql.createConnection({
        url:"localhost",
        user:"root",
        password:"<PASSWORD>",
        database:"node"
    });
}

// 서버가동
server.listen(port, function(){
    console.log("Server is running at 8888...");
    connectDB(); //웹서버가 가동되면, mysql을 접속해놓자
});

<file_sep>/project1013/server2.js
// 웹 서버 구축
var http = require("http");
var mysql = require("mysql");
const { parse } = require("path");
var url = require("url");
var fs = require("fs");

var con; //mysql 접속 성공 시 그 정보를 보유한 객체. 해당 객체가 있어야 접속된 상태에서
// 쿼리문을 수행할 수 있다.
var port = 9999;

var server = http.createServer(function(req, res){
    
    res.writeHead(200, {"Content-Type":"text/html; charset=utf8"});

    // 클라이언트가 원하는 것이 무엇인지를 구분하기 위한 url분석
    console.log("URL : ", req.url); //한줄로 되어 있어서, 구분을 못함

    // 섞여있는 url을 parsing하기 위해서 전담 모듈을 이용해서 uri와 parameter를 분리
    // 분석(파싱) 시 true를 매개변수로 전달하면, 파라미터들을 {Json}으로 묶어준다.
    // 장점? 다루기 쉬워짐 (객체 표기법), 배열보다 낫다
    var parseObj = url.parse(req.url, true);
    console.log(parseObj);

    // console.log("URL분석결과 =>", parseObj);
    if(parseObj.pathname=="/member/registForm"){
        fs.readFile("./registForm.html","utf-8", function(error, data){
            if(error){
                console.log("파일 읽기 에러 : ", error);
            }else{
                res.end(data);
            }
        });
    }else if(parseObj.pathname=="/member/regist"){ //회원가입을 원하면
        // mysql에 insert할 예정
        // 클라이언트의 브라우저에서 전송되어온 파라미터(변수)들을 받아보자!
        var params = parseObj.query;
        
        var sql="insert into member2(uid,password,uname,phone,email,receive,addr,memo)";
        sql+=" values(?,?,?,?,?,?,?,?)"; //바인드 변수를 이용

        con.query(sql,[params.uid, params.password, params.uname, 
            params.phone, params.email, params.receive, params.addr, 
            params.memo]
            , function(error, result, fields){
                if(error){
                    console.log("등록 실패 : ", error);
                }else{
                    var msg="<script>";
                    msg += "location.href='/member/list';";
                    // /member/list 로 재접속 (클라이언트가 지정한 주소로 재접속함)
                    msg +="</script>";
                    res.end(msg);
                }
            });

    }else if(parseObj.pathname=="/member/list"){ //회원목록을 원하면
        // mysql에 select할 예정
        var sql = "select * from member2";
        var tag;
        con.query(sql, function(error, record, fields){
            if(error){
                console.log("가져오기 실패 : ", error);
            }else{
                tag="<table border='1px' width='80%'>";
                tag+="<tr>";
                tag+="<th>member2_id</th>";
                tag+="<th>uid</th>";
                tag+="<th>password</th>";
                tag+="<th>uname</th>";
                tag+="<th>phone</th>";
                tag+="<th>email</th>";
                tag+="<th>receive</th>";
                tag+="<th>addr</th>";
                tag+="<th>memo</th>";
                tag+="</tr>";
                for(var i=0;i<record.length;i++){
                    tag+="<tr>";
                    tag+="<td>"+record[i].member2_id+"</td>";
                    tag+="<td>"+record[i].uid+"</td>";
                    tag+="<td>"+record[i].password+"</td>";
                    tag+="<td>"+record[i].uname+"</td>";
                    tag+="<td>"+record[i].phone+"</td>";
                    tag+="<td>"+record[i].email+"</td>";
                    tag+="<td>"+record[i].receive+"</td>";
                    tag+="<td>"+record[i].addr+"</td>";
                    tag+="<td>"+record[i].memo+"</td>";
                    tag+="</tr>";
                }
                tag+="</table>";
                res.end(tag);
            }
        });
    }else if(parseObj.pathname=="/member/del"){ //회원탈퇴
        res.end("회원삭제");
    }else if(parseObj.pathname=="/member/edit"){ //회원수정
        res.end("회원수정");
    }
    
}); 

// mysql 접속
function connectDB(){
    con = mysql.createConnection({
        url:"localhost",
        user:"root",
        password:"<PASSWORD>",
        database:"node"
    });
    
}

server.listen(port, function(){
    console.log("Web Server is running at port "+port);
    connectDB();
});
<file_sep>/project1015/server.js
var http = require("http");
var url = require("url");
var fs = require("fs");
var ejs = require("ejs");
var mysql = require("mysql");
var qs = require("querystring");
const { uptime } = require("process");
let con; //mysql connection객체
var urlJson;

var server =http.createServer(function(req, res){
    // 요청 구분
    urlJson=url.parse(req.url, true);    
    console.log(urlJson);
    if(urlJson.pathname=="/"){//"메인을 요청하면"
        fs.readFile("./index.html","utf-8", function(error, data){
            if(error){
                console.log("index 파일 읽기 실패");
            }else{
                res.writeHead(200, {"Content-Type":"text/html; charset=utf8"});
                res.end(data);
            }
        });
    }else if(urlJson.pathname=="/member/registForm"){//가입폼을 요청하면
        registForm(req ,res);
    }else if(urlJson.pathname=="/member/regist"){ // 가입을 요청하면..
        regist(req ,res);
    }else if(urlJson.pathname=="/member/loginForm"){ // 로그인 폼을 요청하면..

    }else if(urlJson.pathname=="/member/list"){ //회원 목록을 요청하면
        getList(req ,res);
    }else if(urlJson.pathname=="/member/detail"){//회원정보 보기를 요청하면..
        getDetail(req ,res);
    }else if(urlJson.pathname=="/member/del"){ //회원정보 삭제를 요청
        del(req, res);
    }else if(urlJson.pathname=="/member/edit"){//회원정보 수정를 요청
        update(req, res);
    }else if(urlJson.pathname=="/category"){ //동물구분을 요청하면
        getCategory(req, res);
    }else if(urlJson.pathname="/animal"){
        getAnimal(req, res);
    }   
});

// 데이터베이스 연동인 경우엔 함수에 별도로 정의
function registForm(req ,res){
    // 회원가입폼은 디자인을 표한하기 위한 파일이므로, 기존에는 html로 충분했으나..
    // 보유기술은 DB의 데이터를 가져와서 반영해야하므로, ejs로 처리해야함..
    var sql = "select * from skill";
    con.query(sql, function(error, record, fields){
        if(error){
            console.log("skill 조회 실패:", error);
        }else{
            // console.log("skill record : ", record);
            
            // registForm.ejs에게 json배열을 전달하자
            fs.readFile("./registForm.ejs", "utf-8", function(error, data){
                if(error){
                    console.log("registForm 파일 읽기 실패 : ", error);
                }else{
                    res.writeHead(200, {"Content-Type":"text/html; charset=utf8"});
                    res.end(ejs.render(data, {
                        skillArray:record
                    }));
                }
            });
        }
    });
}

// 회원등록 처리
function regist(req, res){
    // post방식으로 전송된, 파라미터받기!!
    // body에 있는 파라미터받기
    // url모듈에게 파싱을 처리하게 하지말고, querystring 모듈로 처리한다.
        req.on("data", function(param){
        // console.log(new String(param).toString()); //알아볼수 없는 인코딩 데이터로 넘어옴 -> 문자열화
        // 디코드는 성공했지만 파싱이 안되었음 -> querystring 쓰는 이유
        var postParam = qs.parse(new String(param).toString());
        
        var sql = "insert into member2(uid, <PASSWORD>, uname, phone, email, receive, addr, memo)";
        sql += " values(?, ?, ?, ?, ?, ?, ?, ?)";

        con.query(sql, 
            [postParam.uid
            , postParam.password
            , postParam.uname
            , postParam.phone
            , postParam.email
            , postParam.receive
            , postParam.addr
            , postParam.memo], function(error, fields){
                if(error){
                    console.log("등록실패", error);
                }else{
                    // 목록페이지 보여주기
                    // 등록되었음을 alert()으로 알려주고, /member/list로 재접속
                    res.writeHead(200, {"Content-Type":"text/html; charset=utf8"});
                    var tag = "<script>";
                    tag += "alert('등록성공');";
                    tag += "location.href='/member/list'";
                    tag += "</script>";
                    res.end(tag);
                }
            });

    });
}

function getList(req, res){
    // 회원목록 가져오기
    var sql = "select  * from member2";
    con.query(sql, function(error, record, fields){
        fs.readFile("./list.ejs", "utf8", function(error, data){
            if(error){
                console.log("list 파일읽기실패 : ", error);
            }else{
                res.writeHead(200,{"Content-Type":"text/html; charset=utf8"});
                res.end(ejs.render(data,{
                    memberArray:record
                }));
            }
        })
    })
}

function getDetail(req ,res){
    // var urlJson = url.parse(req.url, true);
    // console.log(urlJson.query.member2_id);
    var sql = "select * from member2 where member2_id="+urlJson.query.member2_id;
    con.query(sql, function(error, record, fields){
        if(error){
            console.log("member2 조회 실패 : ", error);
        }else{
            console.log("record : ",record);
            fs.readFile("./detail.ejs", "utf-8", function(error, data){
                if(error){
                    console.log("detail 파일열기 실패 : ", error);
                }else{
                    res.writeHead(200,{"Content-Type":"text/html; charset=utf8"});
                    res.end(ejs.render(data, {                                                                                                                                                                                            
                        member:record[0]
                    }));
                }
            });
        }
    });
}

//회원 1명 삭제
function del(req, res){
    // get 방식으로 전달된 파라미터 받기
    var member2_id = urlJson.query.member2_id;
    var sql = "delete from member2 where member2_id="+member2_id;

    //error, fields : DML (insert, update, delete)
    //error, record, fields : select
    con.query(sql, function(error, fields){
        if(error){
            console.log("삭제 실패 : ", error);
        }else{
            // alert 띄우고, 회원 목록 보여주기
            res.writeHead(200, {"Content-Type":"text/html; charset=utf-8"});
            var tag = "<script>";
            tag += "alert('회원탈퇴 완료!');";
            tag += "location.href='/member/list'";
            tag += "</script>"
            res.end(tag);
        }
    });
}

// 회원정보 수정처리 
function update(req, res){  
    // post로 전송된 파라미터들을 받자!!
    req.on("data", function(param){
        // console.log(param); 인코딩된 상태의 파라미터들
        //스트링으로 디코딩하고 querystring으로 파싱
        var postParam = qs.parse(new String(param).toString()); 
        var sql = "update member2 set phone=?, email=?, addr=?, memo=?";
        sql += ", password=?, receive=? where member2_id=?";
        
        con.query(sql, [
            postParam.phone,
            postParam.email,
            postParam.addr,
            postParam.memo,
            postParam.password,
            postParam.receive,
            postParam.member2_id
        ], function(error, fields){
            if(error){
                console.log("수정 실패 : ", error);
            }else{
                res.writeHead(200, {"Content-Type":"text/html; charset=utf-8"});
                var tag = "<script>";
                tag += "alert('회원정보 수정완료!');";
                tag += "location.href='/member/detail?member2_id="+postParam.member2_id+"';";
                tag += "</script>"
                res.end(tag);
            }
        });
        // console.log(postParam);
        // 검증용
        // var sql = "update member2 set phone='"+postParam.phone+"', email='"+postParam.email+"', memo='"+postParam.memo+"'";
        // sql += ", password='"+postParam.password+"', receive='"+postParam.receive+"' where member2_id=?";
    });
    
}

// 카테고리의 종류 가져오기
function getCategory(req, res){
    var sql = "select * from category";

    con.query(sql, function(error, record, fields){
        if(error){
            console.log("동물구분 목록 조회실패", error );
        }else{
            fs.readFile("./animal.ejs", "utf-8", function(err, data){
                if(err){
                    console.log("animal.ejs 파일 읽기 실패", err);
                }else{
                    res.writeHead(200, {"Content-Type":"text/html; charset=utf-8"});
                    res.end(ejs.render(data, {
                        categoryArray:record
                    }));
                }
            });
        }
    });
}

// 동물의 목록 가져오기
function getAnimal(req, res){
    var sql = "select * from category";

    con.query(sql, function(error, record, fields){
        if(error){
            console.log("동물구분 목록 조회실패 ", error);
        }else{
            var categoryRecord=record; //카테고리 목록 배열
            var category_id = urlJson.query.category_id; // get방식의 category_id 파라미터 받기
            sql = "select * from animal where category_id="+category_id;
        
            // mysql 연동
            con.query(sql, function(error, record, fields){
                if(error){
                    console.log("동물목록 가져오기 실패 ", error);
                }else{
                    console.log("record : ", record);
                    fs.readFile("./animal.ejs", "utf-8", function(err, data){
                        if(err){
                            console.log("animal.ejs 가져오기 실패", err);
                        }else{
                            res.writeHead(200, {"Content-Type":"text/html; charset=utf-8"});
                            res.end(ejs.render(data, {
                                animalArray:record,
                                categoryArray:categoryRecord,
                                category_id:category_id
                            }));
                        }
                    });
                }
            });
        }
    });
}

// mysql 접속
function connect(){
    con = mysql.createConnection({
        url:"localhost",
        user:"root",
        password:"<PASSWORD>",
        database:"node"
    });
}

server.listen(7788, function(){
    console.log("My Server is running at 7788...");
    connect();
});<file_sep>/project1012/server.js
/*
HTTP 모듈을 이용하면, 단 몇줄만으로도 웹서버를 구축할 수 있다!
*/ 

var http = require("http"); //모듈 가져오기!

// http 모듈안에서 지원하는 서버 객체 생성
var server = http.createServer();

// 접속자가 들어오는지 확인해본다
server.on("connection", function(){
    console.log("접속 발생");
});
// 서버 가동(포트번호 지정과 함께)
server.listen(8989, function(){
    console.log("My Server is running at 8989!");
});
<file_sep>/project1012/server5.js
/*
    웹서버를 구축하여, 클라이언트가 전송한 파라마터 값들을
    mysql에 넣어보자
*/ 
var http = require("http"); //http 모듈 가져오기
var fs = require("fs"); //file system module 

let port = 7979;

// http 모듈로부터 서버 객체 생성하기
var server = http.createServer(function(req, res){
    // 아래의 코드들이 동작하기 전에, 서버는 클라이언트가 원하는게 무엇인지 구분을 먼저 해야된다.
    // 요청분석!
    // 요청분석을 들어가려면, 요청 정보를 담고 있는 request 객체를 이용해야한다!!
    console.log(req.url);
    // 1)클라이언트가 회원가입 양식을 보길 원하면 아래의 코드가 수행...
    // 서버에 존재하는 회원가입양식 폼파일을 읽어서, 클라이언트에 보내주자
    fs.readFile("./회원가입양식.html", "utf-8", function(error, data){ 
        if(error){
            console.log("에러 발생 : ", error);
        }else{
            console.log("파일 읽기 성공!");
            // http 프로토콜의 약속 상 형식을 지켜서 보내야함
            // 상태코드에 대한 응답헤더를 지정 
            res.writeHead(200, {"Content-Type":"text/html; charset=utf-8"});
            res.end(data);
        }
    });

    //2) 가입을 원할 경우엔, db에 넣어줘야하고

    //3) 이미지를 원하면 이미지 보여줘야하고

    //4) 오디오파일을 원하면 오디오파일을 전송.....
});

//서버가동하기
server.listen(port, function(){
    console.log("Server is running at "+port+"..");
});


