λ°˜μ‘ν˜•

본문의 λ‚΄μš©μ€ 도움말과 κ²½ν—˜μ„ 톡해 μ •λ¦¬ν•œ κ²ƒμž…λ‹ˆλ‹€. μ˜€ν”ˆ λΉŒλ”μ— λŒ€ν•œ λ”μš± μžμ„Έν•œ μ„€λͺ…은 μ•„λž˜ 도움말을 μ°Έκ³ ν•˜μ„Έμš”.

μŠ€ν‚¬ μ„œλ²„ 도움말: λ§ν¬

μΉ΄μΉ΄μ˜€ν†‘ 챗봇 μŠ€ν‚¬ μ„œλ²„λž€?

μΉ΄μΉ΄μ˜€ν†‘ μ±—λ΄‡μ˜ μŠ€ν‚¬ κΈ°λŠ₯을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” μŠ€ν‚¬ μ„œλ²„(응닡 μ„œλ²„)κ°€ ν•„μš”ν•©λ‹ˆλ‹€. 그럼 이 μŠ€ν‚¬ μ„œλ²„κ°€ 무엇인지 λ³ΌκΉŒμš”?

'μŠ€ν‚¬ μ„œλ²„(Skill Server)'λž€, 봇 μ‹œμŠ€ν…œμœΌλ‘œλΆ€ν„° μŠ€ν‚¬ μš”μ²­μ„ λ°›κ³  이에 λ‹΄κΈ΄ 정보λ₯Ό λΆ„μ„ν•˜μ—¬ μ μ ˆν•œ μ‘λ‹΅ν•˜λŠ” 것이 μŠ€ν‚¬ μ„œλ²„μ˜ μ—­ν• μž…λ‹ˆλ‹€.

그리고 μ•„λž˜λŠ” μš”μ²­κ³Ό μ‘λ‹΅μ˜ λ‹€μ΄μ–΄κ·Έλž¨μž…λ‹ˆλ‹€.

봇 μ‹œμŠ€ν…œ μš”μ²­κ³Ό μŠ€ν‚¬ μ„œλ²„μ˜ 응닡 - 좜처: 카카였 i μ˜€ν”ˆ λΉŒλ”

즉, μ‚¬μš©μžκ°€ 봇을 μ΄μš©ν•΄ μš”μ²­μ„ ν•˜λ©΄ HTTP ν”„λ‘œν† μ½œμ˜ POST Methodκ°€ 전달이 되고, μ„œλ²„μ—μ„œλŠ” 이에 λŒ€ν•œ 응닡을 JSON κ΅¬μ„±μœΌλ‘œ λ³΄λ‚Έλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

예제 μŠ€ν‚¬ μ„œλ²„

예제 μŠ€ν‚¬ μ„œλ²„ 도움말: 링크

μ˜€ν”ˆ λΉŒλ” λ„μ›€λ§μ—μ„œλŠ” ubuntu 16.04 ν™˜κ²½μ—μ„œ 예제 μŠ€ν‚¬ μ„œλ²„λ₯Ό κ΅¬μ„±ν•˜λŠ” 방법을 μ œκ³΅ν•˜λŠ”λ°μš”. 사싀 μ €λŠ” ubuntu ν™˜κ²½μ—μ„œ κ°œλ°œμ„ ν•œ κ²½ν—˜μ΄ μ—†κΈ° λ•Œλ¬Έμ— μ–΄λ–»κ²Œ ν•΄μ•Ό ν•˜λŠ”μ§€ λ§‰λ§‰ν–ˆμŠ΅λ‹ˆλ‹€. 그런데 μœˆλ„μš°μ—μ„œλ„ λ™μΌν•œ λ°©λ²•μœΌλ‘œ μ•„μ£Ό κ°„λ‹¨ν•˜κ²Œ 예제 μŠ€ν‚¬ μ„œλ²„λ₯Ό κ΅¬ν˜„ν•  수 μžˆλ‹€λŠ” 것을 μ•Œκ²Œ λμŠ΅λ‹ˆλ‹€.

