외부 ip, 내부 ip 알아내기

외부 ip 를 알아내는 법은 간단합니다. 검색엔진을 통해 ‘my ip’ 라고 검색해보면 간단한 어플리케이션들을 통해 알아낼 수 있습니다.

예시 : https://www.myip.com/




내부 ip 를 알아내는 방법은 위보단 조금 복잡한데 어렵진 않습니다.

운영체제 별로 다른데, windows / mac 으로 나누어 설명해보겠습니다.

windows

  • 윈도우키() + R 을 눌러 실행창을 띄우고 cmd 입력 후 확인을 눌러 명령 프롬프트를 실행시킵니다.
  • ipconfig 를 입력합니다.
  • IPv4 주소가 해당 디바이스의 내부 ip(private ip) 주소고, 기본 게이트웨이 주소가 라우터 주소를 뜻합니다.

mac os

  • 터미널 창에서 ifconfig | grep inet 을 입력합니다.
  • inet xxx.xxx.xxx.xxx 가 내부 ip 주소를 뜻합니다.

더 읽어보기 »

NAT (Network Address Translation)

Local Area Network with Router

출처: 생활코딩 - WEB2-Home server. 공유기
{: .text-right}


private address 할당에 따라 지금 ‘내 노트북’의 private address 가 192.168.0.4 라고 생각해봅시다.

이 192.168.0.4 라는 ip 주소로는 바깥의 인터넷 세계에서는 목표 ip 주소(Destination ip address)로 정해 들어올 수 없습니다. 로컬 네트워크 안에서만 통용되는 주소이기 때문입니다.

그렇다면 ‘내 노트북’에서 외부 사이트로 어떤 요청을 보내야한다면 ‘내 노트북’의 ip 주소는 어떤식으로 표기되어야 할까요?

이 문제를 라우터(Router) 가 중간에서 해결해줍니다.

라우터는 192.168.0.4 로부터 A서버 로의 요청이 있을때 192.168.0.4 로부터의 요청이 있었음을 기록 해 두고, A 서버 로 요청을 보냅니다.

대신 여기서 시작 ip 주소(Source ip address)를 라우터의 ip 주소인 59.6.66.238 로 표기해 보내게 됩니다.

59.6.66.238 로부터의 요청을 받은 A 서버는, 이 주소로 응답을 하게 되고, 라우터는 이 응답을 로컬 네트워크 내 원래 주소인 192.168.0.4 로 보내주게 되는겁니다.

이 과정을 NAT(Network Address Translation) 이라고 합니다.

더 읽어보기 »

making my server 프로젝트를 진행하기 위해 집에서 서버를 동작시키기 위한

네트워크에 대한 기초적인 이해가 필요함을 알았습니다.

학교 수업에서 전반적인 네트워크 이론을 통해 배웠던 내용이지만, 실제로 적용해보진 못했는데요.

Opentutorials.org 생활코딩의 WEB2 - Home Server 강의를 통해

이론을 적용해보는 공부를 해보도록 합니다.





Router (공유기)

Local Area Network with Router

출처: 생활코딩 - WEB2-Home server. 공유기
{: .text-right}

ip address 는 IPv4 기준, 4,294,967,296 개가 존재할 수 있습니다.

하지만 이 ip 주소 수는 전세계에 인터넷에 연결되는 모든 디바이스들을 할당하기엔 턱없이 부족합니다.

이러한 문제를 라우터(Router) 가 도움을 줍니다. 주변에서 익숙하게 본 공유기라고도 하는데요.

일반적으로 인터넷에 직접 *
닿아있는, 연결되는** 디바이스에 *public address
를 부여하고

이 디바이스를 통로로 삼아 작은 네트워크를 구성하는 구성원(디바이스)에 private address 를 부여하는 식입니다.

public address 는 전세계에 한개만 존재할테지만, private address 는 서로 다른 로컬 네트워크 사이에서 중복해서 존재할 수 있겠죠.

그리고 이 로컬 네트워크와, 광역 네트워크 사이를 이어주는 디바이스를 라우터(Router) 라고 부릅니다.

로컬 네트워크를 LAN(Local Area Network) , 광역 네트워크를 WAN(Wide Area Network) 라고 합니다.

