1.


Ubuntu 환경 구축
2.

 : ubuntu 18.04

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ grep -r . /etc/*-release
/etc/lsb-release:DISTRIB_ID=Ubuntu
/etc/lsb-release:DISTRIB_RELEASE=16.04
/etc/lsb-release:DISTRIB_CODENAME=xenial
/etc/lsb-release:DISTRIB_DESCRIPTION="Ubuntu 16.04.4 LTS"
/etc/os-release:NAME="Ubuntu"
/etc/os-release:VERSION="16.04.4 LTS (Xenial Xerus)"
/etc/os-release:ID=ubuntu
/etc/os-release:ID_LIKE=debian
/etc/os-release:PRETTY_NAME="Ubuntu 16.04.4 LTS"
/etc/os-release:VERSION_ID="16.04"
/etc/os-release:HOME_URL="http://www.ubuntu.com/"
/etc/os-release:SUPPORT_URL="http://help.ubuntu.com/"
/etc/os-release:BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
/etc/os-release:VERSION_CODENAME=xenial
/etc/os-release:UBUNTU_CODENAME=xenial
 
cs

* 해당 버전은 16.04이나 실습 진행에 있어서 별 다른 문제가 없으므로 다음과 같이 진행함.

* ubuntu 16.04 설치 필요 시 하기의 링크 클릭

 : ubuntu 16.04 설치


3.

 : curl이 설치되어 있지 않은 경우 다음과 같이 curl 설치

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ sudo apt-get -y install curl
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  libcurl3-gnutls
The following NEW packages will be installed:
  curl
The following packages will be upgraded:
  libcurl3-gnutls
1 upgraded, 1 newly installed, 0 to remove and 169 not upgraded.
Need to get 323 kB of archives.
After this operation, 339 kB of additional disk space will be used.
Get:1 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main amd64 libcurl3-gnutls amd64 7.47.0-1ubuntu2.9 [184 kB]
Get:2 http://kr.archive.ubuntu.com/ubuntu xenial-updates/main amd64 curl amd64 7.47.0-1ubuntu2.9 [138 kB]
Fetched 323 kB in 0s (1,365 kB/s)
(Reading database ... 198888 files and directories currently installed.)
Preparing to unpack .../libcurl3-gnutls_7.47.0-1ubuntu2.9_amd64.deb ...
Unpacking libcurl3-gnutls:amd64 (7.47.0-1ubuntu2.9) over (7.47.0-1ubuntu2.8) ...
Selecting previously unselected package curl.
Preparing to unpack .../curl_7.47.0-1ubuntu2.9_amd64.deb ...
Unpacking curl (7.47.0-1ubuntu2.9) ...
Processing triggers for libc-bin (2.23-0ubuntu10) ...
Processing triggers for man-db (2.7.5-1) ...
Setting up libcurl3-gnutls:amd64 (7.47.0-1ubuntu2.9) ...
Setting up curl (7.47.0-1ubuntu2.9) ...
Processing triggers for libc-bin (2.23-0ubuntu10) ...
 
cs


4.

 : nodejs 설치

 4-1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
$ curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -
 
## Installing the NodeSource Node.js 10.x repo...
 
 
## Populating apt-get cache...
 
+ apt-get update
Hit:1 http://kr.archive.ubuntu.com/ubuntu xenial InRelease
Hit:2 http://kr.archive.ubuntu.com/ubuntu xenial-updates InRelease
Hit:3 http://kr.archive.ubuntu.com/ubuntu xenial-backports InRelease
Get:4 http://security.ubuntu.com/ubuntu xenial-security InRelease [107 kB]
Fetched 107 kB in 1s (56.9 kB/s)
Reading package lists... Done
 
## Confirming "xenial" is supported...
 
+ curl -sLf -o /dev/null 'https://deb.nodesource.com/node_10.x/dists/xenial/Release'
 
## Adding the NodeSource signing key to your keyring...
 
+ curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add -
OK
 
## Creating apt sources list file for the NodeSource Node.js 10.x repo...
 
+ echo 'deb https://deb.nodesource.com/node_10.x xenial main' > /etc/apt/sources.list.d/nodesource.list
+ echo 'deb-src https://deb.nodesource.com/node_10.x xenial main' >> /etc/apt/sources.list.d/nodesource.list
 
## Running `apt-get update` for you...
 
+ apt-get update
Get:1 https://deb.nodesource.com/node_10.x xenial InRelease [4,611 B]
Hit:2 http://kr.archive.ubuntu.com/ubuntu xenial InRelease
Hit:3 http://kr.archive.ubuntu.com/ubuntu xenial-updates InRelease
Hit:4 http://kr.archive.ubuntu.com/ubuntu xenial-backports InRelease
Get:5 https://deb.nodesource.com/node_10.x xenial/main amd64 Packages [768 B]
Get:6 http://security.ubuntu.com/ubuntu xenial-security InRelease [107 kB]
Fetched 112 kB in 1s (63.8 kB/s)
Reading package lists... Done
 
## Run `sudo apt-get install -y nodejs` to install Node.js 10.x and npm
## You may also need development tools to build native addons:
     sudo apt-get install gcc g++ make
## To install the Yarn package manager, run:
     curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
     echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
     sudo apt-get update && sudo apt-get install yarn
 
cs


 4-2.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ sudo apt-get install -y nodejs
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
  libuv1
Use 'sudo apt autoremove' to remove it.
The following packages will be upgraded:
  nodejs
1 upgraded, 0 newly installed, 0 to remove and 169 not upgraded.
Need to get 15.0 MB of archives.
After this operation, 58.4 MB of additional disk space will be used.
Get:1 https://deb.nodesource.com/node_10.x xenial/main amd64 nodejs amd64 10.12.0-1nodesource1 [15.0 MB]
Fetched 15.0 MB in 4s (3,091 kB/s)
(Reading database ... 198957 files and directories currently installed.)
Preparing to unpack .../nodejs_10.12.0-1nodesource1_amd64.deb ...
Unpacking nodejs (10.12.0-1nodesource1) over (4.2.6~dfsg-1ubuntu4.2) ...
Processing triggers for man-db (2.7.5-1) ...
Processing triggers for doc-base (0.10.7) ...
Processing 1 removed doc-base file...
Setting up nodejs (10.12.0-1nodesource1) ...
 
cs

5.

 : node 설치 확인

1
2
3
$ node -v
v10.12.0
 
cs


6.

 : node.js 관련 작업 디렉터리 생성

1
2
$ mkdir nodejs
 
cs

7.

1
2
$ cd nodejs
 
cs


8.

 : 관련 패키지 설치를 진행하기 전에 다음과 같이 업데이트 먼저 진행하는 것을 추천

1
2
$ sudo npm update
 
cs


9.

 : mysql 패키지 설치

1
2
3
4
5
6
7
8
9
10
11
12
13
$ sudo npm install -y mysql
npm WARN saveError ENOENT: no such file or directory, open '/home/rabbit/nodejs/package.json'
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN enoent ENOENT: no such file or directory, open '/home/rabbit/nodejs/package.json'
npm WARN nodejs No description
npm WARN nodejs No repository field.
npm WARN nodejs No README data
npm WARN nodejs No license field.
 
+ mysql@2.16.0
added 11 packages from 15 contributors and audited 13 packages in 1.339s
found 0 vulnerabilities
 
cs


10.

 : cors 패키지 설치

1
2
3
4
5
6
7
8
9
10
11
12
$ sudo npm install -y cors
npm WARN saveError ENOENT: no such file or directory, open '/home/rabbit/nodejs/package.json'
npm WARN enoent ENOENT: no such file or directory, open '/home/rabbit/nodejs/package.json'
npm WARN nodejs No description
npm WARN nodejs No repository field.
npm WARN nodejs No README data
npm WARN nodejs No license field.
 
+ cors@2.8.4
added 3 packages from 3 contributors and audited 35 packages in 1.65s
found 0 vulnerabilities
 
cs


11.

 : express 패키지 설치

1
2
3
4
5
6
7
8
9
10
11
12
$ sudo npm install -y express
npm WARN saveError ENOENT: no such file or directory, open '/home/rabbit/nodejs/package.json'
npm WARN enoent ENOENT: no such file or directory, open '/home/rabbit/nodejs/package.json'
npm WARN nodejs No description
npm WARN nodejs No repository field.
npm WARN nodejs No README data
npm WARN nodejs No license field.
 
+ express@4.16.4
added 45 packages from 35 contributors and audited 158 packages in 2.795s
found 0 vulnerabilities
 
cs


12.

 : forever 패키지 설치

1
2
3
4
5
6
7
8
$ sudo npm install -y -g forever
/usr/bin/forever -> /usr/lib/node_modules/forever/bin/forever
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.4 (node_modules/forever/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.4: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
 
+ forever@0.15.3
added 242 packages from 153 contributors in 4.961s
 
cs

* forever 패키지 같은 경우 설치 시 -g 옵션을 주어 전역 모드로 설치를 진행해야 함


Windows 환경 구축

13.

 : Windows에서 node.js 설치 필요 시 하기의 링크 클릭

 : node.js 설치


13.

 : Windows에서 Ubuntu로 파일 전송을 위한 WinSCP 설치 필요 시 하기 링크를 클릭

 : WinSCP 설치


14.

 : node.js 관련 작업 폴더 생성


15.

 : node.js 관련 작업 폴더 내의 빈 곳에서 Shift + 우클릭 후 "여기에 PowerShell 창 열기" 탭 클릭


16.

 : cors 패키지 설치

1
2
3
4
5
6
7
8
9
10
11
12
13
PS C:\Users\Admin\Downloads\nodejs> npm install -y cors
npm WARN saveError ENOENT: no such file or directory, open 'C:\Users\Admin\package.json'
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN enoent ENOENT: no such file or directory, open 'C:\Users\Admin\package.json'
npm WARN Admin No description
npm WARN Admin No repository field.
npm WARN Admin No README data
npm WARN Admin No license field.
 
+ cors@2.8.4
added 3 packages from 3 contributors and audited 18 packages in 1.891s
found 0 vulnerabilities
 
cs


17.

 : express 패키지 설치

1
2
3
4
5
6
7
8
9
10
11
12
PS C:\Users\Admin\Downloads\nodejs> npm install -y express
npm WARN saveError ENOENT: no such file or directory, open 'C:\Users\Admin\package.json'
npm WARN enoent ENOENT: no such file or directory, open 'C:\Users\Admin\package.json'
npm WARN Admin No description
npm WARN Admin No repository field.
npm WARN Admin No README data
npm WARN Admin No license field.
 
+ express@4.16.4
added 47 packages from 36 contributors and audited 141 packages in 2.884s
found 0 vulnerabilities
 
cs


18.

 : mysql 패키지 설치

1
2
3
4
5
6
7
8
9
10
11
12
PS C:\Users\Admin\Downloads\nodejs> npm install -y mysql
npm WARN saveError ENOENT: no such file or directory, open 'C:\Users\Admin\package.json'
npm WARN enoent ENOENT: no such file or directory, open 'C:\Users\Admin\package.json'
npm WARN Admin No description
npm WARN Admin No repository field.
npm WARN Admin No README data
npm WARN Admin No license field.
 
+ mysql@2.16.0
added 9 packages from 14 contributors and audited 305 packages in 3.747s
found 0 vulnerabilities
 
cs


19.

 : Visual Studio Code 혹은 node.js 개발이 가능한 IDE 툴을 실행


20.

 : 확장 버튼 혹은 Ctrl + Shift + X 버튼을 눌러 node 검색 후 Node.js Extension Pack 설치

 : 설치 후 Reload to Activate 버튼 클릭


21.

 : 코드 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
const cors = require('cors');
const express = require('express');
const mysql = require('mysql');
 
var app = express();
app.listen('8080');
app.use(cors());
app.use(express.json());
 
var con = mysql.createConnection({
 
  host: "____________________________________________________________",
  user: "_____",
  password: "___________",
  port: '____',
  database: "____"
 
});
 
app.get('/todos'function (req, res) {
  console.log("GET: /todos");
 
  con.query("SELECT * FROM todos"function (err, result) {
    if (err) res.send(err);
 
    res.json(result);
    res.end();
  });
});
 
app.post('/todos'function (req, res) {
  console.log("POST: /todos");
  console.log(req.body);
 
  var sql = `INSERT INTO todos(title, isDone) VALUES ('${req.body.title}', ${req.body.isDone})`;
  con.query(sql, function (err, result) {
    if (err) res.send(err);
 
    res.json(result.insertId);
    res.end();
  });
});
 
app.put('/todos'function (req, res) {
  console.log("PUT: /todos");
  console.log(req.body);
 
  var sql = `UPDATE todos SET isDone = ${req.body.isDone} WHERE id = ${req.body.id}`;
  con.query(sql, function (err, result) {
    if (err) res.send(err);
 
    res.json(result);
    res.end();
  });
});
 
app.delete('/todos'function (req, res) {
  console.log("DELETE: /todos");
  console.log(req.body);
 
  var sql = `DELETE FROM todos WHERE id = ${req.body.id}`;
  con.query(sql, function (err, result) {
    if (err) res.send(err);
 
    res.json(result);
    res.end();
  });
});
 
cs

* host, user, password, port, database에 해당하는 5곳은 자신의 환경에 맞는 database 정보를 기입

* 코드의 실행 및 디버깅 과정 생략!


22.

 : node.js 관련 작업 폴더 내에 app.js 파일로 저장


23.

 : node.js 관련 작업 폴더 내의 빈 곳에서 Shift + 우클릭 후 "여기에 PowerShell 창 열기" 탭 클릭


24.

 : node.js 기동 시 다음과 같이 명령어 실행

1
2
PS C:\Users\Admin\Downloads\nodejs> node .\app.js
 
cs


25.

 : 서비스 요청 시 아직 DB가 설계되어 있지 않거나 연결 상태가 정상적이지 않다면 다음과 같이 해당 오류가 발생

 : 정상적으로 연결이 되어 있는 상태에서 데이터가 있을 경우는 다음과 같음

* Windows 개발 환경에서 정상적인 동작을 확인하였다면 이후 Ubuntu 환경으로 app.js를 배포


Windows -> Ubuntu

26.

 : Ubuntu의 IP Addr 확인

1
2
3
$ ifconfig |grep "inet addr"
          inet addr:192.168.168.168  Bcast:192.168.168.168  Mask:255.255.0.0
          inet addr:127.0.0.1  Mask:255.0.0.0
cs


27.

 : WinSCP 실행 후 접속 서버의 정보 기입 후 로그인 버튼 클릭


28.

 : 정상적으로 연결될 경우 다음과 같은 창이 출력되며 예 버튼 클릭


29.

 : 좌측은 Windwos, 우측은 Ubuntu

* app.js 업로드 시 해당 파일에 database 접속 정보 확인 필요


30.

 : 좌측의 해당 app.js 파일을 우클릭 하여 서버측으로 업로드 진행


31.

 : 확인 버튼 클릭


32.

 : putty 실행 후 해당 서버 접속 정보 기입 후 Open 버튼 클릭


33.


34.

 : 해당 app.js 파일의 경로로 이동하여 목록 확인

1
2
3
4
5
6
7
8
$ ll
total 32
drwxrwxr-x  3 rabbit rabbit  4096 10월 13 22:22 ./
drwxr-xr-x 21 rabbit rabbit  4096 10월 13 21:50 ../
-rw-rw-r--  1 rabbit rabbit  1612 10월 13 20:07 app.js
drwxr-xr-x 62 root   root    4096 10월 13 16:35 node_modules/
-rw-r--r--  1 root   root   16065 10월 13 16:35 package-lock.json
 
cs


35.

 : node 명령어로 app.js 실행

1
2
3
4
5
$ sudo forever start -o output.log -e error.log app.js
warn:    --minUptime not set. Defaulting to: 1000ms
warn:    --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms
info:    Forever processing file: app.js
 
cs

36.

 : Ubuntu에 app.js의 서비스 주소로 요청 시 Windwos의 Databases에서 해당 데이터를 조회하여 응답함

* 위와 같이 DB 생성 및 데이터가 있음에도 불구하고 제대로 된 데이터를 출력하지 못한다면 아래와 같은 경우를 고려해야 함

 : Windows 방화벽 인바운드 규칙

 : MySQL 계정 외부 접속 허용 권한

 : Ubuntu 내의 app.js 서비스 상태 및 포트



+ Recent posts