
동기 (Synchronous) : 동시에 일어나는 사건
비동기 (Asynchronous) : 동시에 일어나지 않는 사건
Putty 터미널을 작동시키고 다음과 같은 명령어 입력
apt-get install nodejs
node -v 명령어로 node.js 버전 확인 가능npm 을 다음과 같은 명령어로 설치
apt-get install npm
설치 후 npm -v 명령어로 npm 버전 확인 가능
npm (Node Package Manager)
Node.js 프로젝트 만들기
mkdir nodejs-ssac
cd nodejs-ssac
npm init

Is this ok? 에서 yes를 입력한다.vscode에 서버를 연동시켜서 node.js 파일 열어주기
package.json파일이 위치한 곳에 app.js 파일을 생성해준다.
Node.js를 서버에 실행시킬 때 app.js 파일을 통해 열어줄 것임!!
express를 설치한다.
Node.js를 위한 빠르고 개방적이고 간결한 Web 프레임워크
라이브러리와 미들웨어 등이 내장되어 있어 개발하기 편하다.
다음 명령어로 설치!
프로젝트를 진행할 폴더 위치에서 설치해야 한다!!!!
npm install express

node_modules 패키지가 설치된 것을 볼 수 있다.app.js 파일에 원하는 내용을 입력하고 web으로 실행하기 위한 명령어 입력한다.App.js 파일에 입력할 코드 내용 const express = require( 'express' );
const app = express();
const port = 8100;
app.get( '/', ( req, res ) => {
// web에 메시지를 띄워서 확인할 수 있음
res.send( "안녕" );
});
// 서버 실행 때마다 콘솔 창으로 뜨는 메세지 확인
app.listen( port, () => {
// web 포트번호가 8100라면 이렇게 이렇게 해라~~
console.log( "8100!" );
});
node.js폴더 위치에서node app.js입력
※ 변경 사항을 web에 다시 반영하려면 서버를 껏다 다시 켜야한다!!
다음은 앱을 실행하고 IP주소로 서버 접속했을 때 나타나는 화면!

ejs 문법 태그 안에서 javascript문을 사용할 수 있게 된다.
<html></html> 태그를 사용하지 않게 태그 안에 들어가는 내용을 쓰면 된다!
ejs를 다음과 같은 명령어를 통해 설치한다.
npm install ejs

Template 엔진으로 ejs를 사용할 것이다 라는 것을 알려줄 코드
app.set( "view engine", "ejs" );
app.set( "views", __dirname + "/views" ); // __dirname은 절대경로로 현재 위치 지정
ejs 문법을 사용할 ejs 파일을 새로 하나 만들어주고 ejs 파일을 열어줄 명령문 작성
test.ejs 파일을 만들고 url설정도 같이 해준다. app.get( '/test', ( req, res ) => {
// web에 메시지를 띄워서 확인할 수 있음
res.render( "test.ejs" );
});
app.get( '/test', ( req, res ) => {
// web에 메시지를 띄워서 확인할 수 있음
res.render( "test.ejs", { parameter1: 5, parameter2: "코딩온" } );
});
test.ejs 파일을 생성하고 다음과 같이 내용을 작성한다.<html>
<body>
<h1> EJS의 새 test파일입니다.</h1>
<!--변수 값을 받아서 출력하는 방법-->
<h3> <%=parameter1 %> </h3>
<div style="background-color: yellow;">
<!--ejs for문을 돌리는 방법-->
<%
for (var i = 0; i < parameter1; i++) {
__append( "<hi>" + i + "</h1><br>" );
}
%>
</div>
<img src="http://49.50.162.71:8100/aaa/util_lesson.jpg">
</body>
</html>
※ for문 안에 주석이 들어가면 웹 화면으로 코드 출력이 정상적으로 작동되지 않는다!!
App.js 파일 안의 Parameter 값을 ejs에서 받아와서 사용하려면 다음과 같이 입력한다.
<%= parameter값 %>
ejs 문법에서 반복문을 사용하는 방법 :
<%
for (var i = 0; i < parameter1; i++) {
__append( "<hi>" + i + "</h1><br>" );
}
%>