참고둜 예제 μŠ€ν‚¬ μ„œλ²„λŠ” ν…μŠ€νŠΈ λ¬Έμžμ—΄μ„ λ˜λŠ” 이미지λ₯Ό λ°˜ν™˜ν•˜λŠ” 두 가지 λ™μž‘μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€. 그럼 μœˆλ„μš° κΈ°λ°˜μ—μ„œ 예제 μŠ€ν‚¬ μ„œλ²„λ₯Ό κ΅¬μΆ•ν•˜λŠ” 방법을 μ‹œμž‘ν•΄ λ³΄κ² μŠ΅λ‹ˆλ‹€.

따라 ν•˜κΈ°

1. μ„œλ²„ 생성 및 μ‹€ν–‰ν•˜κΈ°

더보기

μ•„λž˜ 링크에 μ ‘μ†ν•˜μ—¬ μ„€μΉ˜ν˜• Windows용 nvm을 λ‹€μš΄λ‘œλ“œν•˜κ³  μ„€μΉ˜ν•©λ‹ˆλ‹€.

링크: github.com/coreybutler/nvm-windows/releases

 

Releases · coreybutler/nvm-windows

A node.js version management utility for Windows. Ironically written in Go. - coreybutler/nvm-windows

github.com

nvm-windows λ‹€μš΄λ‘œλ“œ νŽ˜μ΄μ§€

μ„€μΉ˜ 과정은 λ„ˆλ¬΄ λ‹¨μˆœν•˜μ—¬ μƒλž΅ν–ˆμŠ΅λ‹ˆλ‹€. Next λ²„νŠΌλ§Œ λͺ‡ 번 λˆ„λ₯΄λ©΄ μ„€μΉ˜κ°€ μ™„λ£Œλ©λ‹ˆλ‹€. λ‹€μŒμ€ nodejsλ₯Ό μ„€μΉ˜ν•  μ°¨λ‘€μž…λ‹ˆλ‹€.

링크: nodejs.org/ko/

nodeJS λ‹€μš΄λ‘œλ“œ ν™”λ©΄

λ§ˆμ°¬κ°€μ§€λ‘œ μ„€μΉ˜ 과정은 λ‹¨μˆœν•©λ‹ˆλ‹€. Next λ²„νŠΌλ§Œ λˆ„λ₯΄λ©΄ μ„€μΉ˜κ°€ μ™„λ£Œλ©λ‹ˆλ‹€.

nvm 및 nodejs μ„€μΉ˜ ν›„ λͺ…λ Ή ν”„λ‘¬ν”„νŠΈλ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.

λͺ…λ Ή ν”„λ‘¬ν”„νŠΈ μ‹€ν–‰

μ•„λž˜μ˜ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•˜λ©΄ μ„€μΉ˜λœ nodejs의 버전이 ν‘œμ‹œλ©λ‹ˆλ‹€.

node -v

μ•„λž˜μ²˜λŸΌ 버전이 ν‘œμ‹œλ˜λ©΄ nodejsλŠ” μ •μƒμ μœΌλ‘œ μ„€μΉ˜λ˜μ–΄ μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€.

μ„€μΉ˜λœ node 버전 확인

μŠ€ν‚¬ μ„œλ²„λ₯Ό λ§Œλ“€ 폴더λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. μ €λŠ” μ˜ˆμ‹œλ‘œ skill-server-exampleμ΄λΌλŠ” 폴더λ₯Ό C:\\에 μƒμ„±ν–ˆμŠ΅λ‹ˆλ‹€.

μŠ€ν‚¬ μ„œλ²„λ₯Ό 생성할 폴더 생성

μ•„λž˜μ˜ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•˜μ—¬ μƒμ„±λœ ν΄λ”λ‘œ μ΄λ™ν•©λ‹ˆλ‹€.

cd C:\skill-server-example

그리고 μ•„λž˜μ˜ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•˜μ—¬ ν”„λ‘œμ νŠΈλ₯Ό μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€.

npm init
폴더 이동 및 ν”„λ‘œμ νŠΈ μ΄ˆκΈ°ν™” κ³Όμ •