로컬 네트워크 안에서, 라우터가 갖는 ip address 를 특별히 Gateway address 또는 Router address 라고 부릅니다.



여기서 public addressprivate address 가 같은 값을 가지면 안되겠죠.

그래서 private address 는 특정 범위의 주소들만 할당하도록 약속되어있습니다.


ip address 범위 ip address 수
10.0.0.0 ~ 10.255.255.255 16,777,216 개
172.16.0.0 ~ 172.31.255.255 1,048,576 개
192.168.0.0 ~ 192.168.255.255 65,436 개
더 읽어보기 »

목표

Database 에 있는 author 테이블을 이용해 저자(author) 관리창을 구현합니다.

아래는 완성된 저자 관리창 입니다.

author_manage


홈페이지에서 author 링크를 클릭하면 저자 관리창으로 진입합니다.

저자 관리창에서 저자 리스트를 바로 볼 수 있고, 수정 및 삭제를 할 수 있습니다.

하단에 저자 생성을 위한 form 이 있고, 이 form 은 수정 버튼을 누를 시 수정을 위한 form 으로 대체됩니다.



이러한 기능을 구현하는 코드를 작성해 보겠습니다.





저자 관리창 만들기

template.js

1
2
3
4
5
6
7
8
9
HTML:function(title, list, body, control){
<body>
<h1><a href="/">WEB</a></h1>
<a href="/author">author</a> // 저자 관리창 링크 생성
${list}
${control}
${body}
</body>
}

template에서 기본적인 창 구성을 담당하는 HTML 메소드에 저자 관리창으로 향하는 링크를 생성합니다.저자 링크는 /author 로 하겠습니다.



main.js

더 읽어보기 »

main.js refactoring

이제 어느정도 기본적인 기능을 구현해놓으니 main.js 가 제법 길어지고 복잡해졌습니다.

main.js 가 좀더 단순해지고 가독성이 높아졌으면 좋겠어서 코드 리팩토링을 한번 하고 가겠습니다.

리팩토링을 통해 가독성을 높일 수 있고, 나중에 있을 유지/보수에도 기여할 수 있을겁니다.





목표

main.js 가 도맡아 하던 일들을 몇개의 모듈로 나눠 관리하려합니다.

  • db.js : 데이터베이스 연결에 필요한 정보를 main.js 에서 따로 빼내 관리하는 모듈
  • topic.js : 글 상세보기, 생성, 수정 등의 여러 기능들을 구현해 둔 모듈

더 읽어보기 »

기존 코드를 MySQL 을 이용한 코드로 바꾸기

기존 코드는 파일의 형태로 글을 저장하도록 짜여져있었습니다.

이제 Node.js에 MySQL 을 사용할 수 있도록 패키지를 설치했으니 파일 대신 데이터베이스 에 글을 저장하도록 바꿔봅시다.




‘Home’ 페이지 구현

main.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if(queryData.id === undefined){
/* fs.readdir('./data', function(error, filelist){
var title = 'Welcome';
var description = 'Hello, Node.js';
var list = template.list(filelist);
var html = template.HTML(title, list,
`<h2>${title}</h2>${description}`,
`<a href="/create">create</a>`
);
response.writeHead(200);
response.end(html);
}); */
db.query(`SELECT * FROM topic`, function(error, contents){
var title = 'Welcome';
var description = 'Hello, Node.js';
var list = template.list(contents);
var html = template.HTML(title, list,
`<h2>${title}</h2>${description}`,
`<a href="/create">create</a>`);
response.writeHead(200);
response.end(html);
});
}

위 코드는 주소가 http://localhost:4000/ 일때, 즉 /(루트) 일때 작동하는 코드조각입니다.

주석 처리된 부분이 이전 파일로 처리됐었던 부분입니다.

db.query() 함수의 콜백함수 인자로 들어오는 contents 변수에 mysql query 결과가 배열 형태로 들어오게됩니다.

때문에 /lib/template.js 의 template.list() 함수를 조금 수정해줬습니다.



변경된 template.js

