JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

62

Transcript of JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

Page 1: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique
Page 2: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

Copyright โ“’ 2015 KUJIRA HAND

Korean translation copyright โ“’ 2017 J-PUB

Original Japanese language edition published by Socym Co., Ltd.

Korean translation rights arranged with Socym Co., Ltd. through Danny Hong Agency.

์ด ์ฑ…์˜ ํ•œ๊ตญ์–ดํŒ ์ €์ž‘๊ถŒ์€ ๋Œ€๋‹ˆํ™ ์—์ด์ „์‹œ๋ฅผ ํ†ตํ•œ ์ €์ž๊ถŒ์‚ฌ์™€์˜ ๋…์  ๊ณ„์•ฝ์œผ๋กœ ์ œ์ดํŽ์— ์žˆ์Šต๋‹ˆ๋‹ค.

์ €์ž‘๊ถŒ๋ฒ•์— ์˜ํ•ด ํ•œ๊ตญ ๋‚ด์—์„œ ๋ณดํ˜ธ๋ฅผ ๋ฐ›๋Š” ์ €์ž‘๋ฌผ์ด๋ฏ€๋กœ ๋ฌด๋‹จ ์ „์žฌ์™€ ๋ฌด๋‹จ ๋ณต์ œ๋ฅผ ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

์ดˆํŒ 1์‡„ ๋ฐœํ–‰ 2016๋…„ 12์›” 30์ผ

์ง€์€์ด ์ฟ ์ง€๋ผ ํžˆ์ฝ”์šฐ์ฆˆ์ฟ ์—

์˜ฎ๊ธด์ด ์ด๋™๊ทœ

ํŽด๋‚ธ์ด ์žฅ์„ฑ๋‘

ํŽด๋‚ธ๊ณณ ์ œ์ดํŽ

์ถœํŒ์‹ ๊ณ  2009๋…„ 11์›” 10์ผ ์ œ406-2009-000087ํ˜ธ์ฃผ์†Œ ๊ฒฝ๊ธฐ๋„ ํŒŒ์ฃผ์‹œ ํšŒ๋™๊ธธ 159 3์ธต 3โ€“Bํ˜ธ

์ „ํ™” 070โ€“8201โ€“9010 / ํŒฉ์Šค 02โ€“6280โ€“0405ํ™ˆํŽ˜์ด์ง€ www.jpub.kr / ์›๊ณ ํˆฌ๊ณ  [email protected]๋…์ž๋ฌธ์˜ [email protected] / ๊ต์žฌ๋ฌธ์˜ [email protected]ํŽธ์ง‘๋ถ€ ์ด๋ฏผ์ˆ™, ํ™ฉํ˜œ๋‚˜, ์ด ์Šฌ, ์ด์ฃผ์› / ์†Œํ†ตยท๊ธฐํšํŒ€ ๋ฏผ์ง€ํ™˜, ํ˜„์ง€ํ™˜

๋ณธ๋ฌธ๋””์ž์ธ ๋ถ์•„์ด / ํ‘œ์ง€๋””์ž์ธ ๋ฏธ๋””์–ดํ”ฝ์Šค

์šฉ์ง€ ์—์Šค์—์ด์น˜ํŽ˜์ดํผ / ์ธ์‡„ ํ•œ์Šน์ธ์‡„์‚ฌ / ์ œ๋ณธ ๊ด‘์šฐ์ œ์ฑ…์‚ฌ

ISBN 979-11-85890-66-1 (93000)๊ฐ’ 30,000์›

โ€ป ์ด ์ฑ…์€ ์ €์ž‘๊ถŒ๋ฒ•์— ๋”ฐ๋ผ ๋ณดํ˜ธ๋ฅผ ๋ฐ›๋Š” ์ €์ž‘๋ฌผ์ด๋ฏ€๋กœ ๋ฌด๋‹จ ์ „์žฌ์™€ ๋ฌด๋‹จ ๋ณต์ œ๋ฅผ ๊ธˆ์ง€ํ•˜๋ฉฐ, ์ด ์ฑ… ๋‚ด์šฉ์˜ ์ „๋ถ€ ๋˜๋Š” ์ผ๋ถ€

๋ฅผ ์ด์šฉํ•˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ ์ €์ž‘๊ถŒ์ž์™€ ์ œ์ดํŽ์˜ ์„œ๋ฉด ๋™์˜๋ฅผ ๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โ€ป ์ž˜๋ชป๋œ ์ฑ…์€ ๊ตฌ์ž…ํ•˜์‹  ์„œ์ ์—์„œ ๋ฐ”๊พธ์–ด ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

์ œ์ดํŽ์€ ๋…์ž ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฑ…์— ๊ด€ํ•œ ์•„์ด๋””์–ด์™€ ์›๊ณ  ํˆฌ๊ณ ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฑ…์œผ๋กœ ํŽด๋‚ด๊ณ ์ž ํ•˜๋Š” ์•„์ด๋””์–ด๋‚˜ ์›๊ณ ๊ฐ€ ์žˆ์œผ์‹  ๋ถ„๊ป˜์„œ

๋Š” ์ฑ…์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ๊ฐœ์š”์™€ ์ฐจ๋ก€, ๊ตฌ์„ฑ๊ณผ ์ €(์—ญ)์ž ์•ฝ๋ ฅ ๋“ฑ์„ ๋ฉ”์ผ๋กœ ๋ณด๋‚ด ์ฃผ์„ธ์š”. [email protected]

Page 3: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique
Page 4: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

โ€ป ๋“œ๋ฆฌ๋Š” ๋ง์”€

โ€ข ์ด ์ฑ…์— ๊ธฐ์žฌ๋œ ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์šด์šฉ ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด ์ €์ž, ์—ญ์ž, ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์ž ๋ฐ ์ œ๊ณต์ž, ์ œ์ดํŽ

์ถœํŒ์‚ฌ๋Š” ์ผ์ฒด์˜ ์ฑ…์ž„์„ ์ง€์ง€ ์•Š์œผ๋ฏ€๋กœ ์–‘ํ•ด ๋ฐ”๋ž๋‹ˆ๋‹ค.

โ€ข ์ด ์ฑ…์— ๋“ฑ์žฅํ•˜๋Š” ๊ฐ ํšŒ์‚ฌ๋ช…, ์ œํ’ˆ๋ช…์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ ํšŒ์‚ฌ์˜ ๋“ฑ๋ก ์ƒํ‘œ ๋˜๋Š” ์ƒํ‘œ์ž…๋‹ˆ๋‹ค. ๋ณธ๋ฌธ ์ค‘์—๋Š” TM, โ’ธ, โ“‡ ๋งˆํฌ ๋“ฑ์ด ํ‘œ์‹œ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

โ€ข ์ด ์ฑ…์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์ œํ’ˆ ๋ฒ„์ „์€ ๋…์ž์˜ ํ•™์Šต ์‹œ์ ์ด๋‚˜ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ์ฑ…์˜ ๋‚ด์šฉ๊ณผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ€ข ๋ณธ๋ฌธ ์ค‘ ์ผ๋ณธ ๋‚ด์˜ ์‹ค์ •์—๋งŒ ๊ตญํ•œ๋˜์–ด ์žˆ๋Š” ๋‚ด์šฉ์ด๋‚˜ ๊ทธ๋ฆผ์€ ์ผ๋ถ€๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ๊ตญ๋‚ด ์‹ค์ •์— ๋งž๋„๋ก

๋ณ€๊ฒฝํ•˜์˜€์œผ๋‹ˆ ์ฐธ๊ณ  ๋ฐ”๋ž๋‹ˆ๋‹ค.

โ€ข ์ฑ… ๋‚ด์šฉ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์˜์‚ฌํ•ญ์€ ์˜ฎ๊ธด์ด๋‚˜ ์ถœํŒ์‚ฌ๋กœ ์—ฐ๋ฝํ•ด ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

- ์˜ฎ๊ธด์ด: [email protected]

- ์ถœํŒ์‚ฌ: [email protected]

Page 5: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

์˜ฎ๊ธด์ด ๋จธ๋ฆฌ๋ง xvi

๋จธ๋ฆฌ๋ง xviii

์ด ์ฑ…์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ• xix

๋ฒ ํƒ€๋ฆฌ๋” ํ›„๊ธฐ xx

๊ฐœ๋ฐœ ํ™˜๊ฒฝ 1

01 ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—”์ง„์˜์ด๋ชจ์ €๋ชจ _ 2

ECMAScript๊ฐ€ ์‹คํ˜„ํ•œ ๋ฒ”์šฉ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์„ธ๊ณ„ _ 2์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์˜ ์ด๋ชจ์ €๋ชจ _ 3

์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„ _ 4 ๊ณ ์† ์—”์ง„์—์„œ ํƒ„์ƒํ•œ Node.js _ 4 ์ž๋ฐ”์˜ ํ’๋ถ€ํ•œ ์ž์‚ฐ

์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” Rhino์™€ Nashorn _ 5 ์œˆ๋„์šฐ์— ํ‘œ์ค€์œผ๋กœ ํƒ‘์žฌ๋œ ์ œ์ด์Šคํฌ๋ฆฝํŠธ _ 6

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘์— ์ ํ•ฉํ•œ ์ด์œ  _ 6๋ฐฐ์šฐ๊ธฐ ์‰ฝ๋‹ค _ 6 ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ค€๋น„๋˜์–ด ์žˆ๋‹ค _ 7 ์œ ์—ฐ์„ฑ์ด ๋†’์•„ ์ฝ”๋“œ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ž‘์„ฑํ• 

์ˆ˜ ์žˆ๋‹ค _ 7

02์—์ด์ „ํŠธ๋ž€๋ฌด์—‡์ธ๊ฐ€? _ 8

์—์ด์ „ํŠธ์˜ ์˜๋ฏธ _ 8์ง€๋Šฅํ˜• ์—์ด์ „ํŠธ _ 9

๋ฐ”์ด์–ด ์—์ด์ „ํŠธ _ 9 ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ _ 9 ๊ฐ์‹œ ์—์ด์ „ํŠธ _ 10 ๋ฐ์ดํ„ฐ ๋งˆ์ด๋‹ ์—์ด์ „ํŠธ _ 10

03 ๊ฐœ๋ฐœํ™˜๊ฒฝ๊ตฌ์ถ• _ 11

๊ฐ€์ƒ ๋จธ์‹ ์— ์‹คํ–‰ ํ™˜๊ฒฝ ๊ตฌ์ถ• _ 11๊ฐ€์ƒ ๋จธ์‹  ์ƒ์„ฑ _ 12

VirtualBox์™€ Vagrant ์„ค์น˜ _ 12 ๊ฐ€์ƒ ๋จธ์‹  ์ถ”๊ฐ€ _ 13 ๊ฐ€์ƒ ๋จธ์‹  ๊ธฐ๋™ _ 15 ๊ฐ€์ƒ ๋จธ์‹  ์ œ์–ด _

16

๊ฐ€์ƒ ๋จธ์‹ ์— ๋กœ๊ทธ์ธํ•˜๊ธฐ _ 16์œˆ๋„์šฐ์—์„œ ๊ฐ€์ƒ ๋จธ์‹ ์— ๋กœ๊ทธ์ธํ•˜๋Š” ๋ฐฉ๋ฒ• _ 17

Node.js ์„ค์น˜ _ 19

1์žฅ์ œ

์ฐจ๋ก€

์ฐจ๋ก€ v

Page 6: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

git ์„ค์น˜ _ 21๊ฐ€์ƒ ๋จธ์‹ ์—์„œ ์›น ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ • _ 21

ํ˜ธ์ŠคํŠธ ๋จธ์‹ ๊ณผ ๊ฐ€์ƒ ๋จธ์‹  ๊ฐ„์˜ ํด๋” ๊ณต์œ  _ 21 ๊ฐ€์ƒ ๋จธ์‹ ์˜ ํด๋” ๊ณต์œ  ์„ค์ • ์ค‘ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”

๊ฒฝ์šฐ _ 22 ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์—์„œ ๊ฐœ๋ฐœํ•˜๊ณ  ๊ฐ€์ƒ ๋จธ์‹ ์—์„œ ์‹คํ–‰ _ 22

04 Node.js๋ชจ๋“ˆ์„ค์น˜ _ 24

npm์ด๋ž€? _ 24npm install๋กœ ๋ชจ๋“ˆ ์„ค์น˜ _ 24

๋ชจ๋“ˆ์ด ์„ค์น˜๋˜๋Š” ๊ฒฝ๋กœ _ 25 ๊ธ€๋กœ๋ฒŒ ์„ค์น˜ -g _ 26 ๊ธ€๋กœ๋ฒŒ ์„ค์น˜ ์‹œ PATH์— ์ฃผ์˜ _ 27 CentOS์—

nano ์—๋””ํ„ฐ ์„ค์น˜ _ 29

๋ชจ๋“ˆ ์‚ญ์ œ _ 30

05 ๊ฐœ๋ฐœ์ƒ์‚ฐ์„ฑ์„๋†’์—ฌ์ค„๋ชจ๋˜ํ•œ์—๋””ํ„ฐ์†Œ๊ฐœ _ 31

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ์— ํ•„์š”ํ•œ ์—๋””ํ„ฐ๋Š”? _ 31Atom โ€• ํ’๋ถ€ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋งค๋ ฅ _ 32

Atom์— ํ”Œ๋Ÿฌ๊ทธ์ธ ์ถ”๊ฐ€ _ 33

Sublime Text โ€• ํ™˜์ƒ์ ์ธ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๊ธฐ๋Šฅ์œผ๋กœ ์‚ฌ๋ž‘์— ๋น ์ง€๊ฒŒ ๋œ๋‹ค๋Š” ํ™”์ œ

์˜ ์—๋””ํ„ฐ _ 34Sublime Text์— ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ _ 35

Brackets โ€• HTML ํŽธ์ง‘์— ํŠนํ™”๋œ ๋น›๋‚˜๋Š” ์—๋””ํ„ฐ _ 36ํ€ต ํŽธ์ง‘ โ€• ํŽธ๋ฆฌํ•œ ์ธ๋ผ์ธ ์—๋””ํ„ฐ _ 37

ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ _ 38WebStorm โ€• ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ์— ํŠนํ™”๋œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ _ 39NetBeans โ€• ์ž๋ฐ”๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค์–‘ํ•œ ์›น ๊ฐœ๋ฐœ ์–ธ์–ด๋ฅผ ์ง€์› _ 40

์›น ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ 41

01์›นํŽ˜์ด์ง€๋‹ค์šด๋กœ๋“œ _ 42

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋‹ค์šด๋กœ๋“œ ๋ฐฉ๋ฒ• _ 42Node.js๋กœ ๋‹ค์šด๋กœ๋“œํ•ด ๋ณด์ž _ 42์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง _ 44Rhino/Narshon์œผ๋กœ ๋‹ค์šด๋กœ๋“œํ•ด ๋ณด๊ธฐ _ 46

02HTMLํ•ด์„(๋งํฌ์™€์ด๋ฏธ์ง€์ถ”์ถœ) _ 48

์Šคํฌ๋ž˜ํ•‘์ด๋ž€? _ 48cheerio-httpcli ๋ชจ๋“ˆ ์„ค์น˜ _ 48

HTML ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ _ 49HTML ํŒŒ์ผ์—์„œ ๋งํฌ ์ถ”์ถœ _ 51

์ƒ๋Œ€ URL์„ ์ ˆ๋Œ€ URL๋กœ ๋ณ€๊ฒฝ _ 53

2์žฅ์ œ

์ฐจ๋ก€vi

Page 7: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

์ด๋ฏธ์ง€ ํŒŒ์ผ ์ถ”์ถœ _ 55request ๋ชจ๋“ˆ ์‚ฌ์šฉ _ 57 ๋งํฌ๋œ ์ด๋ฏธ์ง€๋ฅผ ์ „๋ถ€ ๋‹ค์šด๋กœ๋“œ _ 58

03 ์‚ฌ์ดํŠธ๋ฅผํ†ต์งธ๋กœ๋‹ค์šด๋กœ๋“œ _ 61

ํ†ต์งธ๋กœ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ์ด์œ  _ 61๋งํฌ๋ฅผ ๋”ฐ๋ผ๋‹ค๋‹ˆ๋ฉฐ ๋‹ค์šด๋กœ๋“œํ•˜๊ธฐ _ 61

ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด ๋ณด์ž _ 62์žฌ๊ท€ ์ฒ˜๋ฆฌ๋ž€? _ 64 ์ƒ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋กœ ๋ณ€๊ฒฝ _ 66 Node.js์˜ ๋™๊ธฐ ํ•จ์ˆ˜์™€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜ _

66

04 XML/RSSํ•ด์„ _ 69

XML์ด๋ž€? _ 69XML์˜ ๊ตฌ์กฐ ํ™•์ธ _ 70

Node.js์—์„œ XML์„ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ• _ 71์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ XML์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ _ 74

RSS๋ž€? _ 76๊ธฐ์ƒ์ฒญ์˜ RSS ์ฝ๊ธฐ _ 76 ์ฃผ๊ฐ„๊ธฐ์ƒ์˜ˆ๋ณด RSS ์ทจ๋“ _ 78

XML/RSS ํŒŒ์‹ฑ์— cheerio-httpcli๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• _ 79

05 ์ •๊ธฐ์ ์œผ๋กœ๋‹ค์šด๋กœ๋“œ _ 82

์ •๊ธฐ์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ _ 82์ •๊ธฐ์ ์ธ ์‹คํ–‰์„ ์œ„ํ•œ ํžŒํŠธ _ 82

ํ™˜์œจ์˜ ๋ณ€๋™์„ ํ™•์ธํ•˜๋Š” API ์‚ฌ์šฉ _ 83๋ฆฌ๋ˆ…์Šค/Mac OS X์˜ ๊ฒฝ์šฐ _ 85

ํ•„์š”์— ๋”ฐ๋ผ nano ์—๋””ํ„ฐ๋ฅผ ์„ค์น˜ _ 85 cron ์„ค์ •์„ ์œ„ํ•œ crontab _ 86 ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์ฃผ์˜ _ 87

์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ฃผ์˜ _ 87 crontab ๋‹ค์–‘ํ•œ ์„ค์ • ๋ฐฉ๋ฒ• _ 88

์œˆ๋„์šฐ์˜ ๊ฒฝ์šฐ _ 90์‹ ๊ทœ ์ž‘์—… ๋งŒ๋“ค๊ธฐ _ 91

๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•œ ์›น์‚ฌ์ดํŠธ ํฌ๋กค๋ง 95

01 PhantomJS์™€CasperJS _ 96

PhantomJS์™€ CasperJS์— ๊ด€ํ•˜์—ฌ _ 96PhantomJS์— ๊ด€ํ•˜์—ฌ _ 97 CasperJS์— ๊ด€ํ•˜์—ฌ _ 97

PhantomJS์™€ CasperJS ์„ค์น˜ _ 98์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ์ด ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ _ 99

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ ํ”„๋กœ๊ทธ๋žจ _ 99ํ™”๋ฉด ์บก์ฒ˜ ํ”„๋กœ๊ทธ๋žจ _ 101

3์žฅ์ œ

์ฐจ๋ก€ vii

Page 8: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

ํ”Œ๋ฆฌ์ปค ์ด๋ฏธ์ง€ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์บก์ฒ˜ํ•˜๊ธฐ _ 103CasperJS์˜ ํ๋ฆ„ _ 104

์•„์ดํฐ์šฉ ์›น์‚ฌ์ดํŠธ ํ™”๋ฉด ์บก์ฒ˜ _ 105์ธ์ž๋กœ ์ง€์ •ํ•œ ํŽ˜์ด์ง€๋ฅผ ์บก์ฒ˜ํ•˜๋Š” ๋„๊ตฌ ์ž‘์„ฑ _ 106

02 ๋กœ๊ทธ์ธํ›„์˜๋ฐ์ดํ„ฐ๋ฅผ๋‹ค์šด๋กœ๋“œ _ 109

๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ _ 109ํ‹ฐ์Šคํ† ๋ฆฌ์— ๋กœ๊ทธ์ธํ•˜๊ธฐ _ 109๋งˆ์šฐ์Šค ํด๋ฆญ _ 113

03 DOMํŒŒ์‹ฑ๋ฐฉ๋ฒ•๊ณผCSS์„ ํƒ์ž _ 115

์›น ๋ธŒ๋ผ์šฐ์ €์˜ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ ์‚ฌ์šฉ๋ฒ• _ 115CSS ์„ ํƒ์ž ์ฟผ๋ฆฌ _ 116

CSS ์„ ํƒ์ž ์ง€์ • ๋ฐฉ๋ฒ• _ 118CSS ์„ ํƒ์ž ์‹ค์ „ํŽธ _ 120

CSS ์„ ํƒ์ž ํ€ด์ฆˆ _ 121

04 Electron์œผ๋กœ๋ฐ์Šคํฌํ†ฑ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž‘์„ฑ _ 124

Electron์ด๋ž€? _ 124์œ ์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ NW.js _ 125 Electron์˜ ์žฅ์ ๊ณผ ๋‹จ์  _ 126 ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ Œ๋”๋ง๋˜๋Š” ํŽ˜์ด

์ง€๋„ OK _ 126

Electron ์„ค์น˜ ๋ฐฉ๋ฒ• _ 127Electron์œผ๋กœ ๊ฐ„๋‹จํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“œ๋Š” ์ˆœ์„œ _ 127

์ˆœ์„œ 1: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ•„์š”ํ•œ ํŒŒ์ผ ์ค€๋น„ _ 127 ์ˆœ์„œ 2: Electron์„ ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ํ•จ๊ป˜ ์‹คํ–‰ _ 128

์ง์ ‘ ์ค€๋น„ํ•œ HTML์„ Electron์— ํ‘œ์‹œ _ 130๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค์™€ ๋ Œ๋”๋ง ํ”„๋กœ์„ธ์Šค ๊ฐ„์˜ ํ†ต์‹  _ 132

๋™๊ธฐ์ ์ธ IPC ํ†ต์‹  _ 133 ๋น„๋™๊ธฐ์ ์ธ IPC ํ†ต์‹  _ 134 IPC ํ†ต์‹ ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹ค์ œ ํ”„๋กœ๊ทธ๋žจ _

135

05 Electron์œผ๋กœ์Šคํฌ๋ฆฐ์บก์ฒ˜ _ 138

์Šคํฌ๋ฆฐ์ƒท์„ ์ฐ๋Š” ์ œ์ผ ๋น ๋ฅธ ๋ฐฉ๋ฒ• _ 138Electron์œผ๋กœ ์Šคํฌ๋ฆฐ์ƒท์„ ์ฐ๋Š” ๋ฐฉ๋ฒ• _ 138

์Šคํฌ๋ฆฐ์ƒท์„ ์ฐ๋Š” ํ”„๋กœ๊ทธ๋žจ _ 139 ๋งค์ผ ์˜คํ›„ ๋„ค์ด๋ฒ„ ๊ธˆ์œต ํŽ˜์ด์ง€๋ฅผ ์บก์ฒ˜ํ•˜์—ฌ ์ €์žฅ _ 141

๋ฏธ์„ธํ•œ ์กฐ์ •์„ ์œ„ํ•ด ๋”œ๋ ˆ์ด ์ฃผ๊ธฐ _ 142์บก์ฒ˜ํ•  ๋ฒ”์œ„๋ฅผ ์ง€์ • _ 144

์ฐจ๋ก€viii

Page 9: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐ ์ €์žฅ 147

01 ๋ฌธ์ž์ฝ”๋“œ์™€ํ˜ธํ™˜ _ 148

๋ฌธ์ž ์ฝ”๋“œ๋ž€? _ 148๋ฌธ์ž ์ฝ”๋“œ๊ฐ€ ์–ด๋ ค์šด ์ด์œ  _ 148 ํ˜„์žฌ์˜ ์ฃผ๋ฅ˜, ์œ ๋‹ˆ์ฝ”๋“œ _ 149 ๋ฌธ์ž ์ง‘ํ•ฉ๊ณผ ๋ฌธ์ž ๋ถ€ํ˜ธํ™” ์Šคํ‚ด _

149

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ฌธ์ž ์ฝ”๋“œ _ 150Node.js์˜ ๊ฒฝ์šฐ _ 150

Node.js์—์„œ ๋ฌธ์ž ์ฝ”๋“œ ๋ณ€ํ™˜ _ 151 ๋ฌธ์ž ์ฝ”๋“œ๋ฅผ ๋ชจ๋ฅด๋Š” ํ…์ŠคํŠธ๋ฅผ ์ฝ๋Š” ๊ฒฝ์šฐ _ 153

iconv-lite๋ฅผ ์‚ฌ์šฉํ•œ ๋ฌธ์ž ์ฝ”๋“œ ๋ณ€ํ™˜ _ 155Rhino๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ _ 156