ν”„λ‘œμ νŠΈ μ΄ˆκΈ°ν™” κ³Όμ • 쀑에 μž…λ ₯ν•˜λŠ” 단계가 μžˆμŠ΅λ‹ˆλ‹€. package nameμ΄λ‚˜ version, description λ“±μ˜ ν•­λͺ©μΈλ°μš”. μœ„ μ΄λ―Έμ§€μ²˜λŸΌ λ˜‘κ°™μ΄ μž‘μ„±ν•΄λ„ 되고, μž„μ˜λ‘œ μž‘μ„±ν•΄λ„ μƒκ΄€μ—†μŠ΅λ‹ˆλ‹€. ν”„λ‘œμ νŠΈ 생성이 μ™„λ£Œλ˜λ©΄ μ•„λž˜μ™€ 같이 package.json 파일이 μƒμ„±λ©λ‹ˆλ‹€.

ν”„λ‘œμ νŠΈ μ΄ˆκΈ°ν™” ν›„ package.json이 μƒμ„±λœ λͺ¨μŠ΅

λ‹€μŒμ€ expressjsλ₯Ό μ„€μΉ˜ν•  μ°¨λ‘€μž…λ‹ˆλ‹€. μ•„λž˜μ˜ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•©λ‹ˆλ‹€.

npm i --save express
expressjs μ„€μΉ˜ν•˜λŠ” λͺ¨μŠ΅ 

λ‹€μŒμœΌλ‘œ morgan, body-parser 라이브러리λ₯Ό μΆ”κ°€ν•©λ‹ˆλ‹€.

npm i --save morgan body-parser
morgan, body-parser 라이브러리 μ„€μΉ˜ν•˜λŠ” λͺ¨μŠ΅

μœ„ μ„€μΉ˜ 과정이 λͺ¨λ‘ λλ‚˜λ©΄ μ•„λž˜μ™€ 같은 νŒŒμΌλ“€μ΄ μΆ”κ°€λ©λ‹ˆλ‹€.

μ„€μΉ˜κ°€ λλ‚œ λͺ¨μŠ΅

ν•΄λ‹Ή 폴더에 index.js νŒŒμΌμ„ μƒμ„±ν•˜κ³ , μ•„λž˜μ˜ μ½”λ“œλ₯Ό λ³΅μ‚¬ν•˜μ—¬ λΆ™μ—¬ λ„£μŠ΅λ‹ˆλ‹€.

const express = require('express');
const app = express();
const logger = require('morgan');
const bodyParser = require('body-parser');

const apiRouter = express.Router();

app.use(logger('dev', {}));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: true
}));

app.use('/api', apiRouter);

apiRouter.post('/sayHello', function(req, res) {
  const responseBody = {
    version: "2.0",
    template: {
      outputs: [
        {
          simpleText: {
            text: "hello I'm Ryan"
          }
        }
      ]
    }
  };

  res.status(200).send(responseBody);
});

apiRouter.post('/showHello', function(req, res) {
  console.log(req.body);

  const responseBody = {
    version: "2.0",
    template: {
      outputs: [
        {
          simpleImage: {
            imageUrl: "https://t1.daumcdn.net/friends/prod/category/M001_friends_ryan2.jpg",
            altText: "hello I'm Ryan"
          }
        }
      ]
    }
  };

  res.status(200).send(responseBody);
});

app.listen(3000, function() {
  console.log('Example skill server listening on port 3000!');
});

νŒŒμΌμ„ μ €μž₯ν•œ ν›„ λ‹€μ‹œ λͺ…λ Ή ν”„λ‘¬ν”„νŠΈλ‘œ λŒμ•„μ˜΅λ‹ˆλ‹€. μ•„λž˜μ˜ λͺ…λ Ήμ–΄λ₯Ό μž…λ ₯ν•˜μ—¬ μ„œλ²„λ₯Ό μ‹€ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

node index.js
μ„œλ²„κ°€ μ‹€ν–‰λœ λͺ¨μŠ΅

2. 곡유기 μ„€μ •ν•˜κΈ°

더보기