1
2
3
4
5
6
7
8
9
10
list:function(contents){    
var list = '<ul>';
var i = 0;
while(i < contents.length){
list = list + `<li><a href="/?id=${contents[i].id}">${contents[i].title}</a></li>`; // query 결과가 배열 형태로 오므로 수정
i = i + 1;
}
list = list+'</ul>';
return list;
}
더 읽어보기 »

관계형 데이터베이스 (Relational Database)

MySQL 은 관계형 데이터베이스 중의 하나라고 할 수 있습니다.

관계형 데이터베이스의 특징은 정보를 하나의 테이블에 담는 것이 아니라

목적에 따라 여러개의 테이블에 나누어 담는 것인데요.

예를 들어 보겠습니다.


nonerelational_db
출처: Opentutorials - DATABASE2 MySQL - 15.관계형 데이터베이스의 필요성
{: .text-right}
정보를 이처럼 한 테이블에 담는다면, 일단 사용자가 보기에는 편할 것입니다.

모든 정보를 이 한 테이블에서 얻어낼 수 있을테니까요.

하지만 데이터를 관리하는 관리자 입장에서는 이런 테이블은 유지/보수 하기가 어려울 뿐더러,

중복되는 정보들에 의미 부여를 하기가 어렵습니다.



만약 위의 테이블에서 ‘egoing’ 이라는 글쓴이 정보를 ‘EGOING’ 이라고 바꿔야한다면

id가 1,2,5인 테이블을 하나하나 바꿔야 합니다.

만약 이 테이블에 더 많은 정보가 들어있었다면 더 많은 수정 작업이 필요했을 것입니다.

또한 ‘egoing’ 이라는 또다른 동명이인 글쓴이가 존재한다면, 이 테이블을 통해서는 동일한 글쓴이인지 판별하기가 어렵습니다.




relational_db
출처: Opentutorials - DATABASE2 MySQL - 15.관계형 데이터베이스의 필요성
{: .text-right}
하지만 위와같이 테이블을 author 테이블과 topic 테이블로 나눈다면 문제를 해결할 수 있습니다.

topic 테이블의 author 필드는 author_id 필드로 대체되었고, 본래 topic 테이블에 담겨있던 author 필드와 profile 필드의 정보들은 author 테이블로 옮겨졌습니다.

그리고 author 테이블에 id 필드를 만들어 topic 의 author_id 와 대응되게 하였습니다.



이제 관리자는 ‘egoing’ 이라는 글쓴이 정보를 ‘EGOING’ 으로 수정하려 할때

여러번의 수정없이 author 테이블의 id=1 에 해당하는 ‘egoing’ 만 수정하면 topic 테이블 전체에 수정하는 효과를 가져올 수 있습니다.

또한 만약 ‘egoing’ 이라는 이름을 가진 동명이인이 글을 쓴다고 하면, author 테이블에 id=4이고 ‘egoing’ 이름을 가진 새로운 레코드를 추가함으로써 의미적으로 ‘id=1 egoing’ 과 ‘id=4 egoing’ 을 구분할 수 있을 것입니다.





이러한 관계형 데이터베이스의 특징을 살펴보면서 이전에 JavaScript 공부를 하며 느꼈던 ‘함수의 필요성’과 많이 유사함을 느낄 수 있었습니다. 유지/보수와 의미부여 측면에 있어서요.

전부 똑같다고 볼 순 없겠지만, 지금은 이런식으로 이해하면 도움이 될 것 같습니다.





> JOIN 사용해보기

이제 테이블을 나누었으니, 데이터 관리자 입장에서는 한결 수월해졌습니다.

하지만 사용자 입장에서는 오히려 불편해졌지요. 하나였던 테이블을 두개에 걸쳐 번갈아가며 정보를 확인해야 하니까요.

이를 해소할 방법이 있습니다. ‘JOIN’ 입니다.

JOIN 은 두 개의 테이블 사이에 공통되는 정보를 바탕으로 합성하는것입니다.

일단 사용법은 ‘SELECT’ 문에 JOIN문을 추가하는 형식인데,

SELECT * FROM [테이블명] JOIN [조인할 테이블명] ON [조건절]

이렇습니다. 예를 들어보겠습니다.