02 ์ •๊ทœํ‘œํ˜„์‹์„์‚ฌ์šฉํ•œ๋ฐ์ดํ„ฐ๋ณ€ํ™˜ _ 157

์ •๊ทœ ํ‘œํ˜„์‹์ด๋ž€? _ 157์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ์˜ ์ •๊ทœ ํ‘œํ˜„์‹ ์‚ฌ์šฉ๋ฒ• _ 158

์ •๊ทœ ํ‘œํ˜„์‹ ๋ฉ”์†Œ๋“œ _ 158 RegExp.exec() ๋ฉ”์†Œ๋“œ _ 159 RegExp.test() ๋ฉ”์†Œ๋“œ _ 160 String.

match() ๋ฉ”์†Œ๋“œ _ 161 String.search() ๋ฉ”์†Œ๋“œ _ 162 String.replace() ๋ฉ”์†Œ๋“œ _ 163

03 ๋ฐ์ดํ„ฐํ˜•์‹์˜๊ธฐ์ดˆ _ 166

์›น์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ ํ˜•์‹ _ 166JSON ํ˜•์‹์ด๋ž€? _ 167JSON์˜ ๊ฐœ๋Ÿ‰ํŒ, JSON5 ํ˜•์‹ _ 170CSON ํ˜•์‹ _ 172XML/RSS ํ˜•์‹ _ 174

๋‰ด์Šค RSS ํŒŒ์‹ฑ _ 175

YAML ํ˜•์‹ _ 177Node.js๋กœ YAML ํ˜•์‹ ๋‹ค๋ฃจ๊ธฐ _ 180

INI ํŒŒ์ผ ํ˜•์‹ _ 181Node.js๋กœ INI ํŒŒ์ผ์„ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ• _ 182

CSV/TSV ํŒŒ์ผ ํ˜•์‹ _ 184Node.js๋กœ CSV ํŒŒ์ผ์„ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ• _ 186

๊ทธ ์™ธ์˜ ํ˜•์‹ _ 188

04 ์ปคํ”ผ์Šคํฌ๋ฆฝํŠธ _ 190

์™œ ์ปคํ”ผ์Šคํฌ๋ฆฝํŠธ์ธ๊ฐ€? _ 190์ปคํ”ผ์Šคํฌ๋ฆฝํŠธ ์„ค์น˜ _ 191ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ๋ฐฉ๋ฒ• _ 191์ปคํ”ผ์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ ๋ฌธ๋ฒ• _ 192

์ฃผ์„ ์ฒ˜๋ฆฌ _ 193 ์ œ์–ด ๊ตฌ๋ฌธ์€ ๋“ค์—ฌ์“ฐ๊ธฐ๋กœ ๋ ˆ๋ฒจ์„ ๋ช…์‹œ _ 193 ๋ณ€์ˆ˜ ์„ ์–ธ _ 194 ๋ฌธ์ž์—ด _ 194

4์žฅ์ œ

์ฐจ๋ก€ ix

Page 10: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

์ฐธ๊ณผ ๊ฑฐ์ง“ _ 195๋ฐฐ์—ด _ 196์—ฐ์‚ฐ์ž _ 197

๋ฒ”์œ„ ๋น„๊ต _ 198 ๋ณ€์ˆ˜์˜ ์กด์žฌ ์ฒดํฌ _ 198 ์—ฐ์†ํ•˜๋Š” ์ˆ˜์น˜์˜ ํ‘œํ˜„ โ€• ๋ฒ”์œ„ ์—ฐ์‚ฐ์ž โ€˜..โ€™ _ 199

์ œ์–ด ๊ตฌ๋ฌธ _ 199if..else.. _ 199 if..then..else _ 200 unless _ 200 switch..when..else _ 201

while/until _ 201 for..in/for..of _ 202

ํ•จ์ˆ˜ ์ž‘์„ฑ _ 203์ธ์ž์˜ ๊ธฐ๋ณธ๊ฐ’ _ 204 ๊ฐ€๋ณ€ ๊ธธ์ด ์ธ์ž _ 205 ๋ฌด๋ช… ํ•จ์ˆ˜(์ต๋ช… ํ•จ์ˆ˜) _ 206

๊ฐ์ฒด์ง€ํ–ฅ _ 206ํด๋ž˜์Šค ์ •์˜ _ 206 ์ƒ์† _ 207 ์ •์  ๋ฉค๋ฒ„ _ 208 ๋ฉค๋ฒ„๋ฅผ ๋™์ ์œผ๋กœ ์ถ”๊ฐ€ _ 209

05 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์‚ฌ์šฉ๋ฒ• _ 210

์™œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€? _ 210๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๊ณผ NoSQL _ 210๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค SQLite3 ์‚ฌ์šฉ _ 211์›น์œผ๋กœ๋ถ€ํ„ฐ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ SQLite์— ์ €์žฅ _ 213

SQLite์— ์ž‘ํ’ˆ์„ ์ €์žฅ _ 215

NoSQL LevelDB๋ฅผ ์‚ฌ์šฉ _ 217LevelDB์—์„œ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฒ• _ 219

๋ฐ์ดํ„ฐ๋ฅผ LevelDB์— ๋ณด๊ด€ _ 223

06 ๋ฆฌํฌํŠธ์ž๋™์ƒ์„ฑ _ 227

๋ฆฌํฌํŠธ ์ž๋™ ์ƒ์„ฑ _ 227๋ฆฌํฌํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ชฉ์ ์„ ๋ช…ํ™•ํžˆ ํ•˜์ž _ 227

์ถœ๋ ฅ ํ˜•์‹ _ 228๋ฆฌํฌํŠธ๋ฅผ ์›น์— ๊ณต๊ฐœํ•˜๋Š” ๊ฒฝ์šฐ _ 228 ๋ณธ์ธ์„ ์œ„ํ•œ ๋ฆฌํฌํŠธ ์ถœ๋ ฅ์˜ ๊ฒฝ์šฐ _ 228 ๋ฆฌํฌํŠธ๋ฅผ ์ธ์‡„ํ•˜๋Š”

๊ฒฝ์šฐ _ 229

PDF ์ž‘์„ฑ _ 230๊ฐ„๋‹จํžˆ PDF๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• _ 230 PhantomJS๋กœ HTML์„ PDF๋กœ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ• _ 230 PDFKit์„ ์ด์šฉํ•ด์„œ ์ถœ๋ ฅ _ 232 PDFKit์œผ๋กœ ๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆฌ๊ธฐ _ 235 PDFKit ๊ด€๋ จ ์ •๋ณด _ 238

์—‘์…€ ํ˜•์‹์œผ๋กœ ์ž‘์„ฑ _ 238Node.js + O๏ฟฝcegen ์‚ฌ์šฉ๋ฒ• _ 238Rhino์™€ Apache POI ์‚ฌ์šฉ๋ฒ• _ 239

๊ทธ ์™ธ์˜ ๋ฐฉ๋ฒ• _ 242

์›น API๋กœ ํš๋“ํ•œ ๊ฐ’์„ ์—‘์…€์— ์“ฐ๊ธฐ _ 242

์ฐจ๋ก€x

Page 11: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

ํ•œ๊ธ€ ํ˜•ํƒœ์†Œ ๋ถ„์„ 245

01 ํ˜•ํƒœ์†Œ๋ถ„์„์—๊ด€ํ•˜์—ฌ _ 246

ํ˜•ํƒœ์†Œ ๋ถ„์„์ด๋ž€? _ 246์–ด๋””์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? _ 247

ํ˜•ํƒœ์†Œ ๋ถ„์„์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• _ 247mecab-ko์˜ ์„ค์น˜ _ 248

์‹คํ–‰ ํ…Œ์ŠคํŠธ _ 249

02 ํŠน์ •ํ’ˆ์‚ฌ์˜๋‹จ์–ด๋“ค์„์ถ”์ถœ _ 251

Node.js์—์„œ mecab-ko๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• _ 251ํ”„๋กœ๊ทธ๋žจ์„ ์ •๋ฆฌํ•˜์—ฌ ํ˜•ํƒœ์†Œ ๋ถ„์„ ๋ชจ๋“ˆ ์ž‘์„ฑ _ 254

mecab-ko ๋ชจ๋“ˆ ์ž‘์„ฑ _ 255

ํŠน์ • ํ’ˆ์‚ฌ์˜ ๋‹จ์–ด๋“ค์„ ์ถ”์ถœํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ _ 257

03 ๋งˆ๋ฅด์ฝ”ํ”„์ฒด์ธ์„์ด์šฉํ•œ๋ฌธ์„œ์š”์•ฝ _ 260

๋งˆ๋ฅด์ฝ”ํ”„ ์ฒด์ธ์„ ์ด์šฉํ•œ ๋ฌธ์„œ ์š”์•ฝ _ 260๋งˆ๋ฅด์ฝ”ํ”„ ์ฒด์ธ์˜ ๊ตฌํ˜„ _ 261

ํ”„๋กœ๊ทธ๋žจ์— ๊ด€ํ•˜์—ฌ _ 264

04 ๊ฐ„๋‹จํ•œ๋ฌธ์žฅ๊ต์ •๋„๊ตฌ์ž‘์„ฑ _ 266

๋ฌธ์žฅ ๊ต์ • ๋„๊ตฌ์— ๊ด€ํ•˜์—ฌ _ 266๋งŒ๋“ค ํ”„๋กœ๊ทธ๋žจ _ 266 ์‹ค์ œ ํ”„๋กœ๊ทธ๋žจ _ 267 ํ”„๋กœ๊ทธ๋žจ์— ๊ด€ํ•˜์—ฌ _ 269

05 ๋‹จ์–ด์˜์ถœํ˜„๋นˆ๋„์กฐ์‚ฌ _ 271

๋‹จ์–ด์˜ ์ถœํ˜„ ๋นˆ๋„ ์กฐ์‚ฌ _ 271์กฐ์‚ฌ๋‚˜ ๊ตฌ๋‘์ ์„ ์ œ์™ธ _ 273 ํ”„๋กœ๊ทธ๋žจ์— ๊ด€ํ•˜์—ฌ _ 275

ํฌ๋กค๋ง์„ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ์†Œ์Šค 277

01 ์œ ์ตํ•œ๋ฐ์ดํ„ฐ์†Œ์Šค๋ชฉ๋ก _ 278

๋ฐ์ดํ„ฐ ์†Œ์Šค์— ๊ด€ํ•˜์—ฌ _ 278SNS์˜ ํ™œ์šฉ _ 278์†Œ์…œ ๋ถ๋งˆํฌ ํ™œ์šฉ _ 279์ƒํ’ˆ ์ •๋ณด ํ™œ์šฉ _ 279์˜จ๋ผ์ธ ์‚ฌ์ „์˜ ํ™œ์šฉ _ 280์˜คํ”„๋ผ์ธ ์‚ฌ์ „ ๋ฐ์ดํ„ฐ ํ™œ์šฉ _ 280๋ธ”๋กœ๊ทธ ์„œ๋น„์Šค ํ™œ์šฉ _ 281

5์žฅ์ œ

6์žฅ์ œ

์ฐจ๋ก€ xi

Page 12: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

์ผ๊ธฐ ์˜ˆ๋ณด, ๊ธฐ์ƒ ์ •๋ณด ํ™œ์šฉ _ 281์˜คํ”ˆ ๋ฐ์ดํ„ฐ ํ™œ์šฉ _ 282

02 ํŠธ์œ„ํ„ฐํฌ๋กค๋ง _ 283

ํŠธ์œ„ํ„ฐ๋ž€? _ 283ํŠธ์œ„ํ„ฐ API ์ค€๋น„ _ 283

twit ๋ชจ๋“ˆ ์„ค์น˜ _ 285 ํŠธ์œ„ํ„ฐ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ _ 286 ํŠธ์œ„ํ„ฐ API์˜ ์ œํ•œ _ 287

twit ๋ชจ๋“ˆ์— ๊ด€ํ•˜์—ฌ _ 288

03 ํŽ˜์ด์Šค๋ถ _ 289

ํŽ˜์ด์Šค๋ถ์ด๋ž€? _ 289ํŽ˜์ด์Šค๋ถ API _ 289

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹ ๊ทœ ์ž‘์„ฑ _ 290 fb ๋ชจ๋“ˆ ์„ค์น˜ _ 293 ํŽ˜์ด์Šค๋ถ์— ๋ณธ์ธ์ด ํˆฌ๊ณ ํ•œ ํฌ์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•˜

๋Š” ํ”„๋กœ๊ทธ๋žจ _ 293 ํ”ผ๋“œ์— ์ž„์˜์˜ ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๊ณ ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ _ 294

04 ๋„ค์ด๋ฒ„API์‚ฌ์šฉ _ 297

๋„ค์ด๋ฒ„ API _ 297์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ๋ก _ 297 ๋„ค์ด๋ฒ„ ๋ธ”๋กœ๊ทธ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ _ 299

05 ์•„๋งˆ์กดAPI์‚ฌ์šฉ _ 302

์•„๋งˆ์กด์˜ ์ƒํ’ˆ ์ •๋ณด _ 302API๋ฅผ ์œ„ํ•œ ๊ฐœ๋ฐœ์ž ๊ณ„์ • ์ƒ์„ฑ _ 303์•„๋งˆ์กด์˜ ๋„์„œ ์ •๋ณด ๊ฒ€์ƒ‰ _ 308

06 ํ”Œ๋ฆฌ์ปค์˜์‚ฌ์ง„๋‹ค์šด๋กœ๋“œ _ 311

ํ”Œ๋ฆฌ์ปค๋ž€? _ 311API ํ‚ค ํš๋“ _ 312ํ”Œ๋ฆฌ์ปค API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ œ์ž‘ _ 314

ํ”Œ๋ฆฌ์ปค์—์„œ ๊ณ ์–‘์ด๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ _ 314 URL์˜ ์‚ฌ์ง„์„ ๋‹ค์šด๋กœ๋“œ _ 316

07 ์œ ํŠœ๋ธŒ๋™์˜์ƒ๋‹ค์šด๋กœ๋“œ _ 319

์œ ํŠœ๋ธŒ๋ž€ ๋ฌด์—‡์ธ๊ฐ€? _ 319youtube-dl ์„ค์น˜ _ 320

youtube-dl ์‚ฌ์šฉ๋ฒ• _ 321 youtube-dl ์—…๋ฐ์ดํŠธ _ 321

์œ ํŠœ๋ธŒ ๊ฒ€์ƒ‰ _ 322์œ ํŠœ๋ธŒ API ํ‚ค ํš๋“ _ 322 Node.js ๋ชจ๋“ˆ youtube-node ์„ค์น˜ _ 324

์œ ํŠœ๋ธŒ ๊ฒ€์ƒ‰ ํ”„๋กœ๊ทธ๋žจ _ 324 ๊ฒ€์ƒ‰ ์˜ต์…˜ ์ง€์ • _ 326

๋™์˜์ƒ์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋‹ค์šด๋กœ๋“œ _ 328

์ฐจ๋ก€xii

Page 13: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

08 Yahoo!Finance์—์„œํ™˜์œจ๋ฐ์ฃผ์‹์ •๋ณด์ˆ˜์ง‘ _ 331

Yahoo! Finance _ 331FXยทํ™˜์œจ ์ •๋ณด ์ทจ๋“ _ 332

ํ™˜์œจ ์ •๋ณด๋ฅผ ์ทจ๋“ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ _ 333

์ฃผ๊ฐ€ ์ •๋ณด ์ทจ๋“ _ 336์ฃผ๊ฐ€ ์ •๋ณด๋ฅผ ์ทจ๋“ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ _ 337 HTML ์ถ”์ถœ ํŒ _ 338

09 ์œ„ํ‚คํ”ผ๋””์•„๋‹ค์šด๋กœ๋“œ _ 339

์œ„ํ‚คํ”ผ๋””์•„๋ž€? _ 339์œ„ํ‚คํ”ผ๋””์•„ ๋‹ค์šด๋กœ๋“œ _ 340 ๋ฐ์ดํ„ฐ ํ˜•์‹์— ๊ด€ํ•˜์—ฌ _ 341 ์š”์•ฝ ๋ฐ์ดํ„ฐ ์ด์šฉ _ 341 ํƒ€์ดํ‹€ ๋ชฉ๋ก

์ทจ๋“ _ 342

์œ„ํ‚คํ”ผ๋””์•„์˜ ํƒ€์ดํ‹€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งŒ๋“ค๊ธฐ _ 343ํƒ€์ดํ‹€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ™œ์šฉ _ 346

์ •๊ทœ ํ‘œํ˜„์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฒ€์ƒ‰ _ 348

๋ฐ์ดํ„ฐ์˜ ๋ถ„๋ฅ˜, ์˜ˆ์ธก๊ณผ ๋จธ์‹ ๋Ÿฌ๋‹ 351

01 ๋ฐ์ดํ„ฐ์˜ํ™œ์šฉ๋ฒ•์—๊ด€ํ•˜์—ฌ _ 352

๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ๊ฒƒ์ธ๊ฐ€? _ 352๋ฐ์ดํ„ฐ ๋งˆ์ด๋‹์ด๋ž€? _ 352๋ฐ์ดํ„ฐ ๋งˆ์ด๋‹์˜ ๊ธฐ๋ณธ์€ ์˜ˆ์ธก, ๋ถ„๋ฅ˜, ์—ฐ๊ด€ ๊ทœ์น™ ์ถ”์ถœ _ 353

์˜ˆ์ธก _ 353 ๋ถ„๋ฅ˜ _ 353 ์—ฐ๊ด€ ๊ทœ์น™ ์ถ”์ถœ _ 354

๋ฐ์ดํ„ฐ ๋งˆ์ด๋‹์˜ ์ˆœ์„œ _ 354๋Œ€ํ‘œ์ ์ธ ๋ฐ์ดํ„ฐ ๋งˆ์ด๋‹ ๊ธฐ๋ฒ• _ 355

02 ๋ฒ ์ด์ง€์•ˆํ•„ํ„ฐ๋ฅผํ™œ์šฉํ•œ๋ถ„๋ฅ˜ _ 356

๋ฒ ์ด์ง€์•ˆ ํ•„ํ„ฐ๋ž€? _ 356๋‚˜์ด๋ธŒ ๋ฒ ์ด์ฆˆ ๋ถ„๋ฅ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ _ 357

๋ฒ ์ด์ฆˆ์˜ ์ •๋ฆฌ _ 357 ๋‚˜์ด๋ธŒ ๋ฒ ์ด์ฆˆ ๋ถ„๋ฅ˜ _ 358

๋ฒ ์ด์ง€์•ˆ ํ•„ํ„ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ _ 359๋ฒ ์ด์ง€์•ˆ ํ•„ํ„ฐ๋กœ โ€˜์ด์ˆœ์‹ โ€™๊ณผ โ€˜์žฅ์˜์‹คโ€™์„ ํŒ์ • _ 359 bayes ๋ชจ๋“ˆ ์ฝ”๋“œ _ 361

03 ์ด๋™ํ‰๊ท ์„์ด์šฉํ•œ์˜ˆ์ธก๊ณผ๊ทธ๋ž˜ํ”„์ž‘์„ฑ _ 364

์ˆ˜์š” ์˜ˆ์ธก์— ๊ด€ํ•˜์—ฌ _ 364๋‹จ์ˆœ ์ด๋™ ํ‰๊ท ์— ๊ด€ํ•˜์—ฌ _ 365

๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆฌ๊ธฐ _ 365 ๊ณผ๊ฑฐ ๊ธฐ์ƒ ๋ฐ์ดํ„ฐ ๋‹ค์šด๋กœ๋“œ _ 367 ๊ธฐ์˜จ์˜ ์ด๋™ ํ‰๊ท ์„ ๊ณ„์‚ฐํ•˜๊ณ  ๊ทธ๋ž˜ํ”„๋กœ

ํ‘œ์‹œ _ 371

์ง€์ˆ˜ ํ‰ํ™œ๋ฒ•์— ๊ด€ํ•˜์—ฌ _ 374

7์žฅ์ œ

์ฐจ๋ก€ xiii

Page 14: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

๋‚ด์ผ์˜ ํ‰๊ท  ๊ธฐ์˜จ์„ ์˜ˆ์ธก _ 377

04 ์ฑ„ํŒ…๋ด‡๊ณผ๋Œ€ํ™”ํ•˜๊ธฐ _ 379

์ฑ„ํŒ… ๋ด‡ _ 379์ฑ„ํŒ… ๋ด‡์˜ ๊ตฌ์กฐ _ 380

์—ฌ๊ธฐ์„œ ๋งŒ๋“ค ์ฑ„ํŒ… ๋ด‡ _ 380๊ธฐ์ˆ ์  ์š”๊ฑด ์ •์˜ _ 381 ๋Œ€ํ™” ๊ตฌ์กฐ _ 381 ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ๋ฐฉ๋ฒ• _ 382 ๋Œ€ํ™” ์‚ฌ์ „ _ 384 ์ฑ„ํŒ… ๋ด‡

์˜ ํ™”๋ฉด _ 387 ์ฑ„ํŒ… ๋ด‡ ์„œ๋ฒ„ _ 389 ์ฑ„ํŒ… ๋ด‡์˜ ๋Œ€ํ™” ์ƒ์„ฑ ๋ชจ๋“ˆ _ 391

05 ์„œํฌํŠธ๋ฒกํ„ฐ๋จธ์‹ ์œผ๋กœ๋ฌธ์ž์ธ์‹(์ „ํŽธ) _ 395

์„œํฌํŠธ ๋ฒกํ„ฐ ๋จธ์‹ ์ด๋ž€? _ 395๋ฌธ์ž ์ธ์‹์— ๋„์ „ _ 397

SVM์—์„œ ํ•™์Šต ๋ชจ๋ธ์„ ๋งŒ๋“œ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค _ 397 ์ˆ˜๊ธฐ ์ˆซ์ž ๋ฐ์ดํ„ฐ ๋‹ค์šด๋กœ๋“œ _ 398 ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ด

ํ„ฐ๋ฅผ CSV๋กœ ๋ณ€ํ™˜ _ 399 node-svm ์„ค์น˜ _ 404 ํ•™์Šต์šฉ ๋ฐ์ดํ„ฐ ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ _ 404 SVM ํŒŒ์ผ

์„ ํ•™์Šต์‹œ์ผœ ๋ชจ๋ธ ์ƒ์„ฑ _ 406 ๋ถ„๋ฅ˜์˜ ์ •๋‹ต๋ฅ  ํ™•์ธ _ 407

06 ์„œํฌํŠธ๋ฒกํ„ฐ๋จธ์‹ ์œผ๋กœ๋ฌธ์ž์ธ์‹(ํ›„ํŽธ) _ 409

node-svm ์‚ฌ์šฉ๋ฒ• _ 409์†์œผ๋กœ ์“ด ๋ฌธ์ž๋ฅผ ์ธ์‹ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ๋งŒ๋“ค๊ธฐ _ 411

๋ฌธ์ž ์ธ์‹ ํ”„๋กœ๊ทธ๋žจ โ€• HTTP ์„œ๋ฒ„ _ 413 ๋ฌธ์ž ์ธ์‹ ํ”„๋กœ๊ทธ๋žจ โ€• ํด๋ผ์ด์–ธํŠธ HTML _ 414

์ž˜๋ชป ์ธ์‹ํ•˜๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ _ 420libsvm ์‚ฌ์šฉ _ 422

๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”์™€ ์‘์šฉ 427

01 ๊ตฌ๊ธ€์ฐจํŠธ๋ฅผ์ด์šฉํ•œ์ฐจํŠธ์ž‘์„ฑ _ 428

๊ตฌ๊ธ€ ์ฐจํŠธ๋ž€? _ 428ํŒŒ์ด ์ฐจํŠธ ๊ทธ๋ฆฌ๊ธฐ _ 429

ํŒŒ์ด ์ฐจํŠธ์˜ ์˜ต์…˜ ๋ณ€๊ฒฝํ•˜๊ธฐ _ 431

๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆฌ๊ธฐ _ 432๊ธฐ๋ณธ์ ์œผ๋กœ ์—‘์…€์—์„œ ๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค _ 434

์„  ๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆฌ๊ธฐ _ 434์ฐจํŠธ์˜ ์ข…๋ฅ˜์™€ ๋งค๋‰ด์–ผ _ 437

02 D3.js๋กœ์ž์œ ๋„๋†’์€์ฐจํŠธ์ž‘์„ฑ _ 440

D3.js โ€• ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ๋„ํ๋จผํŠธ ์ƒ์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ _ 440D3.js ์„ค์น˜ _ 441๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆฌ๊ธฐ _ 442