μ„œλ²„λŠ” μ‹€ν–‰ν•˜κ³  μžˆμ§€λ§Œ μ–΄λ””κΉŒμ§€λ‚˜ λ‘œμ»¬μ—μ„œλ§Œ 돌고 μžˆλŠ” μ„œλ²„μž…λ‹ˆλ‹€. μ™ΈλΆ€μ—μ„œ μ ‘μ†ν•˜λ €λ©΄ κ³΅μœ κΈ°μ—μ„œ 포트 ν¬μ›Œλ”©μ„ ν•΄μ€˜μ•Ό ν•©λ‹ˆλ‹€. iptime 곡유기 κΈ°μ€€μœΌλ‘œ 포트 ν¬μ›Œλ”©ν•˜λŠ” 방법은 μ•„λž˜ 링크λ₯Ό μ°Έκ³ ν•˜μ‹œκΈ° λ°”λžλ‹ˆλ‹€(타사 곡유기λ₯Ό μ‚¬μš©ν•΄λ„ 방법은 λ™μΌν•©λ‹ˆλ‹€).

[ipTIME] 포트 ν¬μ›Œλ”© μ„€μ •μœΌλ‘œ μ™ΈλΆ€μ—μ„œ μ§‘μ—μžˆλŠ” μ„œλ²„ μ ‘μ†ν•˜κΈ°

 

[ipTIME] 포트 ν¬μ›Œλ”© μ„€μ •μœΌλ‘œ μ™ΈλΆ€μ—μ„œ μ§‘μ—μžˆλŠ” μ„œλ²„ μ ‘μ†ν•˜κΈ°

포트 ν¬μ›Œλ”©(Port Forwarding) μ΄λž€? μ§‘μ—μ„œ 곡유기λ₯Ό μ‚¬μš©ν•˜λŠ” μ‚¬λžŒλ“€μ€ ν•œ λ²ˆμ―€μ€ 듀어봀을 λ‹¨μ–΄μž…λ‹ˆλ‹€. 특히 개인 NASλ₯Ό κ΅¬λΉ„ν•œ μ‚¬λžŒλ“€μ€ μ™ΈλΆ€μ—μ„œ 집에 μžˆλŠ” NAS에 μ ‘μ†ν•˜κΈ° μœ„ν•΄ λ°˜λ“œμ‹œ 포트 ν¬μ›Œ

luckygg.tistory.com

μ €λŠ” μ•„λž˜ μ΄λ―Έμ§€μ²˜λŸΌ μ™ΈλΆ€ 포트 3000으둜 μ„€μ •ν–ˆμŠ΅λ‹ˆλ‹€.

포트 ν¬μ›Œλ”© μ˜ˆμ‹œ

그런데 포트 ν¬μ›Œλ”© 외에도 ν•œ 가지 섀정을 더 ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ°”λ‘œ DDNSμΈλ°μš”. DDNSλ₯Ό μ„€μ •ν•΄μ•Ό xxx.iptime.org:3000 ν˜•νƒœμ˜ μ£Όμ†Œλ‘œ μ™ΈλΆ€ λ„€νŠΈμ›Œν¬μ—μ„œ λ‚΄λΆ€ λ„€νŠΈμ›Œν¬μ— 접속이 κ°€λŠ₯ν•©λ‹ˆλ‹€. 이 λ˜ν•œ μ•„λž˜μ˜ 링크λ₯Ό μ°Έκ³ ν•˜μ—¬ μ„€μ •ν•˜μ‹œκΈ° λ°”λžλ‹ˆλ‹€.

[ipTIME] DDNS μ„€μ •μœΌλ‘œ μ™ΈλΆ€μ—μ„œ μ‰½κ²Œ κ³΅μœ κΈ°μ— μ ‘μ†ν•˜κΈ°

 

[ipTIME] DDNS μ„€μ •μœΌλ‘œ μ™ΈλΆ€μ—μ„œ μ‰½κ²Œ κ³΅μœ κΈ°μ— μ ‘μ†ν•˜κΈ°