1
2
3
4
5
6
7
8
9
10
mysql> SELECT * FROM topic JOIN author ON topic.author_id = author.id;
+----+------------+-------------------+---------------------+-----------+------+--------+---------------------------+
| id | title | description | created | author_id | id | name | profile |
+----+------------+-------------------+---------------------+-----------+------+--------+---------------------------+
| 1 | MySQL | MySQL is ... | 2019-01-30 08:00:00 | 1 | 1 | egoing | developer |
| 2 | Oracle | Oracle is ... | 2019-01-30 08:01:00 | 1 | 1 | egoing | developer |
| 5 | MongoDB | MongoDB is ... | 2019-01-30 08:02:00 | 1 | 1 | egoing | developer |
| 3 | SQL Server | SQL Server is ... | 2019-01-30 08:03:00 | 2 | 2 | duru | data administrator |
| 4 | PostgreSQL | PostgreSQL is ... | 2019-01-30 08:04:00 | 3 | 3 | taeho | data scientist, developer |
+----+------------+-------------------+---------------------+-----------+------+--------+---------------------------+
더 읽어보기 »

Node.js & MySQL 연계하기

이전 공부에서 Node.js 를 이용해 글 작성 및 수정 삭제, 그리고 작성된 글을 HTML 형식으로 Generate 해주는 웹 어플리케이션을 만들어 보았고

MySQL 을 통해 관계형 데이터베이스의 기본적인 구조와 동작방법을 배웠습니다.



이제 이번 공부를 진행하면서 file 을 통해 글을 저장하는 것이 아니라, Database 를 이용해 글을 저장할 수 있을것이고

데이터베이스가 가진 기능들로 저자글쓴 날짜 등도 적은 비용으로 표현할 수 있게 될 것입니다.





소스코드 받기

본 포스트는 [Opentutorials: Nodejs-MySQL] 강의에서 제공하는 소스코드를 바탕으로 시작하였습니다.

여기에서 소스코드를 받으실 수 있습니다.





MySQL package 설치

더 읽어보기 »

MySQL 기초

1. MySQL 구조

mysql_structure
출처: Opentutorials - DATABASE2 MySQL - 4.MySQL의 구조
{: .text-right}
여기서 표(table)의 행에 해당하는 것을 row, record 라 부르고

열에 해당하는 것을 column, field 라 부릅니다.


2. MySQL 서버 접속하기

1
2
$ mysql -uroot -p
Enter password: *****

여기서 mysql -uroot -p 는 mysql 서버에 root 계정으로 password 를 다음 입력으로 입력하여 접속하겠다는 뜻입니다.


3. Database(Schema) 생성, 삭제하기

더 읽어보기 »

나만의 ‘my server’ 만들어보기

node.js 기초로 운을 뗐으니 나만의 ‘my server’ 를 만들기 위한 다음 공부를 시작해봅니다.

처음 만들어 보는 것이기 때문에 이것저것 우여곡절이 많고 삽질도 많을것이 당연하지만,

내 손으로 탄생한 서버가 클라이언트와 정보를 주고 받게 하고 싶습니다.



‘my server’ 가 어떤 용도로 쓰이게 될 것이다 라는 계획은 아직 없지만

공부를 진행하면서 어떤 것을 만들게 될지 윤곽이 잡힐 것 같습니다.



개인적으로 간단한 문서나 사진부터 시작해서 동영상 정도를 저장하고 필요할 때 꺼내볼 수 있게 해주는.. 그런 친구를 생각해 보고 있는데, 아직은 시작단계니까요.

언제든 계획이 바뀔 수도 있습니다.

하지만 일단 시작하는게 중요하다고 봅니다.^_^





> 계획

공부를 하다보면 ‘my server’를 이렇게 만들어야 겠다 에 대한 윤곽이 하나씩 하나씩 잡힐 것만 같습니다.



앞서 node.js 기초를 공부했던

오픈튜토리얼스(https://opentutorials.org) 에서 필요한 강의들을 찾아 볼 것이며,

일단 공부 순서는 이렇습니다.




  1. “데이터베이스 기초”
  2. “MySQL 기초”
  3. “Node.js 와 MySQL 연계”
더 읽어보기 »