SVG์— ๊ด€ํ•˜์—ฌ _ 444

8์žฅ์ œ

์ฐจ๋ก€xiv

Page 15: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„์˜ ์Šค์ผ€์ผ ์ž๋™ ๊ณ„์‚ฐ _ 445๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„์— ๋ˆˆ๊ธˆ ๊ทธ๋ฆฌ๊ธฐ _ 446๊บพ์€์„  ๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆฌ๊ธฐ _ 449

03 D3.js๋กœ์ง€๋„๊ทธ๋ฆฌ๊ธฐ _ 455

์ง€๋„ ์ •๋ณด ๊ทธ๋ฆฌ๊ธฐ _ 455TopoJSON์œผ๋กœ ์ง€๋„ ๋ฐ์ดํ„ฐ ํ‘œ์‹œ _ 456์ง€๋„ ๋ฐ์ดํ„ฐ ๋‚ด๋ ค๋ฐ›๊ธฐ _ 456๋ฐ์ดํ„ฐ ํ˜•์‹ ๋ณ€ํ™˜ _ 457D3.js๋กœ ๋Œ€ํ•œ๋ฏผ๊ตญ ์ง€๋„ ๊ทธ๋ฆฌ๊ธฐ _ 459

04 D3.js์—์„œํŒŒ์ƒ๋œ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ _ 463

D3.js๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐœ๋ฐœ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ _ 463NVD3.js์— ๊ด€ํ•˜์—ฌ _ 464

NVD3.js๋กœ ๋„๋„› ์ฐจํŠธ ๊ทธ๋ฆฌ๊ธฐ _ 465 NVD3.js๋กœ ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„ ๊ทธ๋ฆฌ๊ธฐ _ 467

C3.js ์‚ฌ์šฉํ•˜๊ธฐ _ 469C3.js๋กœ ๊ธฐ์˜จ ํ‘œ์‹œํ•˜๊ธฐ _ 471

์œˆ๋„์šฐ๋‚˜ Mac OS X์— ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ• 475

Node.js ์„ค์น˜ _ 476์œˆ๋„์šฐ์˜ ๊ฒฝ์šฐ _ 476 Mac OS X์˜ ๊ฒฝ์šฐ _ 476

Rhino ์„ค์น˜ _ 478์œˆ๋„์šฐ์˜ ๊ฒฝ์šฐ _ 478 Mac OS X์˜ ๊ฒฝ์šฐ _ 480

Nashorn ์„ค์น˜ _ 480์œˆ๋„์šฐ์˜ ๊ฒฝ์šฐ _ 480 Mac OS X์˜ ๊ฒฝ์šฐ _ 481

HTML/XML์˜ PATH ํŒŒ์‹ฑ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ˆ˜ํ–‰ 483

cheerio์™€ cheerio-httpcli์— ๊ด€ํ•˜์—ฌ _ 484

๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ ๋ฐฉ๋ฒ• _ 484

์ทจ๋“ํ•œ ์š”์†Œ์˜ ์ž์‹ ์š”์†Œ ๊ฒ€์ƒ‰ํ•˜๊ธฐ _ 485

์†์„ฑ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ _ 487

์ž์‹ ์š”์†Œ ๋ฐ‘์˜ ํƒœ๊ทธ ๊ฒ€์ƒ‰ํ•˜๊ธฐ _ 488

ํ…Œ์ด๋ธ” ๋‚ด์˜ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ _ 489cheerio ๋งˆ๋ฌด๋ฆฌ _ 490

์ฐพ์•„๋ณด๊ธฐ 492

1๋ถ€๋ก

2๋ถ€๋ก

์ฐจ๋ก€ xv

Page 16: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

Node.js๋ผ๊ณ  ํ•˜๋ฉด ๊ฒฝ๋Ÿ‰ ์›น ์„œ๋ฒ„๋ฅผ ๋งŽ์ด ๋– ์˜ฌ๋ฆฐ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์›น ํŽ˜์ด์ง€๋ฅผ ๊พธ๋ฏธ๋Š”

์–ธ์–ด ์ •๋„๋กœ ์ƒ๊ฐํ•˜๋Š” ์‚ฌ๋žŒ์ด ์•„์ง ์žˆ์„์ง€๋„ ๋ชจ๋ฅด๊ฒ ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ Node.js ํ˜•์ œ

๋Š” ๋งŒ๋Šฅ ์–ธ์–ด๋กœ ์ ์  ์กฐ๋ช…์„ ๋ฐ›์œผ๋ฉฐ ์ž๋ผ๋‚˜๊ณ  ์žˆ๋‹ค. npm์ด๋ผ๋Š” ๋“ ๋“ ํ•œ ์ง€์›๊ตฐ์— ํž˜์ž…์–ด ์›ํ•˜

๋Š” ๊ธฐ๋Šฅ์„ ๋น ๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด ๋„ˆ๋ฌด๋‚˜๋„ ํŽธ๋ฆฌํ•œ ์–ธ์–ด๋‹ค. ์ž˜ ์•Œ์•„ ๋‘๋ฉด ์›น ์„œ๋ฒ„, ๋ฐฐ์น˜ ํ”„๋กœ

๊ทธ๋žจ์„ ํšจ๊ณผ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ MongoDB, ์—˜๋ผ์Šคํ‹ฑ์„œ์น˜ ๋“ฑ์„ ๋‹ค๋ฃฐ ๋•Œ๋„ ์ง๊ฐ„

์ ‘์ ์œผ๋กœ ๋„์›€์ด ๋œ๋‹ค.

์ด ์ฑ…์€ ์ผ๋ณธ ์—ฌํ–‰ ์ค‘ ์šฐ์—ฐํžˆ ์„œ์ ์—์„œ ๋งˆ์ฃผ์ณค๋˜ ์ฑ…์ด๋‹ค. ๋งˆ์นจ ํšŒ์‚ฌ์˜ ๋น… ๋ฐ์ดํ„ฐ ๋ถ„์„์„ ๋‹ด๋‹น

ํ•˜๋Š” ํŒ€์—์„œ ํฌ๋กค๋ง ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์—ˆ์œผ๋ฏ€๋กœ ์ž์—ฐ์Šค๋ ˆ ์ง‘์–ด ๋“ค๊ฒŒ ๋˜์—ˆ๋‹ค. ์ฑ…์„ ๋„˜๊ธฐ๋ฉด

์„œ ๋„์›€์ด ๋  ๋งŒํ•œ ๋‚ด์šฉ์„ ์Šค๋งˆํŠธํฐ์œผ๋กœ ์ฐ๋‹ค ๋ณด๋‹ˆ ๋ช‡์‹ญ ์žฅ์ด ๋˜์—ˆ๊ณ , ์—ฌํ–‰ ์ค‘์ด๋ผ ๋ˆ๋„ ๋ถ€์กฑ

ํ•˜๊ณ  ์ง๋„ ๋ฌด๊ฑฐ์› ๋Š”๋ฐ ์ ์  ์ด ์ฑ…์„ ๊ตฌ๋งคํ•ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ๋งŒ์ด ๋จธ๋ฆฟ์†์— ๊ฐ€๋“ํ•ด์กŒ๋‹ค.

์—ฌํ–‰์—์„œ ๋Œ์•„์™€ ์ฑ…์„ ์ฝ์–ด ๋ณด๋‹ˆ ํ˜ผ์ž ๋ณด๊ธฐ ์•„๊นŒ์šธ ์ •๋„๋กœ ๋‚ด์šฉ์ด ์ข‹์•˜๋‹ค. IT ๋„์„œ๋Š” ์–ด๋ ค์šด

์ฑ…๋„ ๋งŽ์€๋ฐ ์ด ์ฑ…์€ ์–ด๋ ต์ง€๊ฐ€ ์•Š์•˜๊ณ , ์˜ˆ์ œ๋ฅผ ๋”ฐ๋ผ ํ•˜๋ฉฐ ์„ค๋ช…์„ ์ฝ์œผ๋‹ˆ ์ž์—ฐ์Šค๋ ˆ ์ดํ•ด๊ฐ€ ๋˜

์—ˆ๋‹ค. ์‰ฝ๊ฒŒ ์ฝํžˆ๋ฉด์„œ๋„ ๋‹ค๋ฃจ๋Š” ๋‚ด์šฉ์€ ์ •๋ง ์‹ค์šฉ์ ์ด๊ณ  ํŽธ๋ฆฌํ•œ ๊ฒƒ๋“ค์ด๋‹ค. ์ด ์ฑ…์—์„œ ๋‹ค๋ฃจ๋Š”

Vagrant, Electron, Phantomjs ๋“ฑ์„ ์ฝ์–ด ๋ณด๋ฉด ๊ฐ€์Šด์ด ๋‘๊ทผ๊ฑฐ๋ฆด ์ •๋„๋กœ ํŽธ๋ฆฌํ•˜๊ณ  ์ข‹์€ ๋„๊ตฌ๋“ค

์ด๋‹ค. ํŠนํžˆ, ์†Œํ”„ํŠธ์›จ์–ด ์Šคํƒ€ํŠธ์—…์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์€ ์ด ์ฑ…์˜ ๋งŽ์€ ๋ถ€๋ถ„์—์„œ ํฅ๋ถ„ํ• ์ง€๋„

๋ชจ๋ฅด๊ฒ ๋‹ค.

์ตœ์‹  ๊ธฐ์ˆ ๋“ค์„ ์‰ฝ๊ฒŒ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๊ณ , ๊ดœ์ฐฎ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ…Œํฌ๋‹‰๋„ ์ผ๋ถ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ

์ด ์ฑ…์€ ์–ธ์–ด์™€ ์ƒ๊ด€์—†์ด ์ดˆ๊ธ‰์—์„œ ์ค‘๊ธ‰ ์ˆ˜์ค€์˜ ๋…์ž๊ฐ€ ์ฝ์œผ๋ฉด ๋ฐ˜๋“œ์‹œ ํฐ ๋„์›€์ด ๋  ์ฑ…์ด๋‹ค.

์ข‹์€ ์ฑ…์„ ๊ณต์œ ํ•˜๊ณ  ์‹ถ๋‹ค๋Š” ์ˆœ์ˆ˜ํ•œ ์ผ๋… ํ•˜๋‚˜๋กœ ๋จผ์ € ๋ฒˆ์—ญ ์ œ์•ˆ์„ ํ–ˆ๋Š”๋ฐ, ์—ด๋ฆฐ ๋งˆ์Œ์œผ๋กœ ๊ฒ€

ํ† ํ•ด ์ฃผ์‹œ๊ณ  ๊ธฐํšŒ๋ฅผ ์ฃผ์‹  ์ œ์ดํŽ ์ถœํŒ์‚ฌ ๊ด€๊ณ„์ž๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ์˜ ๋ง์”€์„ ์ „ํ•˜๊ณ  ์‹ถ๋‹ค.

์˜ฎ๊ธด์ด ๋จธ๋ฆฌ๋ง

์˜ฎ๊ธด์ด ๋จธ๋ฆฌ๋งxvi

Page 17: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

๋งˆ์ง€๋ง‰์œผ๋กœ, ์ข‹์€ ์ทจ๋ฏธ ํ•˜๋‚˜๋ฅผ ์ œ์•ˆํ•˜๊ณ  ์‹ถ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ , ๋ถ„์„ํ•˜๊ณ , ๊ฐ€์‹œํ™”

ํ•˜๋Š” ์ทจ๋ฏธ๋‹ค. ์ž˜ํ•˜๋ฉด ๊ดœ์ฐฎ์€ ์ธ์‚ฌ์ดํŠธ๋ฅผ ์–ป์„ ์ˆ˜๋„ ์žˆ๊ณ , ํ™œ์šฉํ•˜๊ธฐ์— ๋”ฐ๋ผ ์ˆ˜์ต์ด ๋‚ ์ง€๋„ ๋ชจ

๋ฅธ๋‹ค. ์ ์–ด๋„ ์žฌ๋ฏธ์™€ ํ•จ๊ป˜ ์—ฌ๋Ÿฌ ๊ธฐ์ˆ ๋“ค์„ ์Šต๋“ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๋ฐ”๋กœ ์ด ์ฑ…์œผ๋กœ ์‹œ์ž‘ํ•  ์ˆ˜

์žˆ๋‹ค. ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๋ถ€ํ„ฐ ๋จธ์‹ ๋Ÿฌ๋‹์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ์‰ฝ๊ณ  ์žฌ๋ฏธ์žˆ๊ฒŒ ์ž…๋ฌธํ•˜๊ณ  ์‹ถ์€ ๋ถ„๋“ค๊ป˜ ์ด ์ฑ…์„

์ถ”์ฒœํ•œ๋‹ค.

์˜ฎ๊ธด์ด ์ด๋™๊ทœ

์˜ฎ๊ธด์ด ๋จธ๋ฆฌ๋ง xvii

Page 18: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

์ด ์ฑ…์€ ๋‹ค์–‘ํ•œ ์—์ด์ „ํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์ž๋™ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋‹ค๋ฃฌ๋‹ค. ์›น์ƒ์—๋Š”

์œ ์ตํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ€๋“ํ•˜๋‹ค. ๊ทธ๋Ÿฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ์ˆ˜์ง‘ํ•˜์—ฌ ๋ถ„์„ํ•˜๊ณ  ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์€

์žฌ๋ฏธ์žˆ๋Š” ์ทจ๋ฏธ๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๊ณ  ์—…๋ฌด์—๋„ ๋„์›€์ด ๋œ๋‹ค. ์ด ์ฑ…์—์„œ๋Š” ์›น์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜

๋Š” ๋ฐฉ๋ฒ•๊ณผ ๊ทธ๊ฒƒ๋“ค์„ ์ •๋ฆฌํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•œ๋‹ค.

์ด ์ฑ…์„ ํ†ตํ•ด ์›น ์‚ฌ์ดํŠธ๋ฅผ ์ˆœํšŒํ•˜๋Š” ํฌ๋กค๋Ÿฌ๋ฅผ ๋งŒ๋“ค์–ด ๋ณธ์ธ๋งŒ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ตฌ์ถ•ํ•ด ๋ณผ ์ˆ˜

์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ๋ชจ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ™œ์šฉํ•˜์ง€ ์•Š๊ณ  ์ž ๋“ค๊ฒŒ ๋†”๋‘๊ธฐ์—๋Š” ์•„๊น๋‹ค. ๊ทธ๋ž˜์„œ

์ด ์ฑ…์—์„œ๋Š” ํฌ๋กค๋ง์„ ํ†ตํ•œ ์ˆ˜์ง‘๋งŒ์„ ๋‹ค๋ฃจ๋Š” ๋ฐ ๊ทธ์น˜์ง€ ์•Š๊ณ , ์ž์‹ ์ด ์„ ํ˜ธํ•˜๋Š” ๊ธฐ์‚ฌ๋ฅผ ๊บผ๋‚ด๊ฑฐ

๋‚˜, ์ผ์ •ํ•œ ๊ทœ์น™์œผ๋กœ ์ž๋™ ๋ถ„๋ฅ˜ํ•˜๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์™€ ์กฐํ•ฉํ•˜๋Š” ๋“ฑ ํ•œ ๊ฑธ์Œ ๋” ๋‚˜์•„๊ฐ„ ํ™œ์šฉ๋ฒ•

์„ ์ œ์•ˆํ•œ๋‹ค. ํŠธ๋ Œ๋“œ๋ฅผ ์กฐ์‚ฌํ•˜์—ฌ ์ฃผ์‹๊ณผ FX์˜ ํŠธ๋ ˆ์ด๋“œ์— ์ฐธ๊ณ ํ•˜๊ฑฐ๋‚˜, ๊ด‘๊ณ  ์ˆ˜์ต์— ํ™œ์šฉํ•˜๊ฑฐ

๋‚˜, ๋ณด๊ณ ์„œ์˜ ์ž๋™ ์ž‘์„ฑ ๋ฐ ๋ฌธ์žฅ ์š”์•ฝ๊ณผ ์žฌ์ž‘์„ฑ ๋“ฑ ๋‹ค์–‘ํ•œ ์‘์šฉ์„ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ ์›น์„ ๋Œ€ํ‘œํ•˜๋Š” ์–ธ์–ด์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ์ˆ˜์ •ํ•˜๊ธฐ์—

๋„ ์‰ฌ์šธ ๊ฒƒ์ด๋‹ค. ์ด ์ฑ…์—์„œ ์†Œ๊ฐœํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‚˜ ํ”„๋กœ๊ทธ๋žจ์€ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋„ ๋งŽ์ง€

๋งŒ, ์•ฝ๊ฐ„ ์†์„ ๋ด„์œผ๋กœ์จ ๋ณด๋‹ค ์‹ค์šฉ์ ์ธ ํˆด์ด ๋  ์ˆ˜ ์žˆ๋‹ค. ์ด ์ฑ…์—์„œ ์†Œ๊ฐœํ•˜๋Š” ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ

๋กœ ์›น์ด๋‚˜ ์—…๋ฌด ์† ๋ฐ์ดํ„ฐ์— ๋ฌปํ˜€ ์žˆ๋Š” ๋ณด๋ฌผ์„ ๋ฐœ๊ตดํ•˜๊ธฐ ๋ฐ”๋ž€๋‹ค.

์ด ์ฑ…์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ์„ ์•Œ๊ณ  ์žˆ๋Š” ๋…์ž๋‚˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ค‘๊ธ‰์ž๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•œ๋‹ค. ์ž๋ฐ”

์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ชจ๋ฅด๋Š” ๋…์ž๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฌธ๋ฒ•์„ ๋งˆ์Šคํ„ฐํ•˜๊ณ  ๋‚œ ํ›„์— ์ฝ์œผ๋ฉด ๋‚ด์šฉ์„ ๋”์šฑ ์‰ฝ๊ฒŒ ์ด

ํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์ง€์€์ด ์ฟ ์ง€๋ผ ํžˆ์ฝ”์šฐ์ฆˆ์ฟ ์—

๋จธ๋ฆฌ๋ง

๋จธ๋ฆฌ๋งxviii

Page 19: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

์ด ์ฑ…์˜ ์ง€๋ฉด์—์„œ๋Š” ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋‹ด๊ณ  ์žˆ์ง€๋งŒ, ์ง€๋ฉด ๊ด€๊ณ„์ƒ ์ผ๋ถ€๋ฅผ ์ƒ๋žตํ•œ ๊ฒƒ์ด ์žˆ๋‹ค. ์†Œ์Šค ์ฝ”

๋“œ๋Š” ๋‹ค์Œ ์‚ฌ์ดํŠธ์—์„œ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์šด๋กœ๋“œ URL์€ ๋‹ค์Œ์„ ์ฐธ๊ณ ํ•˜์ž.

ํ”„๋กœ๊ทธ๋žจ ๋‹ค์šด๋กœ๋“œ ๋ฐฉ๋ฒ•

๋‹ค์Œ์˜ ์ œ์ดํŽ ์›น ํฌ๋กค๋Ÿฌ GitHub ํŽ˜์ด์ง€์—์„œ ํ•ด๋‹น ๋„์„œ์˜ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋‹ค์šด๋ฐ›์œผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์›น ํฌ๋กค๋Ÿฌ GitHub ํŽ˜์ด์ง€

URL https://github.com/Jpub/JSWebCrawler

์ด ์ฑ…์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

์†Œ์Šค๋“ค์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ ์ด๋ฆ„๊ณผ ํŒŒ์ผ ์ด๋ฆ„

์†Œ์Šค(์ง€๋ฉด ๊ด€๊ณ„์ƒ ์ผ๋ถ€ ์ƒ๋žต๋˜์–ด

์žˆ๊ธฐ๋„ ํ•จ)

์‹คํ–‰ ๊ฒฐ๊ณผ

์ ˆ์˜ ๋งˆ๋ฌด๋ฆฌ

์†Œ์Šค(์ง€๋ฉด ๊ด€๊ณ„์ƒ ์ผ๋ถ€ ์ƒ๋žต๋˜์–ด

์žˆ๊ธฐ๋„ ํ•จ)

์ด ์ฑ…์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ• xix

Page 20: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

ํ—ˆ์ฐฌ์ˆœ(์‚ผ์„ฑ์ „์ž)

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋„ ๊ฒฐ๊ตญ์€ ๋„๊ตฌ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋„๊ตฌ์˜ ๊ฐ€์น˜๋Š” ๋„๊ตฌ ์Šค์Šค๋กœ๊ฐ€ ๊ฐ–๋Š” ๊ธฐ๋Šฅ๋„

์˜ํ–ฅ์„ ๋ฏธ์น˜๊ฒ ์ง€๋งŒ, ๊ถ๊ทน์ ์œผ๋กœ๋Š” ์™„์„ฑ๋œ ๊ฒฐ๊ณผ์— ์˜ํ•ด ๊ฒฐ์ •๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋งฅ๋ฝ์—์„œ

์ด ์ฑ…์€ ๋„๊ตฌ๋ฅผ ์ด์šฉํ•ด ์™„์„ฑ๋œ ๊ฒฐ๊ณผ๋ฌผ, ์‚ฐ์ถœ๋ฌผ์„ ๋งŒ๋“ค์–ด ๊ฐ€๋Š” ์‚ฌ๊ณ  ๊ณผ์ •๊ณผ ๊ทธ์™€ ๊ด€๋ จ๋œ ๋ถ€๊ฐ€

์ ์ธ ๊ณผ์ •๋“ค์„ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์•˜์Šต๋‹ˆ๋‹ค.

๊น€์ธ์ˆ™(๊ฐ€๋น„์•„)

์ด ์ฑ…์€ Node.JS๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐ€์ƒํ™˜๊ฒฝ ์„ค์ •์„ ์œ„ํ•œ Vagrant, ๋‹ค์–‘ํ•œ ์›น ํฌ๋กค๋ง ๊ธฐ๋ฒ•, ํ•œ๊ธ€ ํ˜•

ํƒœ์†Œ ๋ถ„์„ ๋“ฑ ๋งŽ์€ ๋‚ด์šฉ์„ ๋‹ค๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณด๋‹ค๊ฐ€ ์ด๊ฑด ํ† ์ด ํ”„๋กœ์ ํŠธ๋กœ ๋ฐœ์ „์‹œํ‚ค๋ฉด ์žฌ๋ฐŒ๊ฒ 

๋‹ค๊ณ  ์ƒ๊ฐํ•œ ๋‚ด์šฉ์ด ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ์ € ์ฝ๊ธฐ๋งŒ ํ•˜์ง€ ๋งˆ์‹œ๊ณ  ๋ฐ˜๋“œ์‹œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด์„ธ์š”.

์ด๋ณด๋ผ(์•„์ฃผ๋Œ€ํ•™๊ต ์†Œํ”„ํŠธ์›จ์–ด ํŠน์„ฑํ™”๋Œ€ํ•™์› ์„์‚ฌ๊ณผ์ •)

์ด ์ฑ…์€ ํฌ๋กค๋Ÿฌ๋ถ€ํ„ฐ ์ฑ—๋ด‡๊นŒ์ง€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ Node.js๋ฅผ ์ด์šฉํ•ด ์‘์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ

๋“ค์„ ์†Œ๊ฐœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์ฑ…์˜ ๊ฐ€์žฅ ์ข‹์€ ์ ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ๋ชจ๋“ˆ ๋“ฑ์„ ์—„์„ ํ•ด์„œ ์†Œ๊ฐœํ•œ

๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ Node.js ์ž…๋ฌธ์„œ๋ฅผ ๋‹ค ์ฝ๊ณ , ๋˜ ๋ญ˜ ๋งŒ๋“ค์–ด ๋ณผ๊นŒ ๊ณ ๋ฏผํ•˜๋Š” ๊ฐœ๋ฐœ

์ž์—๊ฒŒ ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋„์„œ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ถ„๋“ค๋„ ์‹ค์Šต์„ ๋”ฐ๋ผ ํ•ด๋ณด์‹œ๋ฉด ๋– ์˜ค๋ฅด๋Š” ๋‹ค์–‘ํ•œ ํ”„๋กœ์ 

ํŠธ ์•„์ด๋””์–ด๋ฅผ ๊ตฌํ˜„ํ•ด ๋ณด๊ณ ์ž ํ•˜๋Š” ์š•๊ตฌ๊ฐ€ ์ƒ˜์†Ÿ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฒ ํƒ€๋ฆฌ๋” ํ›„๊ธฐ

๋ฒ ํƒ€๋ฆฌ๋” ํ›„๊ธฐxx

Page 21: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

๊น€์šฉํ˜„(๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ MVP)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ํ•ซ ์ด์Šˆ์ธ ์ปคํ”ผ์Šคํฌ๋ฆฝํŠธ, ์›น ํฌ๋กค๋ง, ์›น ์ž๋™ํ™” ํ…Œ์ŠคํŒ…์œผ๋กœ ์ด์–ด