app.use( '/aaa', express.static( __dirname + '/static' ));
// `/aaa`는 가상 경로, __dirname + '/static'은 절대경로
<img src="[자신의 서버 url 경로]/aaa/[이미지 파일명]">
get방식과 post방식의 차이를 App.js 파일에서 비교하기
필자는 Django에서 작성했던 회원가입을 Node.js에서 구현해볼 것임
// post로 넘어온 값이 없을 때 들어오는 곳
app.get('/register', ( req, res ) => {
console.log( req.query.id );
res.render('register');
});
// post로 값이 넘어왔을 때 들어오는 곳
app.post('/registered', ( req, res ) => {
console.log( req.body );
// 아직 웹브라우저에 응답을 보내지 않은 상태
res.send("회원가입 완료");
});
req.body의 value들을 가져오려면 App.js에서 다음과 같은 코드를 입력해야 한다. const body = require( 'body-parser' );
app.use(body.urlencoded( { extended:false } ));
app.use(body.json());
그리고 Putty 터미널에 다음과 같은 명령어를 입력해준다.
npm install body-parser
그리고 회원가입 ejs파일을 작성하고 web에 잘 출력되나 테스트하면 끝
register.ejs
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css"
integrity="sha384-B0vP5xmATw1+K9KRQjQERJvTumQW0nPEzvF6L/Z6nronJ3oUOFUFpCjEUQouq2+l" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-Piv4xVNRyMGpqkS2by6br4gNJ7DXjqk09RmUpJ8jgGtD7zP9yug3goQfGII0yAns" crossorigin="anonymous"></script>
<title>유승완의 만든 Register 화면</title>
<style type="text/css">
.gradient-custom {
/* fallback for old browsers */
background: #f093fb;
/* Chrome 10-25, Safari 5.1-6 */
background: -webkit-linear-gradient(to bottom right, rgba(240, 147, 251, 1), rgba(245, 87, 108, 1));
/* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
background: linear-gradient(to bottom right, rgba(240, 147, 251, 1), rgba(245, 87, 108, 1))
}
.card-registration .select-input.form-control[readonly]:not([disabled]) {
font-size: 1rem;
line-height: 2.15;
padding-left: .75em;
padding-right: .75em;
}
.card-registration .select-arrow {
top: 13px;
}
</style>
</head>
<body>
<section class="vh-100 gradient-custom">
<div class="container py-5 h-100">
<div class="row justify-content-center align-items-center h-100">
<div class="col-12 col-lg-9 col-xl-7">
<div class="card shadow-2-strong card-registration" style="border-radius: 15px;">
<div class="card-body p-4 p-md-5">
<h3 class="mb-4 pb-2 pb-md-0 mb-md-5"> Node.js로 만드는 SSAC 회원가입 Form</h3>
<form action="http://49.50.162.71:8100/registered" method="post">
<div class="row">
<div class="col-md-6 mb-4">
<div class="form-outline">
<label class="form-label">아이디</label>
<input type="id" id="id" name="id" class="form-control form-control-lg" />
</div>
</div>
<div class="col-md-6 mb-4">
<div class="form-outline">
<label class="form-label">이름</label>
<input type="text" id="name" name="name" class="form-control form-control-lg" />
</div>
</div>
</div>
<div class="row">
<div class="col-md-6 mb-4 pb-2">
<div class="form-outline">
<label class="form-label" for="pw">비밀번호</label>
<input type="password" id="pw" name="pw" class="form-control form-control-lg pw" />
</div>
</div>
<div class="col-md-6 mb-4 pb-2">
<div class="form-outline">
<label class="form-label" for="chkpw">비밀번호 확인</label>
<input type="password" id="chkpw" name="chkpw" class="form-control form-control-lg pw" />
<span id="alert-success" style="display: none;">비밀번호가 일치합니다.</span>
<span id="alert-danger" style="display: none; color: #d92742; font-weight: bold; ">비밀번호가 일치하지 않습니다.</span>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6 mb-4 d-flex align-items-center">
<div class="form-outline datepicker w-100">
<label class="form-label">휴대폰 번호</label>
<input type="tel" class="form-control form-control-lg" id="#" name="pnum"/>
</div>
</div>
<div class="col-md-6 mb-4">
<h6 class="mb-2 pb-1">성별 : </h6>
<div class="form-check form-check-inline d-flex justify-content-center mt-3">
<input
class="form-check-input"
type="radio"
name="gender"
value="W"
/>
<label class="form-check-label mr-4">여성(Female)</label>
<input
class="form-check-input"
type="radio"
name="gender"
value="M"
checked
/>
<label class="form-check-label">남성(Male)</label>
</div>
</div>
</div>
<div class="mt-4 pt-2">
<input class="btn btn-primary btn-lg" type="submit" value="회원가입" />
</div>
<script>
$('.pw').focusout( function() {
var pwd1 = $("#pw").val();
var pwd2 = $("#chkpw").val();
if ( pwd1 != '' && pwd2 == '' ) {
null;
} else if (pwd1 != "" || pwd2 != "") {
if (pwd1 == pwd2) {
$("#alert-success").css('display', 'inline-block');
$("#alert-danger").css('display', 'none');
} else {
alert("비밀번호가 일치하지 않습니다. 비밀번호를 재확인해주세요.");
$("#alert-success").css('display', 'none');
$("#alert-danger").css('display', 'inline-block');
}
}
});
</script>
</form>
</div>
</div>
</div>
</div>
</div>
</section>
</body>
</html>
어질어질하다....서버 속도가 느리고 변경사항 갱신할 때마다 매번 서버를 다시 껏다 켜야해서 불편한 점이 여간 적은게 아닌듯... 차라리 리액트를 다시 하고 싶다..!!