DDNS(Dynamic DNS)λž€? μš°μ„  DDNSλ₯Ό μ΄ν•΄ν•˜κΈ° 전에 DNS(Domain Name system)λ₯Ό 이해해야 ν•©λ‹ˆλ‹€. μš°λ¦¬λŠ” μ›Ή λΈŒλΌμš°μ €μ—μ„œ λ„€μ΄λ²„λ‚˜ ꡬ글에 μ ‘μ†ν•˜κΈ° μœ„ν•΄ www.naver.com λ˜λŠ” www.google.comμ΄λΌλŠ” μ£Όμ†Œλ‘œ μ ‘μ†ν•©λ‹ˆ..

luckygg.tistory.com

3. μ˜€ν”ˆ λΉŒλ” μ‚¬μ΄νŠΈμ—μ„œ μŠ€ν‚¬ μ„œλ²„ μ„€μ •ν•˜κΈ°

더보기

μ§€κΈˆκΉŒμ§€ 잘 λ”°λΌμ˜€μ…¨λ‚˜μš”? 이제 μ˜€ν”ˆ λΉŒλ” μ‚¬μ΄νŠΈμ—μ„œ μŠ€ν‚¬ 생성 및 μ„œλ²„λ₯Ό μ„€μ •ν•˜λŠ” 과정이 λ‚¨μ•˜μŠ΅λ‹ˆλ‹€. μ˜€ν”ˆ λΉŒλ” μ‚¬μ΄νŠΈμ— μ ‘μ†ν•œ ν›„ μŠ€ν‚¬μ„ μƒμ„±ν•©λ‹ˆλ‹€.

μŠ€ν‚¬ μƒμ„±ν•˜κΈ°

μŠ€ν‚¬ 생성 ν›„ URL μž…λ ₯ 뢀뢄에 λ‹€μŒκ³Ό 같이 μž…λ ₯ν•©λ‹ˆλ‹€. μž…λ ₯ν•˜λŠ” URL은 DDNS μ£Όμ†Œμ™€ μ™ΈλΆ€ 포트 그리고 api/sayHello κ΅¬μ„±μž…λ‹ˆλ‹€.

μŠ€ν‚¬ μ„œλ²„μ˜ μ£Όμ†Œλ₯Ό μž…λ ₯ν•˜λŠ” ν™”λ©΄

URL μž…λ ₯ ν›„ μŠ€ν‚¬ μ„œλ²„λ‘œ 전솑 λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄ 응닡 λ©”μ‹œμ§€μ™€ κ²°κ³Όκ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

μŠ€ν‚¬ μ„œλ²„ 응닡 κ²°κ³Ό 보기

μœ„ λ²„νŠΌμ„ ν΄λ¦­ν•˜λ©΄μ„œ λͺ…λ Ή ν”„λ‘¬ν”„νŠΈλ₯Ό 보면 POST μš”μ²­μ„ μ²˜λ¦¬ν–ˆλ‹€λŠ” λ©”μ‹œμ§€λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

λͺ…λ Ή ν”„λ‘¬ν”„νŠΈμ˜ POST 처리 λ©”μ‹œμ§€

정리

본문의 λ‚΄μš©λŒ€λ‘œ κ²°κ³Όλ₯Ό μ–»μœΌμ…¨λ‚˜μš”? μ•Œκ³  λ‚˜λ©΄ 별것 μ•„λ‹Œ 것 κ°™μ§€λ§Œ, μ €λŠ” 이λ₯Ό μ•ŒκΈ°κΉŒμ§€ 정말 였랜 μ‹œκ°„μ΄ κ±Έλ ΈμŠ΅λ‹ˆλ‹€. 결둠은 μ„œλ²„λ₯Ό μ‹€ν–‰ν•˜κ³ , POST λ©”μ„œλ“œμ— νŠΉμ • 행동을 μ‘λ‹΅ν•˜λŠ” μ½”λ“œλ§Œ κ΅¬ν˜„ν•˜λ©΄ λ˜λŠ” 것이죠.

μΆ”ν›„μ—λŠ” Microsoft의 Azure μ„œλ²„μ™€ Synology μ„œλ²„λ₯Ό μ΄μš©ν•œ ASP.NET μŠ€ν‚¬ μ„œλ²„λ₯Ό λ§Œλ“œλŠ” 방법을 μ†Œκ°œν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

λ°˜μ‘ν˜•