์ง€๋”๋‹ˆ SVM์— ๋จธ์‹ ๋Ÿฌ๋‹์„ ๋‹ค๋ฃจ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋‹จ์›์ด ์˜ด๋‹ˆ๋ฒ„์Šค์‹์˜ ๋‹จ์ˆœ ์„ค๋ช…์ด ์•„๋‹ˆ๋ผ ์ •

ํ™•ํ•˜๊ณ  ๋†€๋ผ์šธ ๋งŒํผ ๋…์ž๊ฐ€ ๊ถ๊ธˆํ•ดํ•˜๊ณ  ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ฑ…์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋”ฐ๋ผ ํ•˜๋‹ค

๋ณด๋ฉด ์–ด๋Š์ƒˆ ์ตœ์‹  IT ํ๋ฆ„๋ณด๋‹ค ์•ž์„  ๊ฒฝํ—˜์„ ์–ป๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. node.js๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ

์„๊นŒ ๋”๋Š” ๊ณ ๋ฏผํ•  ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ์ € ์ด ์ฑ…์„ ํŽผ์น˜์„ธ์š”!

์ œ์ดํŽ์€ ์ฑ…์— ๋Œ€ํ•œ ์• ์ •๊ณผ ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ์—ด์ •์ด ๋œจ๊ฑฐ์šด ๋ฒ ํƒ€๋ฆฌ๋”๋“ค๋กœ ํ•˜์—ฌ๊ธˆ ์ถœ๊ฐ„๋˜๋Š” ๋ชจ๋“  ์„œ์ ์— ์‚ฌ์ „ ๊ฒ€์ฆ์„ ์‹œํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Beta Readers...

๋ฒ ํƒ€๋ฆฌ๋” ํ›„๊ธฐ xxi

Page 22: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique
Page 23: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

๊ฐœ๋ฐœ ํ™˜๊ฒฝ

1์žฅ์—์„œ๋Š” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์— ๊ด€ํ•ด ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

(JavaScript)๋Š” ์šด์˜์ฒด์ œ๋ฅผ ๊ฐ€๋ฆฌ์ง€ ์•Š๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ

์ ์ด ์žˆ์ง€๋งŒ, ์—ฌ๊ธฐ์„œ๋Š” ๊ฐ€์ƒ ๋จธ์‹ ์„ ์ด์šฉํ•˜์—ฌ ๋”์šฑ ํŽธ๋ฆฌํ•˜๊ฒŒ

๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณผ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„

์— ๊ด€ํ•ด ์•Œ์•„๋ณด๊ณ , ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋†’์—ฌ ์ค„ ์ตœ์‹  ์—๋””ํ„ฐ๋ฅผ ์†Œ

๊ฐœํ•  ์˜ˆ์ •์ด๋‹ค. ๋ณธ๊ฒฉ์ ์ธ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๊ณผ ๋ถ„์„์ด๋ผ๋Š” ์žฌ๋ฏธ์žˆ

๋Š” ๋ณด๋ฌผ์ฐพ๊ธฐ๋ฅผ ๋– ๋‚˜๊ธฐ ์ „์— ์žฅ๋น„๋ถ€ํ„ฐ ๋จผ์ € ๊ฐ–์ถ”์ž.

1์žฅ์ œ

Page 24: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

ECMAScript๊ฐ€ ์‹คํ˜„ํ•œ ๋ฒ”์šฉ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์„ธ๊ณ„

ECMAScript๋Š” Ecma International์— ์˜ํ•ด ํ‘œ์ค€ํ™”๋œ ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด์˜ ๋ช…์„ธ์„œ๋‹ค. ์ด ๋ช…์„ธ์„œ๋Š”

์›น ๋ธŒ๋ผ์šฐ์ €๋ณ„๋กœ ๋‹ฌ๋ž๋˜ ํด๋ผ์ด์–ธํŠธ ๊ธฐ๋ฐ˜ ์Šคํฌ๋ฆฝํŠธ์˜ ๊ตฌํ˜„์„ ํ‘œ์ค€ํ™”์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ๋‹ค.

์ดํ›„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ISO/IEC JTC 1, ISO/IEC 16262๋กœ ํ‘œ์ค€ํ™”๋˜์—ˆ๋‹ค. 2016๋…„ 11์›” ํ˜„์žฌ ์ตœ์‹ 

๋ฒ„์ „์€ 7๋กœ, โ€˜The Seventh Editionโ€™์ด๋ผ ๋ถ€๋ฅด๋ฉฐ, ์ด๋Ÿฌํ•œ ํ‘œ์ค€ํ™” ๋•์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฐœ๋ฐœ ์–ธ์–ด

๋กœ์„œ์˜ ์ง€์œ„๋ฅผ ์ ์ฐจ ๋†’์ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์•ž์œผ๋กœ ๋‚˜์˜ฌ ๋ฒ„์ „ 8์—๋Š” ๋™์‹œ์„ฑ ์ง€์›, CPU ๋ช…๋ น์–ด ์„ธํŠธ

๋ฅผ ์ด์šฉํ•œ ๋ณ‘๋ ฌ ๊ณ„์‚ฐ ๋“ฑ์œผ๋กœ ์„ฑ๋Šฅ์ด ๋”์šฑ ํ–ฅ์ƒ๋  ์˜ˆ์ •์ด๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €๋ผ๋Š” ์ œ์•ฝ์„ ๋›ฐ์–ด๋„˜์–ด ๋‹ค์–‘ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋งคํฌ๋กœ ์–ธ์–ด๋กœ๋„

์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๊ฐ€ ํฌํ† ์ƒต(Photoshop)์ด๋‚˜ ์ผ๋Ÿฌ์ŠคํŠธ๋ ˆ์ดํ„ฐ(Illustrator)๋กœ ์œ ๋ช…ํ•œ ์–ด๋„

๋น„(Adobe)์˜ CC(Creative Cloud) ์‹œ๋ฆฌ์ฆˆ๋‹ค. ์ด๋“ค ์ œํ’ˆ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•ด ๊ฐ์ข… ์ž‘์—…์„ ์ž

๋™ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์œˆ๋„์šฐ(Windows)์—๋Š” ๊ธฐ๋ณธ์œผ๋กœ JScript ์—”์ง„์ด ํƒ‘์žฌ๋˜์–ด ์žˆ๋‹ค. ์ด๋ฅผ ์ด

์šฉํ•˜๋ฉด ์œˆ๋„์šฐ์˜ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์— ์ข€ ๋” ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

์ œ1์žฅ | ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

01์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์˜ ์ด๋ชจ์ €๋ชจ

์˜ˆ์ „์—๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋‚ฎ์€ ํ˜ธํ™˜์„ฑ์ด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ปค๋‹ค๋ž€ ๊ณ ๋ฏผ๊ฑฐ๋ฆฌ์˜€๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜„์žฌ๋Š” ๋Œ€๋ถ€๋ถ„ ํ‘œ์ค€ํ™”๋˜

์–ด์„œ ์›น ๋ธŒ๋ผ์šฐ์ €๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๋งŽ์€ ํ™˜๊ฒฝ์—์„œ๋„ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„

์— ๊ด€ํ•ด ์‚ดํŽด๋ณด๊ฒ ๋‹ค.

โ— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์˜ ํŠน์ง•

โ— ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์น˜ ๋ฐฉ๋ฒ•

์ฃผ์š” ํ•™์Šต ๋‚ด์šฉ

โ— Node.js โ— Rhino/Nashorn โ— JScript

์ฃผ์š” ๋„๊ตฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์ œ1์žฅ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ2

Page 25: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

๋”์šฑ์ด HTML5 ๋•์— ์Šค๋งˆํŠธํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋งˆ์ €๋„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

ํฐ๊ฐญ(PhoneGap) ํ”„๋ ˆ์ž„์›Œํฌ์ฒ˜๋Ÿผ HTML5๋กœ ๋งŒ๋“  ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋„ค์ดํ‹ฐ๋ธŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ

๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ์ˆ ์ด ๋ฐœ์ „ํ•˜์—ฌ ์„ฑ๋Šฅ์ƒ์˜ ๋ฌธ์ œ๋„ ์—†์–ด์ง€๊ณ  ์žˆ๋‹ค.

์ฆ‰, ์ด์ œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐฐ์šฐ๋ฉด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋ถ€ํ„ฐ ๋ฐ์Šคํฌํ†ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ

์ผ€์ด์…˜, ๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ ํ”„๋กœ๊ทธ๋žจ๊นŒ์ง€ ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๋Œ€

๊ฐ€ ๋œ ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฐฐ์šฐ๊ธฐ ์‰ฝ๊ณ , ์–ธ์–ด์˜ ์œ ์—ฐ์„ฑ์ด ๋†’์œผ๋ฉฐ, ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์—์„œ

์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ ๊ทธ ์ธ๊ธฐ๊ฐ€ ์ ์  ๋†’์•„์ง€๊ณ  ์žˆ๋‹ค.

IE(Internet

Explorer)์˜

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

ECMAScript์ž๋ฐ”

์Šคํฌ๋ฆฝํŠธ๋ฅผ

ํ‘œ์ค€ํ™”

๊ฐ ๋ธŒ๋ผ์šฐ์ €์˜

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

ํฌํ† ์ƒต์ด๋‚˜

์—๋””ํ„ฐ ๋“ฑ

๋งคํฌ๋กœ๋กœ์„œ์˜

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

Node.js/Rhino

๋“ฑ ๋ฒ”์šฉ์ ์ธ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

์—”์ง„

NN(Netscape

Navigator)์˜

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

โ–ฒ ํ‘œ์ค€ํ™”๋˜์–ด ๋‹ค์–‘ํ•œ ๊ณณ์—์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์˜ ์ด๋ชจ์ €๋ชจ

์ด ์ฑ…์—์„œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ํญ๋„“์€ ์ •๋ณด ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„

์†Œ๊ฐœํ•œ๋‹ค. ์ •๋ง๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋งŒ์œผ๋กœ ์ด๋Ÿฐ ๊ณ ๋„์˜ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ• ๊นŒ? ์ด๊ฒƒ์„

๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์‹คํ–‰ ์—”์ง„์˜ ํž˜์„ ๋นŒ๋ ค์•ผ ํ•œ๋‹ค.

๋›ฐ์–ด๋‚œ ํ™”๊ฐ€๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ถ“์œผ๋กœ ์บ”๋ฒ„์Šค์— ์•„๋ฆ„๋‹ต๊ฒŒ ์ฑ„์ƒ‰ํ•ด ๋‚˜๊ฐ€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„

๋„ ๊ทธ ์ข…๋ฅ˜๊ฐ€ ๋‹ค์–‘ํ•˜์—ฌ ๋ชฉ์ ์— ๋”ฐ๋ผ ๊ตฌ๋ถ„ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ณ ๋„์˜ ์ž‘์—…์„ ๋” ์งง์€ ์‹œ๊ฐ„์— ์ˆ˜

ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

01 ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์˜ ์ด๋ชจ์ €๋ชจ 3

Page 26: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

์ด ์ฑ…์—์„œ๋Š” ์ฃผ๋กœ Node.js(๋…ธ๋“œ์ œ์ด์—์Šค)๋ผ๋Š” ์‹คํ–‰ ์—”์ง„์„ ์ด์šฉํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์†Œ๊ฐœํ•  ๊ฒƒ์ด๋‹ค.

Node.js์˜ ํ™œ์šฉ๋„๋Š” ๋‹ค๋ฅธ ์–ด๋–ค ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„๋ณด๋‹ค๋„ ๋†’๋‹ค.

์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„

์›๋ž˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉ๋˜์—ˆ๋˜ ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝ

ํŠธ๋ผ๊ณ  ํ•˜๋ฉด ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ ์ธํ„ฐ๋„ท ์ต์Šคํ”Œ๋กœ๋Ÿฌ(Microsoft Internet Explorer)๋‚˜ ๋ชจ์งˆ๋ผ ํŒŒ์ด์–ดํญ

์Šค(Mozilla Firefox), ๊ตฌ๊ธ€ ํฌ๋กฌ(Google Chrome), ์• ํ”Œ ์‚ฌํŒŒ๋ฆฌ(Apple Safari) ๋“ฑ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ

์šฉ๋œ ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋ฅผ ๋งํ–ˆ๋‹ค. ์ด๋“ค ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ๊ณ ์†ํ™”๋˜์—ˆ๊ณ , ๋‹ค์–‘ํ•œ ์ฒ˜๋ฆฌ๋„ ๊ฐ€๋Šฅ

ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์›น ๋ธŒ๋ผ์šฐ์ €์— ํƒ‘์žฌ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ๋ธŒ๋ผ์šฐ์ € ์•ˆ์—์„œ๋งŒ ๋™์ž‘ํ• 

์ˆ˜ ์žˆ์–ด ์ œํ•œ์ด ๋งŽ์€ ๊ฒƒ๋„ ์‚ฌ์‹ค์ด๋‹ค. ๋กœ์ปฌ PC ์•ˆ์˜ ํŒŒ์ผ์„ ์ž์œ ๋กญ๊ฒŒ ์กฐ์ž‘ํ•  ์ˆ˜ ์—†๊ณ , ์›น ์„œ๋ฒ„

๋กœ ๋™์ž‘ํ•  ์ˆ˜๋„ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ์›น ๋ธŒ๋ผ์šฐ์ €์— ์˜์กดํ•˜์ง€ ์•Š์œผ๋ฉด์„œ๋„ ๋‹ค์–‘ํ•˜๊ฒŒ ์ด์šฉ

ํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด๋‹ค.

๊ณ ์† ์—”์ง„์—์„œ ํƒ„์ƒํ•œ Node.js

Node.js๋Š” ์›น ์„œ๋ฒ„์ฒ˜๋Ÿผ ๋„คํŠธ์›Œํฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•ด ๊ฐœ๋ฐœ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ํ™˜๊ฒฝ์ด๋‹ค. ๊ทธ

์‹ฌ์žฅ๋ถ€์—๋Š” ๊ตฌ๊ธ€ ํฌ๋กฌ์— ํƒ‘์žฌ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„ V8์ด ์žˆ๋‹ค. V8์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์€ ๊ณ ์† ์ˆ˜

ํ–‰ ๋Šฅ๋ ฅ์ด๋‹ค. ์›น ๋ธŒ๋ผ์šฐ์ €์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ณด์•ˆ ๋•Œ๋ฌธ์— ํŒŒ์ผ ์ฒ˜๋ฆฌ ๋“ฑ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์— ๋ฐ˜ํ•ด

Node.js๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŒŒ์ผ ์ฒ˜๋ฆฌ๋ถ€ํ„ฐ ๋„คํŠธ์›Œํฌ ์ฒ˜๋ฆฌ๊นŒ์ง€ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ,

ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €์ธ npm์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์–‘ํ•œ ํ™•์žฅ ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ๋„์ž…ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

Node.js๋Š” ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹ค

โ–ฒ Node.js ์›น์‚ฌ์ดํŠธ(https://nodejs.org/ko/)

ํ–‰ ํ™˜๊ฒฝ(๋Ÿฐํƒ€์ž„)์œผ๋กœ ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋ž˜

์„œ ์ฃผ๋กœ ์„œ๋ฒ„ ๊ด€๋ จ ๊ธฐ์ˆ ๋กœ๋งŒ ์ทจ๊ธ‰๋˜๊ธฐ๊ฐ€ ์‰ฝ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Node.js๋กœ ์ž‘์„ฑ๋œ ์ˆ˜๋งŽ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

์ด ์กด์žฌํ•œ๋‹ค. ์„œ๋‘์— ์ž ๊น HTML5๋กœ ์ž‘์„ฑ๋œ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์Šค๋งˆํŠธํฐ ์•ฑ์œผ๋กœ ๋ณ€ํ™˜ํ•ด ์ฃผ๋Š”

ํฐ๊ฐญ์— ๋Œ€ํ•ด ์†Œ๊ฐœํ–ˆ๋Š”๋ฐ, ํฐ๊ฐญ๋„ ๋ฐ”๋กœ Node.js

๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ๋˜์—ˆ๋‹ค.

์ œ1์žฅ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ4

Page 27: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

์ž๋ฐ”์˜ ํ’๋ถ€ํ•œ ์ž์‚ฐ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” Rhino์™€ Nashorn

๋‹ค์Œ์œผ๋กœ, Rhino(๋ผ์ด๋…ธ)์™€ Nashorn(๋‚˜์Šคํ˜ธ๋ฅธ)์— ๊ด€ํ•ด ์•Œ์•„๋ณด์ž. ๋‹ค์†Œ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋“ค

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์€ ์ž๋ฐ”๋กœ ๊ตฌํ˜„๋˜์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ž๋ฐ”์˜ ๊ฐ€์ƒ ๋จธ์‹ (JVM, Java Virtual Machine)

์œ„์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋Œ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

์ด๋“ค ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์˜ ์ตœ๋Œ€ ์žฅ์ ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ž๋ฐ”์˜ ๊ธฐ๋Šฅ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ

์ด๋‹ค. ์ฆ‰, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ์ž๋ฐ”์˜ ๋ฐฉ๋Œ€ํ•œ API๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์ฑ…์—์„œ๋„

์ž๋ฐ”์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์†Œ๊ฐœํ•˜๋Š”๋ฐ ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”

์ง„์ด ์ž๋ฐ”์˜ ๊ฐ€์ƒ ๋จธ์‹  ์œ„์—์„œ ์ˆ˜ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋˜ํ•œ, Rhino๋Š” ์ž๋ฐ” 1.4 ์ดํ›„์—์„œ, ๊ทธ๋ฆฌ๊ณ 

Nashorn์€ ์ž๋ฐ” SE 8 ์ดํ›„์—์„œ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด๋‹ค. ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ์€ ๊ฐ™

์œผ๋‚˜, Nashorn์€ ์ตœ์‹  ์ž๋ฐ” ๋ฒ„์ „์— ๋งž๊ฒŒ ๋‹ค์‹œ ์ž‘์„ฑ๋˜์–ด์„œ JVM์˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ด์šฉํ•œ ๊ณ ์†

์ˆ˜ํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐœ๋ฐœ์— ์žˆ์–ด ๋งค์šฐ ์ค‘์š”ํ•œ ์ ์ด๊ธฐ๋„ ํ•œ๋ฐ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ์นœ์ ˆํ•˜๊ฒŒ ๋‚˜

์™€ ๋””๋ฒ„๊น…์ด ์‰ฝ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.

์ด์ฒ˜๋Ÿผ Nashorn์ด ๊ฐ€์ง„ ์ด์ ์ด ๋งŽ์ง€๋งŒ, ์ด ์ฑ…์—์„œ๋Š” ์–ด๋Š ์ •๋„ ์˜ค๋ž˜๋œ PC์—์„œ๋„ ๋™์ž‘์„ ํ…Œ์Šค

ํŠธํ•  ์ˆ˜ ์žˆ๋„๋ก Rhino๋ฅผ ์ด์šฉํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์†Œ๊ฐœํ•  ๊ฒƒ์ด๋‹ค.

โ–ฒ Mozilla Rhino ์›น์‚ฌ์ดํŠธ (https://developer.mozilla.org/ ko/docs/Rhino)

โ–ฒ Nashorn ๋ธ”๋กœ๊ทธ ์‚ฌ์ดํŠธ(https://blogs.oracle.com/nashorn/entry/welcome_to_the_nashorn_blog)

01 ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์˜ ์ด๋ชจ์ €๋ชจ 5

Page 28: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

์œˆ๋„์šฐ์— ํ‘œ์ค€์œผ๋กœ ํƒ‘์žฌ๋œ ์ œ์ด์Šคํฌ๋ฆฝํŠธ

์ œ์ด์Šคํฌ๋ฆฝํŠธ(JScript)๋Š” ์œˆ๋„์šฐ์—์„œ๋งŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์ ์ด ์žˆ์œผ๋‚˜, ๊ทธ๋งŒํผ ์œˆ๋„์šฐ์— ํŠนํ™”๋œ

๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์„ ๊ฐ€์ง„๋‹ค.

๊ตฌ์ฒด์ ์œผ๋กœ, ์ œ์ด์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ด์šฉํ•˜๋ฉด ์œˆ๋„์šฐ์˜ ActiveX(COM) ๊ธฐ์ˆ ์— ๋Œ€์‘ํ•œ ๊ฐ์ข… ์• ํ”Œ๋ฆฌ์ผ€

์ด์…˜์˜ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ์—‘์…€์— ์žˆ๋Š” ๋ช…๋ถ€๋ฅผ ์›Œ๋“œ๋กœ ๋งŒ๋“  ํŽธ์ง€ ์„œ์‹์˜ ์ˆ˜์‹ 

์ธ์— ๋ผ์›Œ๋„ฃ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์‹ค๋ฌด์—์„œ ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. โ€˜JScript Excelโ€™ ๋“ฑ์˜ ํ‚ค์›Œ

๋“œ๋กœ ๊ฒ€์ƒ‰ํ•ด ๋ณด๋ฉด, ์—‘์…€์„ ์ข€ ๋” ์ž˜ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค์–‘ํ•œ ํŒ์ด ๊ฒ€์ƒ‰๋œ๋‹ค.

โ–ฒ JScript ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ ๋งค๋‰ด์–ผ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘์— ์ ํ•ฉํ•œ ์ด์œ 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘์— ์ ํ•ฉํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ? ๊ฐ€์žฅ ํฐ ์ด์œ ๋กœ ์ฝ”๋“œ ์ž‘์„ฑ์ด ์‰ฌ์šด

์ ์„ ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์š”์ฆ˜์—๋Š” ๋งŽ์€ ์›น ํŽ˜์ด์ง€์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ด์šฉ๋˜๊ณ  ์žˆ๋Š” ๋งŒํผ ๋ˆ„๊ตฌ๋ผ๋„

์กฐ๊ธˆ๋งŒ ๋ฐฐ์šฐ๋ฉด ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘์„ ์œ„ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

๋ฅผ ์œ„ํ•œ ํ’๋ถ€ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ค€๋น„๋˜์–ด ์žˆ๋‹ค. ์ด์œ ์— ๊ด€ํ•ด ์ข€ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ์‚ดํŽด๋ณด์ž.

๋ฐฐ์šฐ๊ธฐ ์‰ฝ๋‹ค

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ์ ์ธ ๋ฌธ๋ฒ•์€ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๋‹ค. ๊ธฐ๋ณธ์ ์ธ ๋ถ€๋ถ„๋งŒ ๋†“๊ณ  ๋งํ•œ๋‹ค๋ฉด ์‰ฝ๊ฒŒ ํ•™์Šต

ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด ์ฑ…์€ ๋…์ž๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ๊ด€ํ•œ ์–ด๋Š ์ •๋„์˜ ์ง€์‹์ด

์ œ1์žฅ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ6

Page 29: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

์žˆ์Œ์„ ์ „์ œํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๊ธฐ๋ณธ ๋ฌธ๋ฒ•์„ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ์ด ์ฑ…์„ ํ†ตํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์‹ค์ „ ์ฝ”๋”ฉ

๊ธฐ์ˆ ์„ ์ตํž ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ค€๋น„๋˜์–ด ์žˆ๋‹ค

์•ž์—์„œ ์ด์•ผ๊ธฐํ–ˆ๋“ฏ์ด ๋‹ค์–‘ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์—”์ง„์ด ์กด์žฌํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์ด ํ˜•์„ฑ๋˜๊ณ  ์žˆ๋‹ค. ์ด ์ฑ…์—์„œ๋Š” ์ฃผ๋กœ Node.js๋ฅผ ๋‹ค๋ฃจ๋Š”๋ฐ

Node.js๋ฅผ ์œ„ํ•œ ์ˆ˜๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฉฐ, ๊ทธ๊ฒƒ๋“ค์„ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €์ธ npm์„ ์ด์šฉํ•ด ์‰ฝ๊ฒŒ

์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ ์—ฐ์„ฑ์ด ๋†’์•„ ์ฝ”๋“œ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์–ธ์–ด์˜ ์œ ์—ฐ์„ฑ์ด ๋งค์šฐ ๋†’์€ ๊ฒƒ์œผ๋กœ ์ •ํ‰์ด ๋‚˜ ์žˆ๋‹ค. ํ”„๋กœํ† ํƒ€์ž… ๊ธฐ๋ฐ˜์˜ ๊ฐ์ฒด

์ง€ํ–ฅ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Node.js์˜ ๊ฒฝ์šฐ๋Š” ๊ธฐ๋Šฅ์„ ๋ชจ๋“ˆ ๋‹จ์œ„๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

โ— ์—ฌ๋Ÿฌ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์— ๊ด€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค.

โ— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์‹คํ–‰ ํ™˜๊ฒฝ์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

โ— ํŠนํžˆ, Node.js๊ฐ€ ๋งŽ์€ ๊ฐœ๋ฐœ์ž์˜ ์ง€์ง€๋ฅผ ๋ฐ›๊ณ  ์žˆ๋‹ค.

โ— ์ด ์ฑ…์—์„œ๋„ Node.js๋ฅผ ์ด์šฉํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ฃผ๋กœ ์†Œ๊ฐœํ•œ๋‹ค.

โ— Rhino๋‚˜ Nashorn์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋ฐ”๋กœ ์ž‘์„ฑ๋œ ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ์ ˆ์˜ ๋งˆ๋ฌด๋ฆฌ

01 ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์˜ ์ด๋ชจ์ €๋ชจ 7

Page 30: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

์—์ด์ „ํŠธ์˜ ์˜๋ฏธ

์—์ด์ „ํŠธ(Agent)๋ž€, ํƒ€์ธ์ด๋‚˜ ํƒ€ ์กฐ์ง์˜ ์˜๋ขฐ๋ฅผ ๋ฐ›๊ณ  ๋Œ€์‹  ํ–‰๋™ํ•ด ์ฃผ๋Š” ๊ฐœ์ธ์ด๋‚˜ ์กฐ์ง์„ ๋œปํ•œ

๋‹ค. ๋Œ€๋ฆฌ์ธ, ๋Œ€๋ฆฌ์—…์ž, ์ค‘๊ฐœ์—…์ž๋กœ ๋ฐ”๊ฟ” ๋งํ•  ์ˆ˜ ์žˆ๋‹ค. ์šด๋™์„ ์ˆ˜๋ฅผ ๋Œ€์‹ ํ•ด์„œ ํŒ€๊ณผ ๊ต์„ญํ•ด ์ฃผ๋Š”

์Šคํฌ์ธ  ์—์ด์ „ํŠธ์— ๊ด€ํ•ด ๋“ค์–ด ๋ณด์•˜์„ ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ, ์—ฐ์˜ˆ๊ณ„์—์„œ ์—ฐ์˜ˆ์ธ์„ ๋Œ€์‹ ํ•ด์„œ ๋‹ค์–‘ํ•œ ๊ต

์„ญ์„ ํ•ด์ฃผ๋Š” ๊ฒƒ๋„ ์—์ด์ „ํŠธ๋‹ค. ์ผ์ƒ์ƒํ™œ์˜ ๊ฐ€๊นŒ์šด ์˜ˆ๋กœ, ์—ฌํ–‰์ž๋ฅผ ๋Œ€์‹ ํ•ด์„œ ์—ฌํ–‰์„ ์ค€๋น„ํ•ด ์ฃผ

๋Š” ์—ฌํ–‰ ์—์ด์ „ํŠธ๊ฐ€ ์žˆ๋‹ค. ๋˜, ํ† ์ง€์™€ ๊ฑด๋ฌผ์˜ ๊ฒฝ์šฐ์—๋„ ํŒ๋งค์ž์™€ ๊ตฌ๋งค์ž ์‚ฌ์ด์— ์ ˆ์ถฉ ์—…๋ฌด๋ฅผ

ํ•ด์ฃผ๋Š” ๋ถ€๋™์‚ฐ ์—์ด์ „ํŠธ๊ฐ€ ์žˆ๋‹ค.

์ด๋Ÿฐ ์ž‘์—…, ์ฒ˜๋ฆฌ, ์—…๋ฌด๋ฅผ IT ๋ถ„์•ผ์— ์ ์šฉํ•œ ๊ฒƒ์ด ์†Œํ”„ํŠธ์›จ์–ด ์—์ด์ „ํŠธ๋‹ค. ์‚ฌ์šฉ์ž ํ˜น์€ ๋‹ค๋ฅธ ์†Œ

ํ”„ํŠธ์›จ์–ด๋ฅผ ๋Œ€์‹ ํ•ด์„œ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด ์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๋งํ•œ๋‹ค. ์ด ์ฑ…์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์—

์„œ๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์—์ด์ „ํŠธ๋ฅผ ์งง๊ฒŒ ์ค„์—ฌ ์—์ด์ „ํŠธ๋ผ ๋ถ€๋ฅด๋„๋ก ํ•˜๊ฒ ๋‹ค.

์ด ์ฑ…์€ ์›น์‚ฌ์ดํŠธ๋กœ๋ถ€ํ„ฐ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ , ์ผ๋ จ์˜ ์ฒ˜๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•ด ์ฃผ๋Š” ์—

์ด์ „ํŠธ์˜ ์ž‘์„ฑ๋ฒ•์„ ๋‹ค๋ฃฌ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๋ถ€ํ„ฐ ์ฒ˜๋ฆฌ, ๋ณด๊ด€, ํ•œ๊ธ€ ํ˜•ํƒœ์†Œ ๋ถ„์„, ๋ฐ์ดํ„ฐ

๋ถ„์„ ๊ธฐ๋ฒ• ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ ์„ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ๋‹ค๋ฃฌ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ ์ฝ์–ด๋„ ์ข‹๊ณ , ํ•„์š”์— ๋”ฐ

์ œ1์žฅ | ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

02์—์ด์ „ํŠธ๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

์ด ์ฑ…์—์„œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•œ๋‹ค. ์ด๋ฒˆ ์ ˆ์—์„œ๋Š” ์ด ์ฑ…

์—์„œ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ๋‚ด์šฉ์— ๊ด€ํ•ด ์„ค๋ช…ํ•˜๊ณ , ์ด๊ฒƒ์„ ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ธ ์—์ด์ „ํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋ถ„

์•ผ์˜ ๊ธฐ์ˆ ์ด ํ•„์š”ํ•œ์ง€ ์•Œ์•„๋ณธ๋‹ค.

โ— ์—์ด์ „ํŠธ์— ๊ด€ํ•˜์—ฌ

์ฃผ์š” ํ•™์Šต ๋‚ด์šฉ

โ— ์—†์Œ

์ฃผ์š” ๋„๊ตฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์ œ1์žฅ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ8

Page 31: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

๋ผ ์„ ํƒ์ ์œผ๋กœ ์ฝ์„ ์ˆ˜๋„ ์žˆ๊ฒŒ ๊ตฌ์„ฑํ•˜์˜€๋‹ค.

์ง€๋Šฅํ˜• ์—์ด์ „ํŠธ

์—์ด์ „ํŠธ์—๋Š” ์–ด๋–ค ๊ฒƒ์ด ์žˆ์„๊นŒ? ๋ช‡ ๊ฐœ์˜ ์—์ด์ „ํŠธ์— ๊ด€ํ•ด ๊ตฌ์ฒด์ ์œผ๋กœ ์‚ดํŽด๋ณด์ž. ์ด ๋ถ„์•ผ์—์„œ

์ฃผ๋ชฉ๋ฐ›๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ์ง€๋Šฅํ˜• ์—์ด์ „ํŠธ(IA, Intelligent Agent)๋‹ค. ์ง€๋Šฅํ˜• ์—์ด์ „ํŠธ๋Š” ์ธ๊ณต์ง€๋Šฅ์œผ๋กœ

์‚ฌ์šฉ์ž๋ฅผ ๋•๊ณ , ๋ฐ˜๋ณต๋˜๋Š” ์ž‘์—…์„ ์‚ฌ์šฉ์ž ๋Œ€์‹ ์— ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ง€๋Šฅํ˜• ์—์ด์ „ํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน

์ง•์ด ์žˆ๋‹ค.

โ—โ— ํ™˜๊ฒฝ๊ณผ์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ํ†ตํ•ด ํ•™์Šตํ•˜๋ฉฐ ๋™์ž‘์ด ๊ฐœ์„ ๋œ๋‹ค.

โ—โ— ์˜จ๋ผ์ธ์œผ๋กœ ์‹ค์‹œ๊ฐ„ ์ ์‘ํ•œ๋‹ค.

โ—โ— ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ์†์œผ๋กœ ํ•™์Šตํ•œ๋‹ค.

โ—โ— ์ƒˆ๋กœ์šด ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ทœ์น™์— ์ ์‘ํ•œ๋‹ค.

โ—โ— ์ž์‹ ์˜ ๋™์ž‘์— ๋Œ€ํ•ด ์„ฑ๊ณต๊ณผ ์‹คํŒจ๋ฅผ ์Šค์Šค๋กœ ๋ถ„์„ํ•œ๋‹ค.

์œ„ ํŠน์ง•๋“ค์„ ์ฝ์œผ๋ฉด SF์†Œ์„ค์— ๋‚˜์˜ค๋Š” ๊ณ ๋„์˜ ์ง€๋Šฅ์„ ์ง€๋‹Œ ๋กœ๋ด‡์ด ์ƒ์ƒ๋ ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜

์ด๋ฏธ ์šฐ๋ฆฌ ๊ทผ์ฒ˜์—์„œ ์ง€๋Šฅํ˜• ์—์ด์ „ํŠธ๊ฐ€ ํ™œ์•ฝํ•˜๊ณ  ์žˆ๋‹ค. ์‹ค๋ก€๋ฅผ ์‚ดํŽด๋ณด์ž.

๋ฐ”์ด์–ด ์—์ด์ „ํŠธ

๊ตฌ๋งค ๋ด‡์ด๋ผ๊ณ ๋„ ๋ถˆ๋ฆฐ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ธํ„ฐ๋„ท์—์„œ ์ƒํ’ˆ์ด๋‚˜ ์„œ๋น„์Šค๋ฅผ ๋ฐœ๊ฒฌํ•˜๋Š” ๊ฒƒ์„ ๋„์™€์ฃผ๋Š”

์—์ด์ „ํŠธ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ์•„๋งˆ์กด์—์„œ ์‡ผํ•‘ํ•  ๋•Œ ํŽ˜์ด์ง€ ๋ฐ‘์— ์œ ์‚ฌ ์ƒํ’ˆ๋“ค์ด ํ‘œ์‹œ๋œ๋‹ค. ์ด๊ฒƒ์€

๊ทธ ํŽ˜์ด์ง€๋ฅผ ๋ณธ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ๊ตฌ๋งคํ•œ ์ƒํ’ˆ์ด๋‚˜, ์‚ฌ์šฉ์ž๊ฐ€ ๋ณธ ๋‹ค๋ฅธ ์ƒํ’ˆ์˜ ๊ฒฝํ–ฅ ์ •๋ณด๋ฅผ ์ด์šฉ

ํ•œ ๊ฒƒ์ด๋‹ค. ์ „๋ฌธ์ ์˜ ์ ์›์ด๋ผ๋ฉด ์†๋‹˜์˜ ์ด์•ผ๊ธฐ๋ฅผ ๋“ฃ๊ณ  ์†๋‹˜์—๊ฒŒ ๋”ฑ ๋งž๋Š” ์ƒํ’ˆ์„ ์„ ํƒํ•ด ์ค€๋‹ค.

์•ฝ์‚ฌ๋Š” ์†๋‹˜์˜ ์ฆ์ƒ์„ ๋“ฃ๊ณ  ๋งž๋Š” ์•ฝ์„ ์ถ”์ฒœํ•ด ์ค€๋‹ค. ์ด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฐ”์ด์–ด ์—์ด์ „ํŠธ๋„ ์‚ฌ์šฉ

์ž์˜ ์ทจํ–ฅ์„ ๊ณ ๋ คํ•ด์„œ ์ƒํ’ˆ์„ ์ถ”์ฒœํ•ด ์ค€๋‹ค.

์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ

์ธํ„ฐ๋„ท ์„ธ๊ณ„์—์„œ๋Š” ์‚ฌ์šฉ์ž ์—์ด์ „ํŠธ๊ฐ€ ํฐ ํ™œ์•ฝ์„ ํ•˜๊ณ  ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ์›น ๋ธŒ๋ผ์šฐ์ €๋‚˜ ์ด๋ฉ”

์ผ ํด๋ผ์ด์–ธํŠธ์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ์ž๋™์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ด๋ฉ”์ผ ํด๋ผ์ด์–ธํŠธ๋Š” ์ƒˆ๋กœ

์šด ๋ฉ”์ผ์„ ์ˆ˜์‹ ํ•˜๊ณ , ๊ทœ์น™์— ๋”ฐ๋ผ ๋ฉ”์ผ์„ ๋ถ„๋ฅ˜ํ•˜๊ณ , ์ค‘์š”ํ•œ ๋ฉ”์ผ์ด ์žˆ์œผ๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆฌ๊ธฐ

๋„ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ์‚ฌ์šฉ์ž์™€ ์›น ์„œ๋ฒ„ ์‚ฌ์ด์—์„œ ์ •๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ์—์ด์ „ํŠธ๋‹ค. ์‚ฌ

02 ์—์ด์ „ํŠธ๋ž€ ๋ฌด์—‡์ธ๊ฐ€? 9

Page 32: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

์šฉ์ž๊ฐ€ ๋ณด๊ณ  ์‹ถ์€ ํŽ˜์ด์ง€๋ฅผ ์›น ๋ธŒ๋ผ์šฐ์ €์— ์ž…๋ ฅํ•˜๋ฉด ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ทจ๋“ํ•ด์„œ

๋ณด๊ธฐ ์‰ฌ์šด ํ˜•ํƒœ๋กœ ํ‘œ์‹œํ•ด ์ค€๋‹ค. ๋ณด๋‹ค ๊ณ ๋„์˜ ์—์ด์ „ํŠธ์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž์˜ ์ทจํ–ฅ์— ๋งž๊ฒŒ ์›น์˜ ๋‰ด

์Šค๋ฅผ ๋ชจ์œผ๋Š” ์ผ๋„ ํ•œ๋‹ค. ๋˜, ๊ฒŒ์ž„์˜ ์ƒ๋Œ€๊ฐ€ ๋˜๊ธฐ๋„ ํ•˜๊ณ  ์‚ฌ์šฉ์ž์™€ ๋Œ€ํ™”๋ฅผ ํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

๊ฐ์‹œ ์—์ด์ „ํŠธ

ํ™”๋ คํ•˜์ง€ ์•Š์ง€๋งŒ ์—†์–ด์„œ๋Š” ์•ˆ ๋  ์ผ์„ ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ์‹œ ์—์ด์ „ํŠธ๋‹ค. ์ด ์—์ด์ „ํŠธ๋Š” ์ปดํ“จํ„ฐ ๊ธฐ๊ธฐ

๋‚˜ ์‹œ์Šคํ…œ์ด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ณ  ์žˆ๋Š”์ง€๋ฅผ ๊ฐ์‹œํ•˜์—ฌ ๋ณด๊ณ ํ•œ๋‹ค. ๊ธฐ๊ธฐ๊ฐ€ ๊ณ ์žฅ ๋‚˜๊ฑฐ๋‚˜ ์‹œ์Šคํ…œ์ด

๋‹ค์šด๋˜๋ฉด ๊ด€๋ฆฌ์ž์—๊ฒŒ ํ†ต์ง€ํ•˜๊ณ  ์ž๋™์œผ๋กœ ๋ณต๊ตฌ๋ฅผ ์‹œ๋„ํ•˜๊ธฐ๋„ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์†Œ๋งค์ ์˜ ์žฌ๊ณ  ํ˜„

ํ™ฉ์„ ๊ฐ์‹œํ•ด์„œ ์žฌ๊ณ  ๋ถ€์กฑ์„ ์˜ˆ์ธกํ•˜์—ฌ ๋ณด๊ณ ํ•˜๋Š” ์ผ๋„ ํ•œ๋‹ค.

๋ฐ์ดํ„ฐ ๋งˆ์ด๋‹ ์—์ด์ „ํŠธ

๋ฐ์ดํ„ฐ ๋งˆ์ด๋‹์ด๋ž€, ํฌ๊ณ  ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋กœ๋ถ€ํ„ฐ ์œ ์šฉํ•œ ์ •๋ณด๋ฅผ ๋ฐœ๊ตดํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์ด ์ž‘์—…

์€ ๊ด‘์‚ฐ์— ์žˆ๋Š” ๊ด‘์„์„ ์ฑ„๊ตด(mining)ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋งˆ์ด๋‹(data mining)์ด๋ผ ๋ถ€๋ฅธ

๋‹ค. ๋ฐ์ดํ„ฐ ๋งˆ์ด๋‹ ์—์ด์ „ํŠธ๋Š” ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๋ชจ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„๋ฅ˜, ๋ถ„์„ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํŠธ๋ Œ๋“œ

์˜ ์ „ํ™˜์„ ๊ฒ€์ถœํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ์ •๋ณด๋ฅผ ์ฐพ์•„๋‚ธ๋‹ค.

์œ ๋ช…ํ•œ ๋ฐ์ดํ„ฐ ๋งˆ์ด๋‹์˜ ์˜ˆ๋กœ, ์Šˆํผ๋งˆ์ผ“์˜ ํŒ๋งค ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜์™ธ์˜ ์ •๋ณด

๋ฅผ ๋ฐœ๊ฒฌํ•œ ์‚ฌ๋ก€๊ฐ€ ์žˆ๋‹ค.

โ—โ— ๋งฅ์ฃผ๋ฅผ ์‚ฌ๋Š” ์†๋‹˜์€ ๊ธฐ์ €๊ท€๋ฅผ ํ•จ๊ป˜ ์‚ฌ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

โ—โ— ๋น„๊ฐ€ ์˜ค๋Š” ๋‚ ์€ ๊ณ ๊ธฐ์˜ ํŒ๋งค๋Ÿ‰์ด ๋งŽ๋‹ค.

์ด๋Ÿฌํ•œ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋งฅ์ฃผ์™€ ๊ธฐ์ €๊ท€์˜ ํŒ๋งค๋Œ€๋ฅผ ๊ฐ€๊น๊ฒŒ ํ•˜๊ฑฐ๋‚˜ ๋น„๊ฐ€ ์˜ค๋Š” ๋‚ ์— ์ง„์—ดํ•˜๋Š”

๊ณ ๊ธฐ์˜ ์ข…๋ฅ˜๋ฅผ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ์ง€์นจ์„ ํ†ตํ•ด ๋งค์ถœ ์ฆ๋Œ€๋ฅผ ๊ธฐ๋Œ€ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด์ฒ˜๋Ÿผ ์—์ด์ „ํŠธ๋Š” ์ด๋ฏธ ์šฐ๋ฆฌ์˜ ์‚ถ ๊ฐ€๊นŒ์ด์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค. ์ด ์ฑ…์—์„œ ๋ชจ๋“  ๋‚ด์šฉ์„ ๋ง๋ผํ• 

์ˆ˜๋Š” ์—†์ง€๋งŒ, ์ด ์ฑ…์˜ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž…๋ฌธํ•œ๋‹ค๋ฉด ๋” ์‹ฌ์˜คํ•œ ๊ธฐ์ˆ ์— ๋‹ค๊ฐ€๊ฐˆ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

โ— ์—์ด์ „ํŠธ๋Š” ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ๋Œ€์‹ ํ•ด์„œ ์–ด๋–ค ์ผ์„ ํ•ด ์ฃผ๋Š” ์‚ฌ๋žŒ์ด๋‚˜ ์กฐ์ง, ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋งํ•œ๋‹ค.

โ— ์šฐ๋ฆฌ ์ฃผ๋ณ€์—๋Š” ์ด๋ฏธ ๋‹ค์–‘ํ•œ ์—์ด์ „ํŠธ๊ฐ€ ์žˆ์–ด์„œ ์˜จ๋ผ์ธ ๋งˆ์ผ“์ด๋‚˜ ๋ธŒ๋ผ์šฐ์ €, ์ด๋ฉ”์ผ ํด๋ผ์ด์–ธํŠธ ๋“ฑ์—์„œ ์—ญ

ํ• ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค.

โ— ์ด ์ฑ…์—์„œ๋Š” ์†Œํ”„ํŠธ์›จ์–ด ์—์ด์ „ํŠธ์˜ ์ž‘์„ฑ๋ฒ•์„ ์„ค๋ช…ํ•œ๋‹ค.

์ด ์ ˆ์˜ ๋งˆ๋ฌด๋ฆฌ

์ œ1์žฅ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ10

Page 33: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

๊ฐ€์ƒ ๋จธ์‹ ์— ์‹คํ–‰ ํ™˜๊ฒฝ ๊ตฌ์ถ•

์ด ์ฑ…์—์„œ ์„ค๋ช…ํ•˜๋Š” ์ฝ”๋“œ๋Š” ์œˆ๋„์šฐ, Mac OS X, ๋ฆฌ๋ˆ…์Šค ๋ชจ๋‘์—์„œ ๋™์ž‘ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ”„๋กœ๊ทธ

๋žจ์„ ๊ฐœ๋ฐœํ•  ๋•Œ ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ด ๋†“์œผ๋ฉด ํŽธ๋ฆฌํ•œ ์ ์ด ๋งŽ๋‹ค. ์ด ์ฑ…์—์„œ๋Š” ๊ฐ€์ƒ ๋จธ์‹  ์œ„์—

CentOS(์„ผํŠธ์˜ค์—์Šค)๋ฅผ ์„ค์น˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋…์ž์™€ ํ•„์ž์˜ ์šด์˜์ฒด์ œ ์ฐจ์ด๋กœ ์ƒ๊ธฐ๋Š”

์—ฌ๋Ÿฌ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์— ๊ด€ํ•œ ๊ฑฑ์ • ์—†์ด ์ฝ”๋“œ์˜ ์„ค๋ช…์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, ๊ฐ€์ƒ ํ™˜๊ฒฝ์„ ๋งŒ๋“ค๋ฉด

๋‹ค์–‘ํ•œ ์‹คํ—˜์„ ํ•ด๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒจ๋„ ์‰ฝ๊ฒŒ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์–ด๋– ํ•œ ๋ฌด๋ฆฌํ•œ ํ”„๋กœ๊ทธ๋žจ

์„ ์‹คํ–‰์‹œ์ผœ๋„ ํ˜ธ์ŠคํŠธ ๋จธ์‹  ํ™˜๊ฒฝ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋งŽ์€ ๊ฐ€์ƒํ™” ๋„๊ตฌ๊ฐ€ ๋ฌด๋ฃŒ๋กœ ์ œ๊ณต๋˜๊ณ  ์žˆ์–ด ๋ถ€๋‹ด ์—†์ด ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ตœ๊ทผ์˜ PC๋ผ๋ฉด ๊ฐ€์ƒ ๋จธ

์‹ ์„ ์ผœ ๋‘” ์ฑ„๋กœ ์žˆ์–ด๋„ ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์— ํฐ ๋ถ€๋‹ด์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.

์ด ์ฑ…์—์„œ๋Š” ์ฝ˜์†”์„ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ๋ฌผ๋ก ,

์œˆ๋„์šฐ์—๋„ ์ฝ˜์†”์ด ์žˆ์ง€๋งŒ, ๋ฆฌ๋ˆ…์Šค ๊ณ„์—ด์˜ ํ„ฐ๋ฏธ๋„์ด ์—ฌ๋Ÿฌ๋ชจ๋กœ ํŽธ๋ฆฌํ•˜๋‹ค. ๋˜ํ•œ, ๋ฆฌ๋ˆ…์Šค์— ์žˆ๋Š”

ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•„์š”ํ•œ ์†Œํ”„ํŠธ์›จ์–ด๋“ค์„ ์‰ฝ๊ฒŒ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ œ1์žฅ | ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

03๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ•

์ด๋ฒˆ ์ ˆ์—์„œ๋Š” ๊ฐ€์ƒ ๋จธ์‹  ์œ„์— ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค. ๊ฐ€์ƒ ๋จธ์‹  ์œ„์—์„œ๋ผ๋ฉด ์•ˆ์‹ฌํ•˜

๊ณ  ๋งˆ์Œ๊ป ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์ˆ˜ํ–‰ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋ณด๋‹ค ์‰ฌ์šด ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐ€์ƒ ๋จธ์‹  ๋ฐ ๊ฐœ๋ฐœ ํ™˜

๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณผ ๊ฒƒ์ด๋‹ค.

โ— ๊ฐ€์ƒ ๋จธ์‹  ์œ„์— ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•

์ฃผ์š” ํ•™์Šต ๋‚ด์šฉ

โ— Vagrant/VirtualBox โ— Poderosa โ— CentOS โ— nvm โ— Node.js โ— git

์ฃผ์š” ๋„๊ตฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

03 ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ• 11

Page 34: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

๊ฐ€์ƒ ๋จธ์‹  ์ƒ์„ฑ

๊ทธ๋Ÿฌ๋ฉด ๊ฐ€์ƒ ๋จธ์‹ ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž. ์šฐ๋ฆฌ๋Š” VirtualBox(๋ฒ„์ถ”์–ผ๋ฐ•์Šค) ์œ„์— CentoOS

๋ฅผ ์„ค์น˜ํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์šด์˜์ฒด์ œ ์„ค์น˜๋Š” ๊ท€์ฐฎ๊ณ  ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ž‘์—…์ด๋‹ค. ๊ทธ๋ž˜์„œ ์—ฌ๊ธฐ

์„œ๋Š” CentOS๊ฐ€ ๋ฏธ๋ฆฌ ์„ค์น˜๋œ ๋จธ์‹  ์ด๋ฏธ์ง€๋ฅผ ํ•œ ๋ฒˆ์˜ ๋ช…๋ น์œผ๋กœ ๋‚ด๋ ค๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” Vagrant(๋ฒ ์ด๊ทธ

๋ŸฐํŠธ)๋ผ๋Š” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

VirtualBox์™€ Vagrant ์„ค์น˜

๊ทธ๋Ÿฌ๋ฉด VirtualBox์™€ Vagrant๋ฅผ ์„ค์น˜ํ•˜์ž. VirtualBox๋Š” ๋‹ค์Œ URL์—์„œ ๋‚ด๋ ค๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ์œˆ

๋„์šฐ๋ผ๋ฉด โ€˜VirtualBox x.x.x for Windows hostsโ€™๋ฅผ ์„ ํƒํ•˜๊ณ , Mac OS X์ด๋ฉด โ€˜VirtualBox x.x.x

for OS X hostsโ€™๋ฅผ ์„ ํƒํ•œ๋‹ค. ์ธ์Šคํ†จ๋Ÿฌ๊ฐ€ ์ค€๋น„๋˜์–ด ์žˆ์–ด ์•ˆ๋‚ด์— ๋”ฐ๋ผ ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

VirtualBox > Downloadshttps://www.virtualbox.org/wiki/Downloads

โ–ฒ VirtualBox์˜ ์›น์‚ฌ์ดํŠธ

๋‹ค์Œ์œผ๋กœ, Vagrant๋ฅผ ์„ค์น˜ํ•˜์ž. ๋‹ค์Œ URL์—์„œ ๋‹ค์šด๋ฐ›๋Š”๋‹ค. ์—ญ์‹œ, ์ธ์Šคํ†จ๋Ÿฌ๊ฐ€ ์žˆ์œผ๋‹ˆ ์ง€์‹œ์—

๋”ฐ๋ผ ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•˜๋„๋ก ํ•œ๋‹ค.

์ œ1์žฅ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ12

Page 35: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

Vagrant > Downloadhttps://www.vagrantup.com/downloads.html

โ–ฒ Vagrant์˜ ์›น์‚ฌ์ดํŠธ

๊ฐ€์ƒ ๋จธ์‹  ์ถ”๊ฐ€

์œˆ๋„์šฐ์—์„œ๋Š” ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ, Mac OS X์—์„œ๋Š” ํ„ฐ๋ฏธ๋„์„ ์—ด์–ด์„œ ๊ฐ€์ƒ ๋จธ์‹ ์„ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ์€ ํด

๋”๋กœ ์ด๋™ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  โ€˜vagrant initโ€™์ด๋ผ๊ณ  ์ž…๋ ฅํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Vagrantfile์ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

$ vagrant init

์—๋””ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ Vagantfile์„ ํŽธ์ง‘ํ•˜๋„๋ก ํ•œ๋‹ค. ํŒŒ์ผ ๋‚ด์— config.vm.box="base"๋ผ๊ณ  ์“ฐ์—ฌ

์ง„ ๋ถ€๋ถ„์„ ์ฐพ์•„์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ”๊พธ๋„๋ก ํ•œ๋‹ค. ์ด๊ฒƒ์€ Vagrant Cloud๋กœ๋ถ€ํ„ฐ ์ž๋™์œผ๋กœ ๊ฐ€์ƒ

๋จธ์‹  ํŒŒ์ผ(Box ํŒŒ์ผ)์„ ๋‚ด๋ ค๋ฐ›๋„๋ก ํ•˜๋Š” ์„ค์ •์ด๋‹ค.1

#config.vm.box = "base" โ† ์ฃผ์„ ์ฒ˜๋ฆฌ

config.vm.box = "puphpet/centos65-x64" โ† ์ถ”๊ฐ€

1ใ€€ ์ด ๊ฐ€์ƒ๋จธ์‹  ํŒŒ์ผ์€ ์‚ฌ์šฉ์ž๋“ค์ด ์ž‘์„ฑํ•˜์—ฌ ์˜ฌ๋ฆฐ ๊ฒƒ์œผ๋กœ, ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ๋Š” ์ด์šฉํ•˜์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋งŒ์•ฝ, ํ•ด๋‹น ์ด๋ฆ„์œผ๋กœ ์„ค์น˜๊ฐ€

์•ˆ ๋˜๋ฉด http://vagrantcloud.com์—์„œ CentOS๋ฅผ ๊ฒ€์ƒ‰ํ•ด์„œ Box ํŒŒ์ผ ์ด๋ฆ„์„ ๊ธฐ์žฌํ•˜์—ฌ ์ง„ํ–‰ํ•˜๋„๋ก ํ•œ๋‹ค.

03 ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ• 13

Page 36: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

โ–ฒ ํ…์ŠคํŠธ ์—๋””ํ„ฐ๋กœ ํŽธ์ง‘

์—ฌ๊ธฐ์„œ๋Š” CentOS 6.5๋ฅผ ๋‚ด๋ ค๋ฐ›๋„๋ก ์„ค์ •ํ•˜์˜€๋Š”๋ฐ, Vagrant Cloud์—๋Š” ๊ทธ ์™ธ์—๋„ ๋‹ค์–‘ํ•œ ๊ฐ€์ƒ

๋จธ์‹  Box๊ฐ€ ๋“ฑ๋ก๋˜์–ด ์žˆ์–ด ์›ํ•˜๋Š” ๊ฒƒ์„ ๋‚ด๋ ค๋ฐ›์•„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Vagrant Cloud์˜ ์›น์‚ฌ์ดํŠธ [URL] https://vagrantcloud.com

โ–ฒ Box ํŒŒ์ผ ์ผ๋žŒ

์ œ1์žฅ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ14

Page 37: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

๊ฐ€์ƒ ๋จธ์‹  ๊ธฐ๋™

์ด๊ฒƒ์œผ๋กœ ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•ด ๋ณด์ž. ๊ทธ๋Ÿฌ๋ฉด ์ž๋™์œผ๋กœ Box ํŒŒ์ผ์„

๋‚ด๋ ค๋ฐ›๊ณ  ๊ฐ€์ƒ ๋จธ์‹ ์„ ๊ธฐ๋™ํ•œ๋‹ค.

$ vagrant up์—ญ์ฃผ

โ–ฒ ์ฒซ ์‹คํ–‰ ์‹œ์—๋Š” Box ํŒŒ์ผ์„ ๋‚ด๋ ค๋ฐ›๋Š”๋‹ค

์ฒซ ์‹คํ–‰ ์‹œ์—๋Š” Box ํŒŒ์ผ์„ ๋‚ด๋ ค๋ฐ›๋Š” ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜์—ฌ ๋‹ค์†Œ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ง€๋งŒ, ์ดํ›„์—๋Š” ๊ทธ๋งŒํผ

์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. ํ•œํŽธ, ์ง€๊ธˆ๊นŒ์ง€ ์„ค๋ช…ํ•œ ๊ฐ€์ƒ ๋จธ์‹ ์„ ๋‹ค์šด๋ฐ›๊ณ  ๊ธฐ๋™ํ•˜๋Š” ๊ณผ์ •์€ ๋‹ค์Œ ๋‘

์ค„์˜ ๋ช…๋ น์–ด๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋‹ค.

vagrant init puphet/centos65-x64vagrant up --provider virtualbox

์—ญ์ฃผ ์œˆ๋„์šฐ 10์—์„œ vagrant up ์‹คํ–‰ ์ค‘ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด ์„ค์น˜ ๊ฒฝ๋กœ์—์„œ VirtualBox.exe ํŒŒ์ผ์„ ์ฐพ์•„ ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ ํด๋ฆญ

์†์„ฑ ํ˜ธํ™˜์„ฑ ํƒญ์—์„œ โ€œ๊ด€๋ฆฌ์ž๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰โ€์„ ์ฒดํฌํ•ด ์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  VirtualBox.exe๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋„์›€๋ง ๋ชจ๋“  ๊ฒฝ๊ณ  ์ดˆ๊ธฐํ™”

๋ฅผ ํด๋ฆญํ•œ๋‹ค.

03 ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ• 15

Page 38: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

๊ฐ€์ƒ ๋จธ์‹  ์ œ์–ด

๊ฐ€์ƒ ๋จธ์‹ ์˜ ๊ธฐ๋™ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ •์ƒ์ ์œผ๋กœ ๊ธฐ๋™ ์ค‘์ด๋ฉด

โ€˜running(๋™์ž‘ ์ค‘)โ€™์ด๋ผ๊ณ  ํ‘œ์‹œ๋œ๋‹ค.

$ vagrant status

์‹คํ–‰ ์ค‘์ธ ๊ฐ€์ƒ ๋จธ์‹ ์„ ์ข…๋ฃŒํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” โ€˜vagrant haltโ€™๋ผ๊ณ  ์ž…๋ ฅํ•œ๋‹ค. ์ด ์™ธ์—๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์€

๋ช…๋ น์œผ๋กœ ๊ฐ€์ƒ ๋จธ์‹ ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.

โ–ผ Vagrant ๊ด€๋ จ ๋ช…๋ น์–ด ์ผ๋žŒ

์ปค๋งจ๋“œ ์ œ์–ด ์„ค๋ช…

vagrant up ๊ฐ€์ƒ ๋จธ์‹  ์‹œ๋™

vagrant halt ๊ฐ€์ƒ ๋จธ์‹  ์ •์ง€

vagrant suspend ๊ฐ€์ƒ ๋จธ์‹  ํœด๋ฉด

vagrant resume ๊ฐ€์ƒ ๋จธ์‹  ํœด๋ฉด ์ƒํƒœ์—์„œ ๋ณต์›

vagrant reload ๊ฐ€์ƒ ๋จธ์‹  ์žฌ์‹œ๋™

vagrant status ๊ฐ€์ƒ ๋จธ์‹ ์˜ ์ƒํƒœ ํ™•์ธ

vagrant destroy ๊ฐ€์ƒ ๋จธ์‹  ์‚ญ์ œ

vagrant ssh ๊ฐ€์ƒ ๋จธ์‹ ์— ๋กœ๊ทธ์ธ

๊ฐ€์ƒ ๋จธ์‹ ์— ๋กœ๊ทธ์ธํ•˜๊ธฐ

์šฐ๋ฆฌ๊ฐ€ ์•ž์„œ ์„ค์น˜ํ•œ CentOS ์ด๋ฏธ์ง€๋Š” ์ตœ์†Œ ๊ตฌ์„ฑ์ด๋ฏ€๋กœ ๋ฐ์Šคํฌํ†ฑ ํ™”๋ฉด์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ

๋ผ์„œ ํ„ฐ๋ฏธ๋„์„ ํ†ตํ•ด ๊ฐ€์ƒ ๋จธ์‹ ์— ๋กœ๊ทธ์ธํ•ด์•ผ ํ•œ๋‹ค. Mac OS X์ด๋ผ๋ฉด ํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ , ๋‹ค์Œ๊ณผ

๊ฐ™์ด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด SSH๋ฅผ ํ†ตํ•ด ๊ฐ€์ƒ ๋จธ์‹ ์— ๋กœ๊ทธ์ธํ•˜๊ฒŒ ๋œ๋‹ค.

$ vagrant ssh

์ œ1์žฅ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ16

Page 39: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

โ–ฒ Mac OS X์—์„œ ๊ฐ€์ƒ ๋จธ์‹ ์— ๋กœ๊ทธ์ธํ•œ ํ™”๋ฉด

์œˆ๋„์šฐ์—์„œ ๊ฐ€์ƒ ๋จธ์‹ ์— ๋กœ๊ทธ์ธํ•˜๋Š” ๋ฐฉ๋ฒ•

์œˆ๋„์šฐ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด SSH ์ ‘์†์— ํ•„์š”ํ•œ ์ •๋ณด๋งŒ ํ‘œ์‹œ๋œ๋‹ค.

> vagrant ssh(์ดํ•˜ ํ‘œ์‹œ ์˜ˆ)Host: 127.0.0.1Port: 2222Username: vagrantPrivate key: E:/vagrant/.vagrant/machines/default/virtualbox/private_key

๋จผ์ €, SSH ํด๋ผ์ด์–ธํŠธ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์œ„ ์ •๋ณด๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ ‘์†ํ•œ๋‹ค. ์œ ๋ช…ํ•œ ์œˆ๋„์šฐ์šฉ SSH ํด๋ผ

์ด์–ธํŠธ๋กœ๋Š” Putty(ํ‘ธํ‹ฐ), TeraTerm(ํ…Œ๋ผํ…€), Poderosa(ํฌ๋ฐ๋กœ์‚ฌ) ๋“ฑ์ด ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” Poderosa์˜

์‚ฌ์šฉ๋ฒ•์„ ์†Œ๊ฐœํ•˜๊ฒ ๋‹ค.

๋‹ค์Œ ์ฃผ์†Œ์—์„œ Poderosa๋ฅผ ๋‹ค์šด๋กœ๋“œํ•œ๋‹ค. ZIP ํŒŒ์ผ์„ ์••์ถ• ํ•ด์ œํ•˜๋ฉด Poderosa.exe๊ฐ€ ๋‚˜์˜ค๋Š”

๋ฐ ์ด๊ฒƒ์ด ์‹คํ–‰ ํŒŒ์ผ์ด๋‹ค. ๋”๋ธ”ํด๋ฆญํ•˜์—ฌ ์‹คํ–‰ํ•œ๋‹ค.

Poderosa[URL] http://sourceforge.net/projects/poderosa/

Poderosa๋ฅผ ์‹คํ–‰ํ•œ ํ›„ ๋ฉ”๋‰ด์—์„œ โ€˜File New Telenet/SSH Connectionโ€™์„ ํด๋ฆญํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•ž

์„œ โ€˜vagrant sshโ€™๋กœ ํš๋“ํ•œ ์ ‘์† ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•œ๋‹ค. Host์— โ€˜127.0.0.1โ€™, Protocol์— SSH2, Port์—

ํฌํŠธ ๋ฒˆํ˜ธ, Account์— vagrant, Authentication์—๋Š” Public Key๋ฅผ ์„ ํƒํ•˜๊ณ , Key File(Private

03 ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ• 17

Page 40: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

Key)์„ ์ง€์ •ํ•œ๋‹ค. ์ด๋•Œ ํฌํŠธ ๋ฒˆํ˜ธ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์“ฐ์ด๋Š” 22๊ฐ€ ์•„๋‹ˆ๋ผ 2222์ธ ๊ฒƒ์— ์ฃผ์˜ํ•œ๋‹ค.

OK๋ฅผ ๋ˆ„๋ฅด๋ฉด ๊ฐ€์ƒ ๋จธ์‹ ์— ์ ‘์†ํ•œ๋‹ค.

โ–ฒ Poderosa๋กœ ์ ‘์†ํ•˜๋Š” ํ™”๋ฉด

๋ณดํ†ต ์›ฌ๋งŒํ•œ SSH ํด๋ผ์ด์–ธํŠธ๋Š” ํ™”๋ฉด ์ƒ‰์„ ๊ธฐํ˜ธ์— ๋งž๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š”๋ฐ Poderosa๋„ ๋ฉ”๋‰ด์˜

Tools Options์˜ Display ํƒญ์—์„œ ํ™”๋ฉด ์ƒ‰์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

โ–ฒ Poderosa๋ฅผ ์‹คํ–‰ํ•œ ํ™”๋ฉด

์ œ1์žฅ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ18

Page 41: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

์ดˆ๊ธฐ ๊ณ„์ •๊ณผ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ๋ชจ๋‘ vagrant๋‹ค.

โ–ผ ๋””ํดํŠธ ๊ณ„์ • ์ •๋ณด

๋””ํดํŠธ

๊ณ„์ • vagrant

ํŒจ์Šค์›Œ๋“œ vagrant

Node.js ์„ค์น˜

๊ทธ๋Ÿฌ๋ฉด ์ด ์ฑ…์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ธ Node.js๋ฅผ ์„ค์น˜ํ•˜์ž. Vagrant๋กœ ๊ธฐ๋™

ํ•œ ๊ฐ€์ƒ ๋จธ์‹ ์— ๋กœ๊ทธ์ธํ•œ๋‹ค. Node.js๋Š” ๋ฒ„์ „์— ๋”ฐ๋ผ ๋™์ž‘์ด ๋‹ค๋ฅด๋‹ค. ๊ทธ๋ž˜์„œ nvm์ด๋ผ๋Š” ๋„๊ตฌ๋ฅผ

์‚ฌ์šฉํ•ด์„œ ํŠน์ • ๋ฒ„์ „์˜ Node.js๋ฅผ ์„ค์น˜ํ•  ๊ฒƒ์ด๋‹ค. ๋จผ์ €, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด nvm์„ ์„ค

์น˜ํ•œ๋‹ค.

$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.25.3/install.sh | bash

์„ค์น˜ ํ›„ ์…ธ์˜ ์žฌ์‹œ์ž‘์„ ์œ„ํ•ด โ€˜logoutโ€™ ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ ๋กœ๊ทธ์•„์›ƒํ•˜์˜€๋‹ค๊ฐ€ ์žฌ์ ‘์†ํ•˜์—ฌ ๋‹ค์‹œ

๋กœ๊ทธ์ธํ•œ๋‹ค. ์ด์–ด Node.js 0.12.4๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

$ nvm install v0.12.4$ nvm alias default v0.12.4

์ œ๋Œ€๋กœ ์„ค์น˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด ๋ณด์ž. โ€˜node โ€“vโ€™ ๋ช…๋ น์–ด๋กœ ์„ค์น˜๋œ Node.js์˜ ๋ฒ„์ „ ์ •๋ณด๋ฅผ ํ™•์ธํ• 

์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ๊ณผ ๋น„์Šทํ•˜๊ฒŒ ํ‘œ์‹œ๋˜๋ฉด ์„ฑ๊ณตํ•œ ๊ฒƒ์ด๋‹ค.

$ node -vv0.12.4

Node.js์—๋Š” REPL(Read-Eval-Print-Loop)์ด๋ผ ๋ถˆ๋ฆฌ๋Š” ๋Œ€ํ™” ํ™˜๊ฒฝ์ด ์ค€๋น„๋˜์–ด ์žˆ๋‹ค. ํ„ฐ๋ฏธ๋„์—์„œ

์ธ์ž ์—†์ด node ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด REPL์ด ์‹œ์ž‘๋œ๋‹ค. ์—ฌ๊ธฐ์„œ 3 + 5๋ผ ์ž…๋ ฅํ•˜๊ณ , ์—”ํ„ฐ๋ฅผ ๋ˆŒ๋Ÿฌ

03 ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ• 19

Page 42: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

๋ณด์ž. 8์ด๋ผ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ํ‘œ์‹œ๋  ๊ฒƒ์ด๋‹ค.

$ node> 3 + 5 8

๊ทธ๋Ÿฐ๋ฐ nvm์„ ์‚ฌ์šฉํ•ด์„œ Node.js๋ฅผ ์„ค์น˜ํ•œ ๊ฒฝ์šฐ์—๋Š” sudo ๋ช…๋ น์–ด์™€ ํ•จ๊ป˜ npm์ด๋‚˜ node ๋ช…๋ น

์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ์ด๋ฅผ ์œ„ํ•ด sudo ๋ช…๋ น์„ ์‹คํ–‰ํ•  ๋•Œ์˜ ํŒจ์Šค(PATH: ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ๋ช…๋ น์„ ์ฐพ๋Š”

๊ธฐ๋ณธ ๊ฒฝ๋กœ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜)๋ฅผ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž์˜ ํŒจ์Šค์™€ ๊ฐ™๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค. ๋จผ์ €, โ€˜.exitโ€™๋ฅผ ์ž…๋ ฅํ•˜

์—ฌ REPL ํ™˜๊ฒฝ์„ ์ข…๋ฃŒํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์ด visudo ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํ•œ๋‹ค.

$ sudo visudo

๋งŽ์€ ์„ค์ • ํ•ญ๋ชฉ์ด ์žˆ๋Š”๋ฐ env_keep์„ ์„ค์ •ํ•œ ํ–‰์„ ์ฐพ์•„์„œ ์ฃผ์„ ํ‘œ์‹œ โ€˜#โ€™์„ ์—†์• ๋„๋ก ํ•œ๋‹ค. ๊ทธ

๋Ÿฐ๋ฐ visudo๋ฅผ ์‹คํ–‰ํ•˜๋ฉด vi ์—๋””ํ„ฐ๊ฐ€ ์‹คํ–‰๋œ๋‹ค. vi ์—๋””ํ„ฐ๋Š” ๋ช…๋ น ๋ชจ๋“œ์™€ ๋ฌธ์ž๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ

๋Š” ์ž…๋ ฅ ๋ชจ๋“œ๋ฅผ ๋ฐ”๊ฟ”๊ฐ€๋ฉด์„œ ํŽธ์ง‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. vi๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ช…๋ น ๋ชจ๋“œ๋กœ ์‹œ์ž‘๋œ๋‹ค. i ํ‚ค๋ฅผ ๋ˆŒ

๋Ÿฌ ์ž…๋ ฅ ๋ชจ๋“œ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ํŽธ์ง‘์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ํŽธ์ง‘์ด ๋๋‚˜๋ฉด esc ํ‚ค๋ฅผ ๋ˆŒ๋Ÿฌ ๋ช…๋ น ๋ชจ๋“œ๋กœ ๋Œ์•„๊ฐ€

๋„๋ก ํ•œ๋‹ค.

### ์ฒซ ๋ฒˆ์งธ ์ˆ˜์ •(env_reset์„ ๋ฌดํšจํ™”)Defaults env_resetใ€€ใ€€ใ€€ใ€€โ†“Defaults !env_reset

### ๋‘ ๋ฒˆ์งธ ์ˆ˜์ •(HOME์„ ์ถ”๊ฐ€)#Defaults env_keep += "HOME"ใ€€ใ€€ใ€€ใ€€โ†“Defaults env_keep += "HOME"

### ์„ธ ๋ฒˆ์งธ ์ˆ˜์ •(sudo ๋ช…๋ น์–ด ์‹คํ–‰ ์‹œ ์‚ฌ์šฉํ•  ํŒจ์Šค๋ฅผ ๋ฎ์–ด์“ฐ์ง€ ์•Š๋„๋ก ์ฃผ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค)Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/binใ€€ใ€€ใ€€ใ€€โ†“# Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin

๋ช…๋ น ๋ชจ๋“œ์—์„œ :wq ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋ฉด ์ €์žฅ ํ›„ vi๊ฐ€ ์ข…๋ฃŒ๋œ๋‹ค. ํ•œ ๋ฒˆ ๋กœ๊ทธ์•„์›ƒํ•˜๊ณ  ๋‹ค์‹œ ๋กœ๊ทธ์ธํ•˜๋ฉด

์„ค์ •์ด ๋ฐ˜์˜๋œ๋‹ค.

์ œ1์žฅ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ20

Page 43: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

git ์„ค์น˜

๋‹ค์–‘ํ•œ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋กœ์ปฌ ํ™˜๊ฒฝ์— ๋‚ด๋ ค๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก git๋„ ์„ค์น˜ํ•ด ๋‘์ž.

$ sudo yum install git

๊ฐ€์ƒ ๋จธ์‹ ์—์„œ ์›น ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ •

๊ฐ€์ƒ ๋จธ์‹ ์€ ๋งํ•˜์ž๋ฉด ์ƒ์ž ์•ˆ์˜ ๋ชจํ˜• ์ •์›์ด๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ€์ƒ ๋จธ์‹ ์— ์›น ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด

๊ธฐ๋ณธ์ ์œผ๋กœ ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์—์„œ ์ ‘๊ทผํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค. ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Vagrant์˜ ์„ค

์ • ํŒŒ์ผ Vagrantfile์— ๋‹ค์Œ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

config.vm.network "forwarded_port", guest: 80, host: 8080config.vm.network "private_network", ip: "192.168.33.10"

์„ค์ • ํŒŒ์ผ์˜ ๋งˆ์ง€๋ง‰ ์ค„์— ์žˆ๋Š” end ์œ„์— ๊ธฐ์ˆ ํ•œ๋‹ค. ์„ค์ •์„ ์ €์žฅํ–ˆ์œผ๋ฉด โ€˜vagrant reloadโ€™๋ฅผ ์ž…๋ ฅ

ํ•˜์—ฌ ๊ฐ€์ƒ ๋จธ์‹ ์„ ์žฌ๊ธฐ๋™ํ•œ๋‹ค.

์ฒซ ๋ฒˆ์งธ ํ–‰์ด ์ˆ˜ํ–‰๋˜๋ฉด์„œ ๊ฐ€์ƒ ๋จธ์‹ ์˜ ์›น ์„œ๋ฒ„ ํฌํŠธ 80์ด ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์˜ ํฌํŠธ 8080์— ํ• ๋‹น๋œ

๋‹ค. ๋‘ ๋ฒˆ์งธ ํ–‰์ด ์ˆ˜ํ–‰๋˜๋ฉด์„œ ๊ฐ€์ƒ ๋จธ์‹ ์˜ IP ์ฃผ์†Œ๊ฐ€ 192.168.33.10์— ํ• ๋‹น๋œ๋‹ค.

ํ˜ธ์ŠคํŠธ ๋จธ์‹ ๊ณผ ๊ฐ€์ƒ ๋จธ์‹  ๊ฐ„์˜ ํด๋” ๊ณต์œ 

ํ˜ธ์ŠคํŠธ ๋จธ์‹ ๊ณผ ๊ฐ€์ƒ ๋จธ์‹  ๊ฐ„์— ํด๋”๋ฅผ ๊ณต์œ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ํŠน๋ณ„ํ•œ ์„ค์ • ์—†์ด๋„ ๊ฐ€์ƒ ๋จธ์‹ 

์˜ /vagrant ํด๋”๊ฐ€ ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์˜ ์„ค์ • ํด๋”(Vagrantfile์ด ์žˆ๋Š” ํด๋”)์™€ ๊ณต์œ ๋œ๋‹ค. ๋ฌผ๋ก , ํ˜ธ์Šค

ํŠธ ๋จธ์‹ ์˜ ์ž„์˜์˜ ํด๋”๋ฅผ ๊ฐ€์ƒ ๋จธ์‹ ์˜ ์ž„์˜์˜ ํด๋”์™€ ๊ณต์œ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์„ค์ • ํŒŒ์ผ

Vagrantfile์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ธฐ์žฌํ•œ๋‹ค.

[์„œ์‹]config.vm.synced_folder "ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์˜ ๊ฒฝ๋กœ", "๊ฐ€์ƒ ๋จธ์‹ ์˜ ๊ฒฝ๋กœ"

์„ค์ •์„ ํŽธ์ง‘ํ–ˆ์œผ๋ฉด ๋™์ผํ•˜๊ฒŒ โ€˜vagrant reloadโ€™ ๋ช…๋ น์–ด๋กœ ๊ฐ€์ƒ ๋จธ์‹ ์„ ์žฌ๊ธฐ๋™ํ•œ๋‹ค.

03 ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ• 21

Page 44: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

๊ฐ€์ƒ ๋จธ์‹ ์˜ ํด๋” ๊ณต์œ  ์„ค์ • ์ค‘ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ

ํ˜น์‹œ ์œ„์— ์„ค๋ช…ํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ณต์œ ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด vbox๋ฅผ ์žฌ๋นŒ๋“œํ•จ์œผ๋กœ์จ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜๊ธฐ๋„

ํ•œ๋‹ค. ๊ฐ€์ƒ ๋จธ์‹ ์— ๋กœ๊ทธ์ธํ•œ ํ›„์— ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

$ sudo /etc/init.d/vboxadd setup

ํ˜น์€ ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์— ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•ด ๋‘๋ฉด ํŽธ๋ฆฌํ•˜๋‹ค. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๊ฐ€์ƒ ๋‹จ๋ง์—

Virtualbox-guest-addition์˜ ์„ค์น˜ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ ํ›„ ํ•„์š” ์‹œ์— ์ž๋™์œผ๋กœ ์„ค์น˜๊ฐ€ ์ด๋ค„์ง„๋‹ค.

$ vagrant plugin install vagrant-vbguest

ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์—์„œ ๊ฐœ๋ฐœํ•˜๊ณ  ๊ฐ€์ƒ ๋จธ์‹ ์—์„œ ์‹คํ–‰

ํ˜ธ์ŠคํŠธ ๋จธ์‹ ๊ณผ ๊ฐ€์ƒ ๋จธ์‹  ๊ฐ„์— ํด๋”๊ฐ€ ๊ณต์œ ๋˜๋ฉด ํŽธ๋ฆฌํ•œ ์ ์ด ๋งŽ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ํ˜ธ์ŠคํŠธ ๋จธ์‹ ์ธ

์œˆ๋„์šฐ(ํ˜น์€ Mac OS X)์—์„œ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•œ ํ›„์— ๊ฐ€์ƒ ๋จธ์‹  ์œ„์˜ CentOS์—์„œ ํ”„๋กœ๊ทธ๋žจ์„

์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์‰ฌ์›Œ์ง„๋‹ค. ๋˜ํ•œ, ์ด ์ฑ…์˜ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์••์ถ•์„ ํ•ด์ œํ•˜๋Š” ๊ฒƒ์€ ํ˜ธ

์ŠคํŠธ ๋จธ์‹ ์—์„œ ์ˆ˜ํ–‰ํ•˜๊ณ , ์‹คํ–‰์€ ๊ฐ€์ƒ ๋จธ์‹ ์—์„œ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

โ–ฒ Mac OS X์—์„œ ๊ฐœ๋ฐœํ•˜๊ณ  ๊ฐ€์ƒ ๋จธ์‹ ์—์„œ ์‹คํ–‰ํ•˜๋Š” ์žฅ๋ฉด

์ œ1์žฅ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ22

Page 45: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

โ— ์ด ์ ˆ์—์„œ๋Š” ๊ฐ€์ƒ ๋จธ์‹ ์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ–ˆ๋‹ค.

โ— Vagrant๋ฅผ ์ด์šฉํ•ด์„œ ๋น„๊ต์  ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

โ— ์ด ์ฑ…์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์—์„œ๋Š” ์ด๋ฒˆ ์žฅ์—์„œ ๊ตฌ์ถ•ํ•œ ๊ฐ€์ƒ ๋จธ์‹  ์œ„์—์„œ ๋™์ž‘์„ ํ™•์ธํ•ด ๋‚˜๊ฐ€๊ฒ ๋‹ค.

์ด ์ ˆ์˜ ๋งˆ๋ฌด๋ฆฌ

03 ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ• 23

Page 46: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

npm์ด๋ž€?

npm์€ Node.js์˜ ๋ชจ๋“ˆ์„ ๊ด€๋ฆฌํ•˜๋Š” ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Node.js์˜ ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•˜๋Š”

๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Node.js๋กœ ๋งŒ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค์น˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

npm install๋กœ ๋ชจ๋“ˆ ์„ค์น˜

๊ทธ๋Ÿฌ๋ฉด npm์˜ ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž. ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•  ๋•Œ์—๋Š” โ€˜npm installโ€™์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ปค๋งจ๋“œ ๋ผ์ธ ์ฐฝ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.

[์„œ์‹] npm์œผ๋กœ ๋ชจ๋“ˆ ์„ค์น˜

$ npm install (๋ชจ๋“ˆ ์ด๋ฆ„)

์ œ1์žฅ | ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

04Node.js ๋ชจ๋“ˆ ์„ค์น˜

Node.js์˜ ์ด์ ์€ ๋งŽ์€ ๋ชจ๋“ˆ์ด ๊ณต๊ฐœ๋˜์–ด ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์ธ npm์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“ˆ์„ ์‰ฝ๊ฒŒ ์„ค

์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” npm์— ๊ด€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.

โ— npm์˜ ์‚ฌ์šฉ๋ฒ•

์ฃผ์š” ํ•™์Šต ๋‚ด์šฉ

โ— npm โ— nano

์ฃผ์š” ๋„๊ตฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

์ œ1์žฅ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ24

Page 47: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

์˜ˆ๋ฅผ ๋“ค๋ฉด, ์›น์‚ฌ์ดํŠธ๋กœ๋ถ€ํ„ฐ ํŒŒ์ผ์ด๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ ค๋ฐ›์„ ๋•Œ์—๋Š” request ๋ชจ๋“ˆ์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ

๋‹ค. request ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

$ npm install request

๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™”๋ฉด์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

โ–ฒ npm ์‹คํ–‰ ํ™”๋ฉด

์œ„ ํ™”๋ฉด์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด npm install์„ ์‹คํ–‰ํ•˜๋ฉด ๊ทธ ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“ˆ(์ฆ‰, ์˜์กด

๋ชจ๋“ˆ)๋„ ๊ฐ™์ด ์„ค์น˜๋œ๋‹ค. ๋”ฐ๋ผ์„œ request ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด mime-types ๋ชจ๋“ˆ๊ณผ form-data

๋ชจ๋“ˆ์„ ๋”ฐ๋กœ ์„ค์น˜ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ์ด๊ฒƒ์€ npm์„ ์ด์šฉํ•  ๋•Œ์˜ ์ปค๋‹ค๋ž€ ์žฅ์ ์œผ๋กœ ๋งค์šฐ ํŽธ๋ฆฌํ•œ

๊ธฐ๋Šฅ์ด๋‹ค.

๋ชจ๋“ˆ์ด ์„ค์น˜๋˜๋Š” ๊ฒฝ๋กœ

๊ทธ๋Ÿฌ๋‚˜ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์ด ์žˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ โ€˜npm installโ€™๋กœ ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•˜๋ฉด ์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•œ

ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋ชจ๋“ˆ์ด ๋‹ค์šด๋กœ๋“œ๋œ๋‹ค. ์ •ํ™•ํ•˜๊ฒŒ๋Š” ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ์— node_modules๋ผ๋Š” ๋””๋ ‰

ํ„ฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๊ณ , ๊ทธ ์•ˆ์— ๋ชจ๋“ˆ์ด ๋‹ค์šด๋กœ๋“œ๋œ๋‹ค.

04 Node.js ๋ชจ๋“ˆ ์„ค์น˜ 25

Page 48: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

โ–ฒ ๋ชจ๋“ˆ์ด ์„ค์น˜๋œ ๊ตฌ์กฐ

๊ทธ๋ž˜์„œ ํ•œ ๋ฒˆ ๋ชจ๋“ˆ์„ ์„ค์น˜ํ–ˆ์–ด๋„ ๋‹ค๋ฅธ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ๋ฐฐ์น˜๋œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ทธ ๋ชจ๋“ˆ์— ์ ‘๊ทผํ• 

์ˆ˜ ์—†๋‹ค. ์—ฌ๊ธฐ์„œ ์ž ์‹œ ์ •๋ฆฌํ•ด ๋ณด์ž. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ตฌ์„ฑ์œผ๋กœ ๋‘ ๊ฐœ์˜ ํ”„๋กœ๊ทธ๋žจ์ด ์žˆ๋‹ค

๊ณ  ํ•˜์ž.

+ <root>|---+ <ProjectA>| |---+ <node_modules>| |--- program-a.js| |---+ <ProjectB>| |--- program-b.js

<Project A>์˜ program-a.js์—์„œ request ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด Project A์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ

npm install request๋ฅผ ์‹คํ–‰ํ–ˆ๋‹ค๊ณ  ํ•˜์ž. ๊ทธ๋Ÿฌ๋ฉด program-a.js์—์„œ๋Š” request ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜

์žˆ๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Project B์˜ program-b.js์—์„œ๋Š” request ๋ชจ๋“ˆ์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ Project

B์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ๋‹ค์‹œ request ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ธ€๋กœ๋ฒŒ ์„ค์น˜ -g

๊ทธ๋Ÿฌ๋‚˜ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“ˆ์„ ๋งค๋ฒˆ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์€ ์„ฑ๊ฐ€์‹  ์ผ์ด๋‹ค. ๋ชจ๋“  ํ”„๋กœ์ ํŠธ ๋ฐ ํด๋”์—์„œ

์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•  ๋•Œ -g ์˜ต์…˜์„ ๋ถ™์ธ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ธ€๋กœ๋ฒŒํ•œ ๊ฒฝ๋กœ์— ๋ชจ๋“ˆ์ด ์„ค์น˜๋œ๋‹ค.

์ œ1์žฅ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ26

Page 49: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

# ๋ชจ๋“ˆ์„ ๊ธ€๋กœ๋ฒŒํ•˜๊ฒŒ ์„ค์น˜

$ npm install โ€“g (๋ชจ๋“ˆ ์ด๋ฆ„)

-g ์˜ต์…˜์„ ๋ถ™์—ฌ์„œ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์„ ๊ธ€๋กœ๋ฒŒ ์„ค์น˜๋ผ๊ณ  ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ๋ฅผ ๋กœ์ปฌ ์„ค์น˜๋ผ๊ณ  ํ•œ

๋‹ค. ๊ธ€๋กœ๋ฒŒ ์„ค์น˜๋ฅผ ํ•  ๋•Œ์˜ ์ฃผ์˜์ ์€ ๋Œ€๋ถ€๋ถ„์˜ ํ™˜๊ฒฝ์—์„œ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์ด๋‹ค.

CentOS๋‚˜ Mac OS X์—์„œ๋Š” ๋ช…๋ น์–ด ์•ž์— sudo๋ฅผ ๋ถ™์—ฌ์„œ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์œผ๋กœ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜

์žˆ๋‹ค.

# ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์œผ๋กœ ๊ธ€๋กœ๋ฒŒ ์„ค์น˜

$ sudo npm install โ€“g (๋ชจ๋“ˆ ์ด๋ฆ„)

sudo๋กœ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ํŒจ์Šค์›Œ๋“œ๋ฅผ ๋ฌผ์–ด ๋ณด๋Š”๋ฐ ์ด๋•Œ ๊ด€๋ฆฌ์ž ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•˜๋„๋ก ํ•œ๋‹ค.

์˜ฌ๋ฐ”๋ฅธ ํŒจ์Šค์›Œ๋“œ๋กœ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์ด ํ™•์ธ๋˜๋ฉด ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์œผ๋กœ ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

๊ธ€๋กœ๋ฒŒ ์„ค์น˜ ์‹œ PATH์— ์ฃผ์˜

npm์„ ํ†ตํ•ด ๋ชจ๋“ˆ์„ ๊ธ€๋กœ๋ฒŒํ•˜๊ฒŒ ์„ค์น˜ํ•˜๋ฉด CentOS5์—์„œ๋Š” /usr/lib/node_modules์— ์„ค์น˜๋œ๋‹ค.

Mac OS X์— Homebrew๋กœ ์„ค์น˜ํ•œ ๊ฒฝ์šฐ์—๋Š” /usr/local/lib/node_moduels์— ์„ค์น˜๋œ๋‹ค. ์–ด๋””์—

๋ชจ๋“ˆ์ด ์„ค์น˜๋˜๋Š”์ง€๋Š” ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

# ๊ธ€๋กœ๋ฒŒ ์„ค์น˜ ๊ฒฝ๋กœ ํ™•์ธ

$ npm root -g

๊ทธ๋Ÿฐ๋ฐ npm์œผ๋กœ ๊ธ€๋กœ๋ฒŒํ•˜๊ฒŒ ์„ค์น˜ํ•œ ๋ชจ๋“ˆ์„ Node.js๊ฐ€ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—๋Ÿฌ ๋ฉ”์‹œ

์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

Error: Cannot find module '(๋ชจ๋“ˆ ์ด๋ฆ„)'

์ด๊ฒƒ์€ ํ•ด๋‹น ๋ชจ๋“ˆ์„ ์•„์ง ์„ค์น˜ํ•˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ Node.js์—์„œ npm์œผ๋กœ ๊ธ€๋กœ๋ฒŒํ•˜๊ฒŒ ์„ค์น˜ํ•œ ๋ชจ๋“ˆ์„

์ฐพ์„ ์ˆ˜ ์—†์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Node.js๊ฐ€ ๋ชจ๋“ˆ์„ ์ฐพ์„ ๋•Œ ์–ด๋–ค ๊ฒฝ๋กœ๋ฅผ ๊ฒ€

์ƒ‰ํ• ๊นŒ? ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

04 Node.js ๋ชจ๋“ˆ ์„ค์น˜ 27

Page 50: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

$ node โ€“e "console.log(global.module.paths)"

CentOS์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜ํƒ€๋‚œ๋‹ค.

[ '/home/vagrant/test/node_modules', '/home/vagrant/node_modules', '/home/node_modules', '/node_modules' ]

์ž˜ ๋ณด๋ฉด ํ˜„์žฌ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ node_modules ํด๋”, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ƒ์œ„ ํด๋”์˜ node_modules ํด๋”,

๋‹ค์‹œ ๊ทธ ์ƒ์œ„ ํด๋”์˜ node_modules ํด๋”โ€ฆ ์ด๋Ÿฌํ•œ ์ˆœ์œผ๋กœ ์ฐจ๋ก€๋Œ€๋กœ ๋ชจ๋“ˆ์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒƒ์„ ์•Œ

์ˆ˜ ์žˆ๋‹ค. ์ด์™€ ๋ณ„๊ฐœ๋กœ Node.js๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜ NODE_PATH์— ์ €์žฅ๋œ ๊ฒฝ๋กœ๋„ ๊ฒ€์ƒ‰ํ•œ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ, npm์˜ ๊ธ€๋กœ๋ฒŒ ๋ชจ๋“ˆ ์„ค์น˜ ๊ฒฝ๋กœ๋ฅผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ NODE_PATH์— ๋“ฑ๋กํ•˜๋ฉด Node.js์—

์„œ ๋ชจ๋“ˆ์„ ์ฐพ์„ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๋‹ค์Œ์€ ๊ฐ€์ƒ ๋จธ์‹ ์˜ CentOS์—์„œ โ€˜npm root โ€“gโ€™๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋‹ค.

$ npm root -g/home/vagrant/.nvm/versions/node/v0.12.4/lib/node_modules

๋ฆฌ๋ˆ…์Šค(CentOS)๋‚˜ Mac OS X์—์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ฐ’์„ ๋“ฑ๋กํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž์˜ ํ™ˆ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ

๋Š” โ€˜~/.bash_profileโ€™(๊ฐ€์ƒ ๋จธ์‹  ํ™˜๊ฒฝ์—์„œ๋Š” โ€˜/home/vagrant/.bash_profileโ€™)์„ ํŽธ์ง‘ํ•œ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด

NODE_PATH์— npm์˜ ๊ธ€๋กœ๋ฒŒ ์„ค์น˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•œ๋‹ค.

# ํ™˜๊ฒฝ ๋ณ€์ˆ˜ NODE_PATH ์„ค์ •

export NODE_PATH=/home/vagrant/.nvm/versions/node/v0.12.4/lib/node_modules

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ NODE_PATH๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์€ ์œˆ๋„์šฐ์˜ Node.js๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค. ์œˆ๋„์šฐ์—์„œ ํ™˜๊ฒฝ

๋ณ€์ˆ˜๋ฅผ ํŽธ์ง‘ํ•˜๋Š” ๊ฒƒ์€ โ€˜์ œ์–ดํŒ ์‹œ์Šคํ…œ ๋ฐ ๋ณด์•ˆ ์‹œ์Šคํ…œ ๊ณ ๊ธ‰ ์‹œ์Šคํ…œ ์„ค์ • ํ™˜๊ฒฝ ๋ณ€์ˆ˜โ€™

์—์„œ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ œ1์žฅ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ28

Page 51: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

CentOS์— nano ์—๋””ํ„ฐ ์„ค์น˜

๊ทธ๋Ÿฐ๋ฐ CentOS์—์„œ ํŒŒ์ผ์„ ํŽธ์ง‘ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ? ๋ณดํ†ต์€ ํ…์ŠคํŠธ ์—๋””ํ„ฐ์ธ vi๋ฅผ ์‚ฌ์šฉ

ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ vi์˜ ์‚ฌ์šฉ๋ฒ•์€ ์ดˆ๋ณด์ž์—๊ฒŒ ๋‹ค์†Œ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค. ํ•œ๋ฒˆ vi๋ฅผ ์‹คํ–‰์‹œ์ผœ ๋ณด๋ฉด ๋ฌธ์ž

๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ๋„, vi ์ž์ฒด๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ๊ฒƒ๋„ ๋ชปํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ, vi๊ฐ€ ์‹คํ–‰ ์ค‘์ด๋ผ๋ฉด โ€˜:q!โ€™์™€ ์—”

ํ„ฐ๋ฅผ ์ž…๋ ฅํ•ด์„œ ์ข…๋ฃŒ์‹œํ‚จ๋‹ค.

์—ฌ๊ธฐ์„œ๋Š” vi ๋Œ€์‹ ์— ๋ฉ”๋ชจ์žฅ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” nano ์—๋””ํ„ฐ๋ฅผ ์†Œ๊ฐœํ•˜๊ณ ์ž ํ•œ๋‹ค. CentOS์—์„œ

๋Š” ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด nano๋ฅผ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

$ sudo yum install nano

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด โ€˜~/.bash_profileโ€™์„ ํŽธ์ง‘ํ•ด ๋ณด์ž. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž…๋ ฅํ•œ๋‹ค.

$ nano ~/.bash_profile

ํŽธ์ง‘์ด ์™„๋ฃŒ๋˜์—ˆ์œผ๋ฉด Ctrl ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋ฉด์„œ X ํ‚ค๋ฅผ ๋ˆ„๋ฅธ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํŽธ์ง‘ํ•œ ํ…์ŠคํŠธ๋ฅผ ์ €์žฅํ• ์ง€ ์—ฌ

๋ถ€๋ฅผ ๋ฌป๋Š”๋ฐ Y ํ‚ค์™€ Enter ํ‚ค๋ฅผ ๋ˆ„๋ฅธ๋‹ค. ํŒŒ์ผ ์ด๋ฆ„์„ ๋ฌผ์œผ๋ฉด ๊ทธ๋Œ€๋กœ Enter ํ‚ค๋ฅผ ๋ˆŒ๋Ÿฌ ๋ฎ์–ด ์“ฐ

๋„๋ก ํ•œ๋‹ค.

โ–ฒ nano ์—๋””ํ„ฐ ์‹คํ–‰ ํ™”๋ฉด

04 Node.js ๋ชจ๋“ˆ ์„ค์น˜ 29

Page 52: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

nano ์—๋””ํ„ฐ์˜ ํ™”๋ฉด ํ•˜๋‹จ์—๋Š” ๋‹จ์ถ•ํ‚ค๋“ค์ด ๋‚˜์—ด๋˜์–ด ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด โ€˜ฬ‚ Xโ€™๋Š” Ctrl ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋ฉด

์„œ Xํ‚ค๋ฅผ ๋ˆ„๋ฅธ๋‹ค๋Š” ๋œป์ด๋‹ค.

๋ชจ๋“ˆ ์‚ญ์ œ

๋ชจ๋“ˆ์˜ ์„ค์น˜ ๋ฐฉ๋ฒ•์— ์ด์–ด ์ œ๊ฑฐ ๋ฐฉ๋ฒ•๋„ ์•Œ์•„๋ณด์ž. ๋ชจ๋“ˆ์ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋˜์—ˆ์„ ๋•Œ๋Š” โ€˜npm

uninstallโ€™๋กœ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

# ๋ชจ๋“ˆ ์‚ญ์ œ

$ npm uninstall (๋ชจ๋“ˆ ์ด๋ฆ„)

โ— ์ด ์ ˆ์—์„œ๋Š” Node.js์˜ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €์ธ npm์— ๊ด€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค.

โ— ๋ชจ๋“ˆ์˜ ์„ค์น˜์™€ ์ œ๊ฑฐ์™€ ๊ด€๋ จํ•˜์—ฌ ์ฃผ์˜ํ•ด์•ผ ๋  ๋ถ€๋ถ„์— ๊ด€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค.

โ— ๊ธ€๋กœ๋ฒŒ ์„ค์น˜์— ๊ด€ํ•ด์„œ๋Š” ์ž˜ ์ดํ•ดํ•ด ๋‘์–ด์•ผ ํ•œ๋‹ค.

์ด ์ ˆ์˜ ๋งˆ๋ฌด๋ฆฌ

์ œ1์žฅ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ30

Page 53: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ์— ํ•„์š”ํ•œ ์—๋””ํ„ฐ๋Š”?

๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜๋ฉด, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ํŠน๋ณ„ํ•œ ์—๋””ํ„ฐ๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋งˆ์Œ์—

๋“œ๋Š” ํ…์ŠคํŠธ ์—๋””ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋งŒ์ด๋‹ค. ์ด ์ฑ…์˜ ๋งŽ์€ ํ”„๋กœ๊ทธ๋žจ์€ ์ปค๋งจ๋“œ ๋ผ์ธ์—์„œ ์‹คํ–‰ํ•˜

๋Š” ๊ฒƒ์œผ๋กœ ๋˜์–ด ์žˆ๋‹ค. ํ…์ŠคํŠธ ์—๋””ํ„ฐ์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•œ ํ›„, ์ปค๋งจ๋“œ ๋ผ์ธ์—์„œ

์‹คํ–‰ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•ด ๋ณด๋ฉด ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ํ…์ŠคํŠธ ์—๋””ํ„ฐ์— ์š”๊ตฌ๋˜๋Š” ๊ฒƒ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ฌธ

๋ฒ•์— ๋”ฐ๋ผ ์ปฌ๋Ÿฌ๋ง์ด ๋˜๋Š” ๊ฒƒ๊ณผ ์ž๋™์™„์„ฑ ๊ธฐ๋Šฅ ์ •๋„๊ฐ€ ๋˜๊ฒ ๋‹ค. ์ด๋ฒˆ ์žฅ์—์„œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜

๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ํ–ฅ์ƒ์‹œ์ผœ ์ค„ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜, ๊ทผ๋ž˜์— ์ฃผ๋ชฉ๋ฐ›๋Š” ์—๋””ํ„ฐ๋“ค์„ ์†Œ๊ฐœํ•˜๊ฒ ๋‹ค.

์ œ1์žฅ | ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

05๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋†’์—ฌ ์ค„ ๋ชจ๋˜ํ•œ ์—๋””ํ„ฐ ์†Œ๊ฐœ

์ด ์ ˆ์—์„œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ์— ํŽธ๋ฆฌํ•œ ํ…์ŠคํŠธ ์—๋””ํ„ฐ๋ฅผ ์†Œ๊ฐœํ•œ๋‹ค. ๋งŽ์€ ํ…์ŠคํŠธ ์—๋””ํ„ฐ ์ค‘์—์„œ๋„ ์š”์ฆ˜์—

ํŠนํžˆ ์ฃผ๋ชฉ๋ฐ›๋Š” ๋ชจ๋˜ํ•œ ์—๋””ํ„ฐ๋ฅผ ์†Œ๊ฐœํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค. ์ฑ… ์†์˜ ํ”„๋กœ๊ทธ๋žจ์„ ์ˆ˜์ •ํ•˜๊ณ  ์‹คํ–‰ํ•ด ๋ณด๋Š” ๋ฐ ๋„์›€์ด

๋  ๊ฒƒ์ด๋‹ค.

โ— ๋ชจ๋˜ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ ์—๋””ํ„ฐ ์†Œ๊ฐœ

์ฃผ์š” ํ•™์Šต ๋‚ด์šฉ

โ— Atom โ— Sublime Text โ— Brackets โ— WebStorm โ— NetBeans

์ฃผ์š” ๋„๊ตฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

05 ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋†’์—ฌ ์ค„ ๋ชจ๋˜ํ•œ ์—๋””ํ„ฐ ์†Œ๊ฐœ 31

Page 54: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

Atom โ€• ํ’๋ถ€ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋งค๋ ฅ

Atom ์—๋””ํ„ฐ

[URL] https://atom.io/[OS] ์œˆ๋„์šฐ/Mac OS X/๋ฆฌ๋ˆ…์Šค

[๋ผ์ด์„ ์Šค] MIT License

Atom(์•„ํ†ฐ)์€ ์˜คํ”ˆ ์†Œ์Šค๋กœ ๊ฐœ๋ฐœ๋˜๊ณ  ์žˆ๋Š” ํ…์ŠคํŠธ ์—๋””ํ„ฐ๋‹ค. ์ฃผ๋กœ ๊นƒํ—ˆ๋ธŒ(GitHub)์—์„œ ๊ฐœ๋ฐœ๋˜๊ณ 

์žˆ๋‹ค. Atom์˜ ์ตœ๋Œ€ ์žฅ์ ์€ ๊ตฌ๊ธ€ ํฌ๋กฌ(Google Chrome)์˜ ๋ชจ์ฒด๊ฐ€ ๋˜๊ณ  ์žˆ๋Š” ํฌ๋กœ๋ฏธ์›€(Chromium)

์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์—๋””ํ„ฐ๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, ์›น ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ…์ŠคํŠธ ์—๋””ํ„ฐ๊ฐ€ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ

์ด๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํฌํ•จํ•œ ๋‹ค์–‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ํ‚ค์›Œ๋“œ ๊ฐ•์กฐ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋ฉฐ, ์ž๋™

์™„์„ฑ ๊ธฐ๋Šฅ๋„ ์žˆ์–ด ํŽธ๋ฆฌํ•˜๋‹ค. ๋˜ํ•œ, ๋‹ค์–‘ํ•œ ํ™•์žฅ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

โ–ฒ Atom ์—๋””ํ„ฐ โ€“ ํ™”๋ฉด ๋ถ„ํ•  ๋ฐ ํƒญ ๋ถ„ํ•  ๊ธฐ๋Šฅ ์ง€์›

์ œ1์žฅ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ32

Page 55: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

โ–ฒ Atom ์—๋””ํ„ฐ โ€“ ํ‚ค์›Œ๋“œ ๊ฐ•์กฐ๋‚˜ ์ž๋™์™„์„ฑ ๊ธฐ๋Šฅ ์ง€์›

Atom์— ํ”Œ๋Ÿฌ๊ทธ์ธ ์ถ”๊ฐ€

Atom์˜ ํŒจํ‚ค์ง€(ํ”Œ๋Ÿฌ๊ทธ์ธ)๋Š” ๋งค์šฐ ํ’๋ถ€ํ•˜๋ฉฐ, ์›ํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ฒ€์ƒ‰ํ•œ ํ›„ Install ๋ฒ„ํŠผ์„ ํด๋ฆญ

ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์œˆ๋„์šฐ์—์„œ๋Š” ๋ฉ”์ธ ๋ฉ”๋‰ด์˜ โ€˜File

Settings Installโ€™์„ ํด๋ฆญํ•œ๋‹ค. Mac OS X์—์„œ๋Š” ๋ฉ”๋‰ด์˜ โ€˜Atom Preference Installโ€™์„ ํด

๋ฆญํ•œ๋‹ค.

โ€˜minimapโ€™ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค

โ–ฒ Atom ์—๋””ํ„ฐ โ€“ ํŒจํ‚ค์ง€ ๊ฒ€์ƒ‰ ํ™”๋ฉด

์น˜ํ•˜๋ฉด ์ „์ฒด ์†Œ์Šค์˜ ๋ฏธ๋ฆฌ

๋ณด๊ธฐ๋ฅผ ๋ฏธ๋‹ˆ๋งต์„ ํ†ตํ•ด ๋ณผ

์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, โ€˜file-iconsโ€™

ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•˜๋ฉด ํŠธ

๋ฆฌ ๋ทฐ ์•ˆ์˜ ์•„์ด์ฝ˜์„ ํŒŒ

์ผ์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๋ฐ”๊ฟ€

์ˆ˜ ์žˆ๋‹ค. ๊ทธ ์™ธ์—๋„ ๋ฐฐ์ƒ‰

๊ด€๋ จ ํ…Œ๋งˆ๋„ ํŒจํ‚ค์ง€๋กœ ๋ฐฐ

ํฌ๋˜๊ณ  ์žˆ์–ด์„œ ์‰ฝ๊ฒŒ ํ…Œ๋งˆ

๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

05 ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋†’์—ฌ ์ค„ ๋ชจ๋˜ํ•œ ์—๋””ํ„ฐ ์†Œ๊ฐœ 33

Page 56: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

Sublime Text โ€• ํ™˜์ƒ์ ์ธ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ๊ธฐ๋Šฅ์œผ๋กœ  ์‚ฌ๋ž‘์— ๋น ์ง€๊ฒŒ ๋œ๋‹ค๋Š” ํ™”์ œ์˜ ์—๋””ํ„ฐ

Sublime Text [URL] http://www.sublimetext.com/ [OS] ์œˆ๋„์šฐ/Mac OS X/๋ฆฌ๋ˆ…์Šค

[๋ผ์ด์„ ์Šค] (์œ ๋ฃŒ) 70๋‹ฌ๋Ÿฌ

Sublime Text(์„œ๋ธŒ๋ผ์ž„ ํ…์ŠคํŠธ)๋Š” ๊ฐ€๋ณ๊ณ  ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆ๊ฐ€ ๊ฐ€๋Šฅํ•˜์—ฌ ์ธ๊ธฐ๊ฐ€ ๋†’์€ ์—๋””ํ„ฐ๋‹ค. ์ž๋ฐ”

์Šคํฌ๋ฆฝํŠธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์ง€์›ํ•œ๋‹ค. ๋ธ”๋กœ๊ทธ์˜ ์†Œ๊ฐœ ๊ธฐ์‚ฌ๋ฅผ ๋ณด๋ฉด ์›น ๊ฐœ๋ฐœ,

๋ฃจ๋น„ ๋“ฑ์˜ LL ์–ธ์–ด(๊ฐ€๋ณ๊ณ  ๋น ๋ฅธ ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด) ๊ฐœ๋ฐœ๋กœ ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ์ž๋™์™„์„ฑ๊ณผ

๊ฐ์ข… ํ”„๋กœ๊ทธ๋žจ ์–ธ์–ด์˜ ํ‚ค์›Œ๋“œ ๊ฐ•์กฐ ๊ธฐ๋Šฅ ๋“ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์ดˆ์ ์„ ๋‘” ํ…์ŠคํŠธ ํŽธ์ง‘ ๊ธฐ๋Šฅ์ด ๋งค๋ ฅ

์ ์ด๋‹ค. ์ž„์˜์˜ ํŒŒ์ผ, ์‹ฌ๋ฒŒ, ํ–‰์„ ๋ฐ”๋กœ ์—ด ์ˆ˜ ์žˆ๋„๋ก ๊ณ ์•ˆ๋˜์–ด ์žˆ๋‹ค. 70๋‹ฌ๋Ÿฌ์˜ ์œ ๋ฃŒ ํ…์ŠคํŠธ ์—

๋””ํ„ฐ์ด์ง€๋งŒ, ์ €์žฅํ•  ๋•Œ ๋ผ์ด์„ ์Šค ๊ตฌ์ž… ๋ฉ”์‹œ์ง€๊ฐ€ ๊ฐ€๋” ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ ์ด์™ธ์— ๊ธฐ๋Šฅ ์ œํ•œ์ด ์—†์œผ๋‹ˆ

๋งˆ์Œ๊ป ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

โ–ฒ Sublime Text ์‹คํ–‰ ํ™”๋ฉด

์ œ1์žฅ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ34

Page 57: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

Sublime Text์— ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€

Sublime Text๋„ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•จ์œผ๋กœ์จ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ์›๊ณ  ์ง‘ํ•„ ์‹œ์ (2015๋…„ 6

์›”) 3,039๊ฐœ์˜ ํŒจํ‚ค์ง€๊ฐ€ ์ค€๋น„๋˜์–ด ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Sublime Text๋Š” ๊ธฐ๋ณธ์œผ๋กœ ํŒจํ‚ค์ง€ ์„ค์น˜ ๊ธฐ๋Šฅ์ด

์ค€๋น„๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค. ๋‹ค์Œ์˜ ์›น์‚ฌ์ดํŠธ๋ฅผ ์—ด์–ด ์ปค๋งจ๋“œ๋ฅผ ๋ณต์‚ฌํ•˜๊ณ , Sublime Text์˜ ์ฝ˜์†”์— ์ž…

๋ ฅํ•ด์•ผ ํ•œ๋‹ค.

Package Controlhttps://packagecontrol.io/installation

์ฝ˜์†”์„ ์—ด๋ ค๋ฉด ๋ฉ”๋‰ด์—์„œ View Show Console์„ ํด๋ฆญํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ž๋™์™„์„ฑ ๊ธฐ๋Šฅ์œผ๋กœ

๊ฐœ๋ฐœ์— ์œ ์šฉํ•œ ํŒจํ‚ค์ง€์ธ SublimeCodeIntel์„ ์„ค์น˜ํ•œ๋‹ค๊ณ  ํ•˜์ž. ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋Š” ์ˆœ์„œ๋Š” ๋‹ค

์Œ๊ณผ ๊ฐ™๋‹ค.

1. ๋ฉ”๋‰ด์—์„œ โ€˜Preferences Package Controlโ€™์„ ํด๋ฆญํ•œ๋‹ค.

2. โ€˜Package Control: Install Packageโ€™๋ฅผ ์ž…๋ ฅํ•˜๊ณ , Enter ํ‚ค๋ฅผ ๋ˆ„๋ฅธ๋‹ค.

3. ๊ทธ๋Ÿฌ๋ฉด ํŒจํ‚ค์ง€ ์„ค์น˜ ํ™”๋ฉด์ด ๋‚˜์˜ค๋Š”๋ฐ ํŒจํ‚ค์ง€ ์ด๋ฆ„์ธ โ€˜SublimeCodeIntelโ€™์„ ์ž…๋ ฅํ•˜์—ฌ ์„ค์น˜ํ•œ๋‹ค.

4. ํ•„์š”์— ๋”ฐ๋ผ ์—๋””ํ„ฐ๋ฅผ ์žฌ์‹œ์ž‘ํ•œ๋‹ค.

05 ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋†’์—ฌ ์ค„ ๋ชจ๋˜ํ•œ ์—๋””ํ„ฐ ์†Œ๊ฐœ 35

Page 58: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

โ–ฒ Sublime Text ํŒจํ‚ค์ง€ ์„ค์น˜

Sublime Text์—๋Š” ๋งŽ์€ ํŒจํ‚ค์ง€๊ฐ€ ์ค€๋น„๋˜์–ด ์žˆ์–ด ๊ฐ„๋‹จํ•œ ๋ช…๋ น ์ž…๋ ฅ์œผ๋กœ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜

์žˆ๋‹ค.

Brackets โ€• HTML ํŽธ์ง‘์— ํŠนํ™”๋œ ๋น›๋‚˜๋Š” ์—๋””ํ„ฐ

Brackets[URL] http://brackets.io/[OS] Windows / Mac OS X / Linux[๋ผ์ด์„ ์Šค] MIT License

Brackets(๋ธŒ๋ž˜ํ‚ท)์€ ํฌํ† ์ƒต, ์ผ๋Ÿฌ์ŠคํŠธ๋ ˆ์ดํ„ฐ๋กœ ์œ ๋ช…ํ•œ ์–ด๋„๋น„์˜ ์ฃผ๋„๋กœ ๊ฐœ๋ฐœ ์ค‘์ธ ์˜คํ”ˆ ์†Œ์Šค ํ…

์ŠคํŠธ ์—๋””ํ„ฐ๋‹ค. ์›น ๊ฐœ๋ฐœ์— ํŠนํ™”๋œ ์—๋””ํ„ฐ๋กœ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ‚ค์›Œ๋“œ ์กฐํšŒ, ์ฝ”๋“œ ์™„์„ฑ๊ณผ ๊ฐ™์€

๊ธฐ๋Šฅ์„ ๊ฐ–์ถ”๊ณ  ์žˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ๋ผ์ด๋ธŒ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ธฐ๋Šฅ๋„ ์žˆ๋‹ค. ์ด๋Š” ํŽธ์ง‘ํ•œ HTML ํŒŒ์ผ์„ ๋ฐ”๋กœ

๋ธŒ๋ผ์šฐ์ €์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ์ปค์„œ๋ฅผ HTML ์ฝ”๋“œ์˜ ํŠน์ • ๋ถ€๋ถ„์œผ๋กœ ์ด๋™์‹œํ‚ค๋ฉด

๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ทธ ๋ถ€๋ถ„์ด ๊ฐ•์กฐ๋˜์–ด ๋งค์šฐ ํŽธ๋ฆฌํ•˜๋‹ค.

์ œ1์žฅ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ36

Page 59: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

โ–ฒ Brackets ํ™”๋ฉด

โ–ฒ Brackets ๋ผ์ด๋ธŒ ํ”„๋ฆฌ๋ทฐ ํ™”๋ฉด

๊ทธ๋ฆฌ๊ณ  Adobe Photoshop CC ๋“ฑ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Extract ๊ธฐ๋Šฅ์„ Brackets์—์„œ๋„ ์‚ฌ์šฉํ• 

์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋„ ์žฅ์  ์ค‘ ํ•˜๋‚˜๋‹ค. ๋˜ํ•œ, ์—ญ์‹œ๋‚˜ ํ™•์žฅ ๊ธฐ๋Šฅ ๋งค๋‹ˆ์ €๊ฐ€ ์žˆ์–ด์„œ ๋ฐฐ์ƒ‰ ํ…Œ๋งˆ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ

๋‚˜ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ€ต ํŽธ์ง‘ โ€• ํŽธ๋ฆฌํ•œ ์ธ๋ผ์ธ ์—๋””ํ„ฐ

์ด ์ฑ…์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ์„ ์ฃผ๋กœ ๋‹ค๋ฃจ๋ฏ€๋กœ ์ด ์ฑ…์„ ์ฝ๋Š” ๋™์•ˆ์—๋Š” ๊ทธ๋‹ค์ง€ ์‚ฌ์šฉํ•  ์ผ์€ ์—†์ง€

๋งŒ, Brackets์˜ ๋งค์šฐ ์šฐ์ˆ˜ํ•œ ๊ธฐ๋Šฅ ํ•˜๋‚˜๋ฅผ ์†Œ๊ฐœํ•˜๊ณ ์ž ํ•œ๋‹ค. ๊ทธ๊ฒƒ์€ ์ธ๋ผ์ธ ์—๋””ํ„ฐ๋‹ค. <h3> ๋“ฑ

์˜ ํƒœ๊ทธ์— ์ปค์„œ๋ฅผ ๋‘” ์ƒํƒœ์—์„œ ๋ฉ”๋‰ด์˜ โ€˜๋„ค๋น„๊ฒŒ์ดํŠธ ํ€ต ํŽธ์ง‘โ€™์„ ํด๋ฆญํ•ด ๋ณด์ž. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค๋ฅธ ํŒŒ

์ผ์— ์„ ์–ธํ•œ CSS์˜ ํ•ด๋‹น ๋ถ€๋ถ„(<h3>์˜ ์ •์˜)์ด ํŒ์—… ์—๋””ํ„ฐ๋กœ ํ‘œ์‹œ๋œ๋‹ค. ์ด ํŒ์—…๋œ ๋ถ€๋ถ„์„ ํŽธ

์ง‘ํ•˜๋ฉด CSS ํŒŒ์ผ์˜ ๋‚ด์šฉ๋„ ๋ณ€๊ฒฝ๋œ๋‹ค. ์ด ์™ธ์—๋„ ๋ผ์ด๋ธŒ ํ”„๋ฆฌ๋ทฐ๋‚˜ ํ€ต ํŽธ์ง‘ ๋“ฑ Brackets์—๋Š”

05 ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋†’์—ฌ ์ค„ ๋ชจ๋˜ํ•œ ์—๋””ํ„ฐ ์†Œ๊ฐœ 37

Page 60: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

HTML ํŽธ์ง‘์— ํŠนํ™”๋œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ”๊ณ  ์žˆ๋‹ค.

โ–ฒ Brackets์˜ ํŽธ๋ฆฌํ•œ ์ธ๋ผ์ธ ์—๋””ํ„ฐ ๊ธฐ๋Šฅ

ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ

์ง€๊ธˆ๊นŒ์ง€ ์†Œ๊ฐœํ•œ ์—๋””ํ„ฐ๋“ค ์ด์™ธ์—๋„ PC ์ž์›์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€๋งŒ WebStorm(์›น์Šคํ†ฐ),

NetBeans(๋„ท๋นˆ์ฆˆ), Eclipse(์ดํด๋ฆฝ์Šค)์™€ ๊ฐ™์€ ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค. ์‚ฌ์‹ค, ์ง€

๊ธˆ๊นŒ์ง€ ์†Œ๊ฐœํ•œ ํ…์ŠคํŠธ ์—๋””ํ„ฐ ์ด์ƒ์œผ๋กœ ์ฝ”๋“œ ๋ณด์™„ ๊ธฐ๋Šฅ์ด ๋›ฐ์–ด๋‚˜๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๋™์  ํ”„

๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ผ์„œ ์ข€์ฒ˜๋Ÿผ ์ฝ”๋“œ ๋ณด์™„์ด ์–ด๋ ต๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ง€๊ธˆ๋ถ€ํ„ฐ ์†Œ๊ฐœํ•˜๋Š” ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์€

๊ฝค ํœผ๋ฅญํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ ๋ณด์™„ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ์ค€๋‹ค.

์ œ1์žฅ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ38

Page 61: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

WebStorm โ€• ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ์— ํŠนํ™”๋œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

WebStorm[URL] https://www.jetbrains.com/Webstorm/[OS] Windows / Mac OS X / Linux[๋ผ์ด์„ ์Šค] ๊ฐœ์ธ 5.9๋‹ฌ๋Ÿฌ/์›”, ์ƒ์—…์šฉ 12.9๋‹ฌ๋Ÿฌ/์›” (30์ผ๊ฐ„ ๋ฌด๋ฃŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)

โ–ฒ ์šฐ์ˆ˜ํ•œ ์ž๋™์™„์„ฑ ๊ธฐ๋Šฅ์˜ WebStorm

WebStorm์€ ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ธ IntelliJ(์ธํ…”๋ฆฌ์ œ์ด)์—์„œ ์›น ๊ฐœ๋ฐœ์— ํŠนํ™”๋œ ๊ธฐ๋Šฅ๋งŒ์„ ๋ชจ์€ ๊ฒƒ

์œผ๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐœ๋ฐœ์— ํŠนํ™”๋œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด๋‹ค. ์ด ์ฑ…์—์„œ๋Š” ์ฃผ๋กœ Node.js๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ

Node.js๋กœ ๊ฐœ๋ฐœํ•  ๋•Œ ๋„์›€์ด ๋  ๊ธฐ๋Šฅ์„ ๋งŽ์ด ๊ฐ–์ถ”๊ณ  ์žˆ๋‹ค. ์ฝ”๋“œ ์™„์„ฑ ๊ธฐ๋Šฅ๊ณผ ๋””๋ฒ„๊น…, ์„ฑ๋Šฅ ํ”„

๋กœํŒŒ์ผ๋ง ๋“ฑ ๋ฌด์ฒ™ ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ์ด ๊ตฌ๋น„๋˜์–ด ์žˆ๋‹ค.

05 ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋†’์—ฌ ์ค„ ๋ชจ๋˜ํ•œ ์—๋””ํ„ฐ ์†Œ๊ฐœ 39

Page 62: JS+Node.js Ni Yoru Web Crawler Net Agent Kaihatsu Technique

NetBeans โ€• ์ž๋ฐ”๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค์–‘ํ•œ ์›น ๊ฐœ๋ฐœ ์–ธ์–ด๋ฅผ ์ง€์›

NetBeans[URL] https://netbeans.org/[๋ผ์ด์„ ์Šค] CDDL,GPL2

ํ†ตํ•ฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ NetBeans(๋„ท๋นˆ์ฆˆ)๋Š” ์ž๋ฐ” ์ „์šฉ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์œผ๋กœ ๋„๋ฆฌ ์•Œ๋ ค์กŒ์ง€๋งŒ, C/C++์™€ PHP์—

ํŠนํ™”๋œ ๊ฐœ๋ฐœ ๋„๊ตฌ๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฐœ๋ฐœํ•˜๋ ค๋ฉด NetBeans์˜ PHP ๋ฒ„์ „์„ ์„ 

ํƒํ•ด์„œ ๋‹ค์šด๋กœ๋“œํ•œ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ Node.js๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด Node.js ํ”„๋กœ์ ํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

โ–ฒ NetBeans์—์„œ Node.js ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“  ํ™”๋ฉด

โ— ์ด ์ ˆ์—์„œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š”, ๊ทผ๋ž˜์— ์ฃผ๋ชฉ๋ฐ›๋Š” ์—ฌ๋Ÿฌ ์—๋””ํ„ฐ๋“ค์„ ์†Œ๊ฐœํ–ˆ๋‹ค.

โ— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ ์ด๋“ค ์—๋””ํ„ฐ๋ฅผ ๊ตณ์ด ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†๋‹ค.

โ— ์š”์ฆ˜ ๋‚˜์˜จ ์—๋””ํ„ฐ๋“ค์„ ๊ฒ€ํ† ํ•˜์—ฌ ๋ณธ์ธ์—๊ฒŒ ๊ฐ€์žฅ ์ž˜ ๋งž๋Š” ์—๋””ํ„ฐ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์€ ์ƒ์‚ฐ์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ํฌ๊ฒŒ ๋„

์›€์ด ๋œ๋‹ค.

์ด ์ ˆ์˜ ๋งˆ๋ฌด๋ฆฌ

์ œ1์žฅ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ40