Skip to content

Milal_ProjectBlog

HaeunJeong edited this page Nov 12, 2017 · 51 revisions

์‹œ์„  ๋ฐ€์•ŒํŒ€ ํ”„๋กœ์ ํŠธ ๋ธ”๋กœ๊ทธ


๋ชฉ์ฐจ

โ… . ์„œ๋ก  | ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

1. ๋ฐฐ๊ฒฝ

  • ์†Œ์™ธ๋œ ํœ ์ฒด์–ด ์‚ฌ์šฉ์ž
  • ํœ ์ฒด์–ด ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ์ •๋ณด๋Š” ์–ด๋””์—?

2. ๋ชฉํ‘œ

โ…ก. ๋ณธ๋ก  | ์ ์šฉํ•œ ๊ธฐ์ˆ 

1. Android native ํ”Œ๋žซํผ

  • ์™œ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ ์ผ๊นŒ?
  • Android ํ”Œ๋žซํผ์˜ ๋ณ€ํ™”: ์ด์   Kotlin

2. Web Crawling ๊ธฐ์ˆ 

  • Json, Jsoup

3. ์ด๋ฏธ์ง€ ๋ถ„์„ ๊ธฐ๋Šฅ

  • Tensorflow๋ž€
  • Inception V3
  • Android์™€ Tensorflow ์—ฐ๋™
  • ์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜

4. ๋ฆฌ๋ทฐ ์ž‘์„ฑ ๊ธฐ๋Šฅ

  • ์•ˆ๋“œ๋กœ์ด๋“œ & ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์—ฐ๋™๋ฐฉ๋ฒ•
  • ์ฃผ์š” ์ฝ”๋“œ

โ…ข. ๊ฒฐ๋ก 


โ… . ์„œ๋ก 

1. ๋ฐฐ๊ฒฝ

1) ์†Œ์™ธ๋œ ํœ ์ฒด์–ด ์‚ฌ์šฉ์ž

2017๋…„, ๋Œ€ํ•œ๋ฏผ๊ตญ์˜ ๋„์‹œ ๋ฌธํ™”๋Š” ์ด๋ฏธ ๋ˆˆ๋ถ€์‹œ๊ฒŒ ๋ฐœ์ „ํ•˜์˜€๋‹ค. ์„ธ๊ณ„ ์–ด๋””๋ฅผ ๋ณด์•„๋„, ์šฐ๋ฆฌ๋‚˜๋ผ์ฒ˜๋Ÿผ ๋ฒ„์Šค์™€ ์ง€ํ•˜์ฒ ๋กœ ๋„์‹œ ์–ด๋””๋“  ๋ˆ„๋นŒ ์ˆ˜ ์žˆ๊ณ , ๋Šฆ์€ ์‹œ๊ฐ„์—๋„ ์ฆ๊ธธ ๊ฑฐ๋ฆฌ ๋จน์„๊ฑฐ๋ฆฌ๊ฐ€ ์ฆ๋น„ํ•˜๊ณ , ์น˜์•ˆ ๋˜ํ•œ ํ›Œ๋ฅญํ•œ ์ด๋Ÿฐ ๊ณณ์€ ํ”์น˜ ์•Š๋‹ค.

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

์ฒซ์งธ๋Š” ๊ณ„๋‹จ ๋“ฑ์˜ ๋ฌผ๋ฆฌ์ ์ธ ์ด์œ ๋กœ ์ถœ์ž…์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์‹œ์„ค์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์ด๊ณ , ๋‘˜์งธ๋Š” ์ถœ์ž…์ด ๊ฐ€๋Šฅํ•œ ์‹œ์„ค์ด๋ผ๋„ ๊ทธ ์‚ฌ์‹ค์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์ œํ•œ์ ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํœ ์ฒด์–ด ์‚ฌ์šฉ์ž๋“ค์ด ์–ด๋–ค ์‹œ์„ค์„ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์‹œ์„ค์˜ ์ž…๊ตฌ์˜ ํ˜•ํƒœ(๋ฌธํ„ฑ์ด๋‚˜ ๊ฒฝ์‚ฌ๋กœ๊ฐ€ ์žˆ๋Š”์ง€, ๊ณ„๋‹จ์ด ์—†๋Š”์ง€, ํœ ์ฒด์–ด๊ฐ€ ๋“ค์–ด๊ฐˆ ๋งŒํผ ๋„“์€์ง€ ๋“ฑ)์™€ ์ฃผ์ฐจ์žฅ, ์žฅ์• ์ธ์šฉ ํ™”์žฅ์‹ค์˜ ์—ฌ๋ถ€ ๋“ฑ์˜ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ํœ ์ฒด์–ด ์‚ฌ์šฉ์ž๋Š” ์ผ์ƒ์—์„œ ๊ฐ€๋ณ๊ฒŒ ์™ธ์‹์„ ํ•˜๊ณ  ์‹ถ์€ ์ˆœ๊ฐ„์—๋„ ์ด๋Ÿฌํ•œ ์‹œ์„ค ์ •๋ณด๋“ค์ด ํ™•์ธ๋˜์ง€ ์•Š๋Š” ํ•œ, ์ƒˆ๋กœ์šด ์‹๋‹น์„ ์ฐพ์•„๊ฐˆ ์ˆ˜ ์—†๋‹ค.

2016๋…„ 10์›”, UN์€ โ€˜์ฃผ๊ฑฐ ๋ฐ ์ง€์†๊ฐ€๋Šฅํ•œ ๋„์‹œ๋ฐœ์ „์— ๊ด€ํ•œ ์œ ์—”ํšŒ์˜โ€™์—์„œ ๋นˆ๋ฏผ๊ณผ ์•ฝ์ž๋ฅผ ์œ„ํ•œ ๋„์‹œ์ธ โ€˜ํฌ์šฉ๋„์‹œโ€™๋ผ๋Š” ์˜์ œ๋ฅผ ๋˜์กŒ๋‹ค. ์ง€์†๊ฐ€๋Šฅํ•œ ๋„์‹œ๊ฐœ๋ฐœ์€ ๋ฌผ๋ก ์ด์š”, ๋„์‹œ์— ์‚ฌ๋Š” ์–ด๋– ํ•œ ์‹œ๋ฏผ๋„ ๋„์‹œ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์ ‘๊ทผ์—์„œ ๋ฐฐ์ œ๊ฐ€ ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ๊ฐœ๋…์ด๋‹ค. ํ•˜์ง€๋งŒ ํœ ์ฒด์–ด ์‚ฌ์šฉ์ž๋“ค์€ โ€˜์ •๋ณดโ€™๊ฐ€ ์—†๋‹ค๋Š” ์ด์œ ๋กœ, ๋งŽ์€ ๋„์‹œ ์„œ๋น„์Šค ์•ž์—์„œ ๋ฌธ์ „๋ฐ•๋Œ€ ๋‹นํ•˜๊ณ  ์žˆ๋‹ค.

2) ํœ ์ฒด์–ด ์‚ฌ์šฉ์ž๋“ค์ด ํ•„์š”๋กœ ํ•˜๋Š” ์ •๋ณด๋Š” ์–ด๋””์—?

ํœ ์ฒด์–ด ์‚ฌ์šฉ์ž๋“ค์€ ๊ฒฐ๊ตญ ์–ด๋– ํ•œ ์‹œ์„ค์ด โ€˜ํœ ์ฒด์–ด๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณดโ€™๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ์ด๋Ÿฌํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ณ ์ž ํ•˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ๋…ธ๋ ฅ๋“ค์ด ์žˆ์ง€๋งŒ, ๋ชจ๋‘ ํฐ ํ•œ๊ณ„์ ๋“ค์ด ์žˆ๋‹ค.

โ‘  ํœ ์ฒด์–ด ์‚ฌ์šฉ์ž๋“ค์˜ ์ปค๋ฎค๋‹ˆํ‹ฐ: ๋ถ„์‚ฐ๋˜๊ณ , ์ง€์†์„ฑ์ด ์—†๋Š” ํ”Œ๋žซํผ

ํœ ์ฒด์–ด ์‚ฌ์šฉ์ž๋“ค ์Šค์Šค๋กœ ๋งŒ๋“  ์ •๋ณด ๊ณต์œ  ์ปค๋ฎค๋‹ˆํ‹ฐ(ํฌํ„ธ์‚ฌ์ดํŠธ ์นดํŽ˜, ๋ฐด๋“œ ๋“ฑ)๋“ค์ด ์ด๋ฏธ ๋Œ€๋ถ€๋ถ„ ๊ฐ ์ง€์—ญ๋งˆ๋‹ค ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์–ด๋А ํ•˜๋‚˜๋„ ์ œ๋Œ€๋กœ ํ™œ์„ฑํ™”๋œ ๊ณณ์ด ์—†๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์–ด๋–ค ์ง€์—ญ์— ์žˆ๋Š” ์‹œ์„ค์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์ด๋ฏธ ๋งŽ์ด ์Œ“์—ฌ์žˆ์ง€ ์•Š์€ ์ด์ƒ, ๊ทธ๊ณณ์— ๊ฐ€์„œ ๊ฒ€์ƒ‰ํ•ด๋ดค์ž ์ž๋ฃŒ๊ฐ€ ์—†์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ์— ๊ฒฐ๊ตญ ์ง€์†์ ์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์˜ค๋„๋ก ํ•  ์ˆ˜ ์—†๋‹ค. ํ•˜๋‚˜์˜ ์ง€์†์ ์ธ ํ”Œ๋žซํผ์ด ์—†๊ธฐ์—, ํœ ์ฒด์–ด ์‚ฌ์šฉ์ž๋“ค์€ ์‹œ์„ค์„ ์ด์šฉํ•œ ํ›„ ํ›„๊ธฐ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์‹ถ๋”๋ผ๋„ ๊ณต์œ ํ•  ์ˆ˜ ์—†๋‹ค.

โ‘ก ํฌํ„ธ์‚ฌ์ดํŠธ ๊ฒ€์ƒ‰: ์ •๋ณด ์ฐพ๊ธฐ๊ฐ€ ๋ชจ๋ž˜์‚ฌ์žฅ์—์„œ ๋ฐ”๋Š˜ ์ฐพ๊ธฐ

์œ„์™€ ๊ฐ™์ด ํœ ์ฒด์–ด ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ์ •๋ณด์ œ๊ณต์„ ํ•˜๋Š” ์„œ๋น„์Šค๋“ค์ด ํ—ˆ์ˆ ํ•˜๊ธฐ์— ๋งŽ์€ ํœ ์ฒด์–ด ์‚ฌ์šฉ์ž๋“ค์€ ๊ทธ๋ƒฅ ๋ธ”๋กœ๊ทธ๋‚˜ ํฌํ„ธ์‚ฌ์ดํŠธ๋“ค์„ ๊ฒ€์ƒ‰ํ•˜๋ฉฐ ์ž์‹ ๋“ค์ด ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ์ฐพ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ํ•˜์ง€๋งŒ ์ˆ˜๋งŽ์€ ๊ธ€ ์ค‘ ์–ด๋А ๊ธ€์— ์ž…๊ตฌ์‚ฌ์ง„์ด ์žˆ๋Š”์ง€, ์ฃผ์ฐจ์žฅ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๊ฒ€์ƒ‰ ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋œ๋‹ค. ๋˜ํ•œ ๊ธ€์„ ์“ด ๊ธ€์“ด์ด๋Š” ๋Œ€๋ถ€๋ถ„ ํœ ์ฒด์–ด ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹ˆ๊ธฐ์— ๊ทธ๋“ค์˜ ์ž…์žฅ์„ ๊ณ ๋ คํ•œ ์ƒ์„ธํ•œ ์ •๋ณด๋ฅผ ์•Œ ๊ธธ์ด ์—†๋‹ค. ๊ฐ€๋ น, ์–ด๋А ํฌ์ŠคํŒ…์—์„œ ์‹๋‹น์˜ ์ž…๊ตฌ์‚ฌ์ง„์„ ๋ณด๊ณ  ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๊ฒ ๋‹ค๊ณ  ํŒ๋‹จ์„ ํ•˜๊ณ  ๋ฐฉ๋ฌธ์„ ํ•˜๋”๋ผ๋„, ๋‚ด๋ถ€ ๋ฌธ์— ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฌธํ„ฑ์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

โ‘ข ์ง€์ž์ฒด๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ณต๊ณต ์‚ฌ์ดํŠธ ๋ฐ DB: ๋ถ€์กฑํ•˜๊ณ , ์˜ค๋ž˜๋œ ์ •๋ณด / ์ ‘๊ทผ์„ฑ ๋ถ€์กฑ

์„œ์šธ, ๋ถ€์‚ฐ, ๋Œ€๊ตฌ์™€ ๊ฐ™์€ ๋Œ€๋„์‹œ๋“ค์€ ์ง€์ž์ฒด์—์„œ(๋˜๋Š” ์™ธ๋ถ€ ๋‹จ์ฒด๋ฅผ ์ง€์›ํ•จ์œผ๋กœ์จ) ํœ ์ฒด์–ด ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ์‹œ์„ค์ •๋ณด ์ œ๊ณต ์‚ฌ์ดํŠธ๊ฐ€ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ์‚ฌ์ดํŠธ๋“ค์€ ์šด์˜ํ•˜๋Š” ๋ช‡๋ช‡์— ์˜ํ•ด์„œ๋งŒ ์‹œ์„ค์ •๋ณด๊ฐ€ ์ œ๊ณต๋˜๊ธฐ์— ๊ทธ ์ˆ˜๊ฐ€ ํ„ฑ์—†์ด ๋ถ€์กฑํ•˜๋‹ค. ๋Œ€๊ตฌ์‹œ์˜ ์›น์‚ฌ์ดํŠธ๋งŒ ๋ณด๋”๋ผ๋„, ๋Œ€๊ตฌ์‹œ ๋‚ด์— ๋“ฑ๋ก๋œ ์ „์ฒด ์ผ์‹ ์Œ์‹์  ์ˆ˜๊ฐ€ 1531๊ฐœ ์ธ๋ฐ(๋Œ€๊ตฌ๊ด‘์—ญ์‹œ ๊ณต๊ณต๋ฐ์ดํ„ฐ ํฌํ„ธ ์ œ๊ณต), ์‚ฌ์ดํŠธ์— ๋“ฑ๋ก๋œ ์‹๋‹น ์ˆ˜๋Š” ๊ณ ์ž‘ 18๊ฐœ๋ฟ์ด๋‹ค. ๋˜ํ•œ ์‹๋‹น์€ ํ•˜๋ฃจ์—๋„ ์ˆ˜๋ฐฑ ๊ฐœ๊ฐ€ ๋งํ•˜๊ณ  ๋˜ ์ƒˆ๋กœ ์ƒ๊ธฐ๋Š”๋ฐ, ๊ณต๊ณต์‚ฌ์ดํŠธ๋Š” ๊พธ์ค€ํ•˜๊ฒŒ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜๊ณ  ์žˆ์ง€ ์•Š๊ธฐ์— ์ •๋ณด์˜ ์‹ ๋ขฐ๋„๊ฐ€ ๋งŽ์ด ๋–จ์–ด์ง„๋‹ค. ์ง€์ž์ฒด๋Š” ๋˜ํ•œ ๋„์‹œ ๋‚ด ๋Œ€๋ถ€๋ถ„ ์‹œ์„ค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ DBํ™”ํ•˜์—ฌ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ, ์ด๋Š” ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๊ทผํ•˜๊ธฐ ์–ด๋ ต๊ณ , ํœ ์ฒด์–ด ์ด์šฉ์„ฑ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์—†๋‹ค.

๊ฒฐ๋ก 

์œ„์˜ 3๊ฐ€์ง€์˜ ๋ฐฉ์•ˆ์˜ ํ•œ๊ณ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ํœ ์ฒด์–ด ์‚ฌ์šฉ์ž๋“ค์„ ์œ„ํ•œ ์ •๋ณด๋Š” ์–ด๋”˜๊ฐ€ ์žˆ๋”๋ผ๋„ ์ฐพ๊ธฐ๊ฐ€ ์–ด๋ ต๊ณ , ๋˜ ๊ทธ๋“ค๋งŒ์˜ ์ •๋ณด๊ฐ€ ๋ชจ์—ฌ๋“œ๋Š” ์ง€์†์ ์ธ ํ”Œ๋žซํผ์ด ์—†๋‹ค.

2. ๋ชฉํ‘œ: ํœ ์ฒด์–ด ์‚ฌ์šฉ์ž๋“ค์˜ ๋ฆฌ๋ทฐ๊ฐ€ ๊ณต์œ ๋˜๋Š” ์ง€์†์ ์ธ ํ”Œ๋žซํผ

๊ฐ ๋„์‹œ์˜ ํœ ์ฒด์–ด ์‚ฌ์šฉ์ž๋“ค์ด ๋‹ค ํ•จ๊ป˜ ๊ณต์œ ํ•˜๋Š” ํ”Œ๋žซํผ์ด ํ•„์š”ํ•˜๋‹ค. ์™œ๋ƒํ•˜๋ฉด, ํœ ์ฒด์–ด ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ๊ฐ€์žฅ ์ข‹๊ณ  ๋ฏฟ์„ ๋งŒํ•œ ์ •๋ณด๋Š” โ€˜ํœ ์ฒด์–ด ์‚ฌ์šฉ์ž, ๋˜๋Š” ํœ ์ฒด์–ด ์‚ฌ์šฉ์ž์˜ ์ด์›ƒโ€™์ด ์Šค์Šค๋กœ ์ƒ์‚ฐํ•œ ์ •๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ถ„์‚ฐ๋œ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ํ™œ๋™ํ•˜๊ฑฐ๋‚˜, ์•„์ง ํ™œ๋™ํ•˜์ง€ ์•Š๋Š” ํœ ์ฒด์–ด ์‚ฌ์šฉ์ž๋“ค์„ ํ•˜๋‚˜๋กœ ๋ชจ์„๋งŒํ•œ โ€˜์œ ์ธ์ฑ…โ€™์ด ์žˆ๋Š” ํ”Œ๋žซํผ์ด ํ•„์š”ํ•˜๋‹ค.

์œ ์ธ์ฑ… โ‘  ๊ธฐ์กด์— ์กด์žฌํ•˜๋Š” ์ •๋ณด๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„์ค€๋‹ค.

๊ธฐ์กด์— ํฌํ„ธ์‚ฌ์ดํŠธ๋ฅผ ๋Œ๋ฉฐ ์ž…๊ตฌ ์‚ฌ์ง„, ๋‚ด๋ถ€ ๋ชจ์Šต, ์ฃผ์ฐจ์žฅ ์œ„์น˜๋ฅผ ์ฐพ๋А๋ผ ์†Œ์š”ํ•˜๊ณ  ์žˆ๋Š” ๊ฒ€์ƒ‰ ์‹œ๊ฐ„์„ ํŒŒ๊ฒฉ์ ์œผ๋กœ ๋‹จ์ถ•์‹œ์ผœ์•ผ ํ•œ๋‹ค.

์œ ์ธ์ฑ… โ‘ก ์ง€์ž์ฒด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์‹œ์„ค ์ •๋ณด DB๊ฐ€ ์ œ๊ณต ๋œ๋‹ค.

์ง€์ž์ฒด๊ฐ€ ์‹œ์„ค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฐ›์„ ๋•Œ, ํœ ์ฒด์–ด ์ด์šฉ์„ฑ์— ๋Œ€ํ•œ ์ •๋ณด๋„ ์ œ๊ณต๋ฐ›๊ณ , ๊ทธ ์ •๋ณด์— ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํœ ์ฒด์–ด ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ๋งค์šฐ ์œ ์šฉํ•  ๊ฒƒ์ด๋‹ค.

๊ฐœ๊ด„ ํ™”๋ฉด ๋ฐ ์‹œ์Šคํ…œ ๋ธ”๋ก๋„

์ตœ์ข… main ํ™”๋ฉด

๋ธ”๋ก๋„


โ…ก. ๋ณธ๋ก 

1. Android Native App

1) ์™œ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ ์ผ๊นŒ?

์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์‚ฌ์šฉํ•˜๋Š” ์Šค๋งˆํŠธํฐ์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” ๊ฐœ๋ฐœ ๋ฐฉ์‹์—๋Š” ํฌ๊ฒŒ 3๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ, ์›น ์•ฑ, ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•ฑ ๋ฐฉ์‹์ธ๋ฐ์š”, ์ด 3๊ฐ€์ง€ ๋ฐฉ์‹์˜ ์žฅ๋‹จ์  ๋ฐ ํŠน์ง• ๋“ค์€ ๊ฐ€์Šค๋ฆฌ ํ”„๋กœ์ ํŠธ ๋ธ”๋กœ๊ทธ ์—์„œ ์ž˜ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์œผ๋‹ˆ ์—ฌ๊ธฐ์„œ๋Š” ๋„˜์–ด๊ฐ€๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ์ค‘ ์ €ํฌ๊ฐ€ ํƒํ•œ ๊ฐœ๋ฐœ ๋ฐฉ์‹์€ ๋ฐ”๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์ด๊ณ ์š”, ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ์Šค๋งˆํŠธํฐ OS์ธ Android์™€ iOS ์ค‘ Android ๊ธฐ๋ฐ˜์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์ž…๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ์•ฑ์˜ ์žฅ์ ์€

  • ๋น ๋ฅธ ๋กœ๋”ฉ ์†๋„
  • ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ ์—†์ด๋„ ๊ธฐ๋Šฅ ์ž‘๋™ ๊ฐ€๋Šฅ
  • ์Šค๋งˆํŠธํฐ์˜ ํ•˜๋“œ์›จ์–ด์˜ ํšจ๊ณผ์  ํ™œ์šฉ
    ์„ ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ €ํฌ ํ”„๋กœ์ ํŠธ์˜ ๋Œ€ํ‘œ์  ๊ธฐ๋Šฅ์ธ '์ž…๊ตฌ ์ด๋ฏธ์ง€ ๋ถ„์„'๊ณผ '๋ฆฌ๋ทฐ ๋‚จ๊ธฐ๊ธฐ'๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋น ๋ฅธ ๋ฐ˜์‘ ์†๋„๊ฐ€ ํ•„์š”ํ–ˆ๊ณ , ๋ฆฌ๋ทฐ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์Šค๋งˆํŠธํฐ์˜ ํ•˜๋“œ์›จ์–ด์ธ ์นด๋ฉ”๋ผ์™€ ์—ฐ๋™ํ•˜์—ฌ ์‚ฌ์ง„์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์ด ์—†์„ ๋•Œ์—๋„ user๊ฐ€ ๋ฏธ๋ฆฌ ์ €์žฅํ•œ ์ •๋ณด ์ •๋„๋Š” ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค๋Š” ์˜๊ฒฌ๋„ ์žˆ์—ˆ์ฃ .

๋ฌผ๋ก , ์•„์ดํฐ์„ ํ˜ธํ™˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” iOS ๋ฒ„์ „์˜ ์•ฑ์„ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ์ง€๋งŒ, ์ €ํฌ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์ด ๊ฐ€์ง„ ์žฅ์ ์ด ์ด ํ”„๋กœ์ ํŠธ์— ๊ฐ€์žฅ ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์Šค๋งˆํŠธํฐ ์šด์˜์ฒด์ œ ์ ์œ ์œจ ์ด ์ž๋ฃŒ๋Š” ์‹œ์žฅ ์กฐ์‚ฌ ์—…์ฒด ๊ฐ€ํŠธ๋„ˆ๊ฐ€ ๋ฐœํ‘œํ•œ ์ž๋ฃŒ๋กœ 2017๋…„ ๊ธฐ์ค€, ์Šค๋งˆํŠธํฐ ์šด์˜์ฒด์ œ์˜ ์‹œ์žฅ ์ ์œ ์œจ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ ํ˜„์žฌ, Android๊ฐ€ 86%, iOS๊ฐ€ 14%๋กœ ์Šค๋งˆํŠธํฐ ์šด์˜์ฒด์ œ๋Š” ์‚ฌ์‹ค์ƒ ์ด ๋‘ ๊ฐ€์ง€๋กœ ์–‘๋ถ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ €ํฌ๋Š” ๊ทธ๋ฆฌํ•˜์—ฌ ์Šค๋งˆํŠธํฐ ์‹œ์žฅ์˜ ๊ฐ€์žฅ ํฐ ๋ถ€๋ถ„์„ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋Š” Android ํ”Œ๋žซํผ ๊ธฐ๋ฐ˜์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์•ฑ์œผ๋กœ ์ ‘๊ทผํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

2) Android ํ”Œ๋žซํผ์˜ ๋ณ€ํ™”: ์ด์   Kotlin

Android ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š” ์–ธ์–ด๋ฅผ JAVA๋กœ ์•Œ๊ณ ๊ณ„์‹œ๋Š” ๋ถ„์ด ์•„์ง ๋งŽ์œผ์‹คํ…๋ฐ์š”, 2017๋…„ 5์›” 18์ผ, ๊ตฌ๊ธ€์€ Android์˜ ๊ณต์‹ ์–ธ์–ด๋Š” ์ด์ œ Kotlin ์ด๋ผ๋Š” ์ค‘๋Œ€ ๋ฐœํ‘œ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.

Kotlin์€ JetBrains์‚ฌ์—์„œ ๋งŒ๋“  ์˜คํ”ˆ์†Œ์Šค ๊ฐœ๋ฐœ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. Kotlin์˜ ์žฅ์ ์€ ๊ฐ„๊ฒฐํ•จ, ์•ˆ์ „ํ•จ, ๋‹ค์žฌ๋‹ค๋Šฅํ•จ, ํ˜ธํ™˜์„ฑ๋“ฑ์„ ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Java๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ฝ”๋“œ์˜ ์–‘์ด ์ค„์–ด๋“ค๊ณ , ๋„ ํฌ์ธํŠธ ์˜ˆ์™ธ(NullPointerExceptions)์— ๋Œ€ํ•œ ์•ˆ์ „์„ฑ์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ Java์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , JVM์ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ์ด ๋ฉ๋‹ˆ๋‹ค.

Kotlin์˜ ์žฅ์ ์— ๋Œ€ํ•ด ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Java์—์„œ๋Š” Click์‹œ์— doSomething()์„ ํ•˜๋Š” ๋ฒ„ํŠผ์„ ๊ตฌํ˜„ํ•  ๋•Œ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ๋‹ค๋ฉด

button.setOnClickListener(new View.OnClickListener(){

    @Override

    public void onClick(View v){

        doSomething();

    }

});

(์ƒ์„ฑ์ž new๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ์•ˆ์— ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ์‹)

button.setOnClickListener { 

        doSomething()
}

Kotlin์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ๋ฐ”๋€๋‹ˆ๋‹ค. ํ›จ์”ฌ ์ง๊ด€์ ์ด๊ณ  ๊ฐ„๊ฒฐํ•˜์ฃ !

๋˜ํ•œ Kotlin์—์„œ๋Š” ?๋ฅผ ํ†ตํ•ด nullable ์กฐ๊ฑด์„ ๋‹ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•จ์œผ๋กœ์จ null์•ˆ์ •์„ฑ์„ ์ฆ๊ฐ€์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

val maybeString: String? = โ€œHello"

maybeString?.length

(์ถœ์ฒ˜: https://academy.realm.io/kr/posts/kotlin-does-java-droidcon-boston-2017-gonda)

๋ฌผ์Œํ‘œ๋Š” ๋ฐ”๋กœ 'null์ผ ์ˆ˜ ์žˆ๋‹ค' ๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์“ธ ๊ฒฝ์šฐ ๊ฐ์ฒด๊ฐ€ null์ด ์•„๋‹Œ ๊ฒฝ์šฐ .length๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์•„๋‹ˆ๋ฉด null์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Java์™€์˜ ํ˜ธํ™˜๋„ ์™„๋ฒฝํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด Kotlin์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ๊ทธ๋Œ€๋กœ Java์—์„œ callํ•˜๊ฑฐ๋‚˜, ๊ทธ ๋ฐ˜๋Œ€๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

// Calling Java code from Kotlin

class KotlinClass {

    fun kotlinDoSomething() {

        val javaClass = JavaClass()

        javaClass.javaDoSomething()

        println(JavaClass().prop)

    }
}

==================================

// Calling Kotlin code from Java

public class JavaClass {

    public String getProp() { return "Hello"; }

    public void javaDoSomething() {

        new KotlinClass().kotlinDoSomething();

    }
}

Kotlin ๊ณต์‹ ๋ธ”๋กœ๊ทธ์— ์˜ํ•˜๋ฉด, Kotlin์˜ ๋ชฉํ‘œ๋Š” ํ’€์Šคํƒ ์›น ๊ฐœ๋ฐœ, Android์™€ iOS์•ฑ, ๊ทธ๋ฆฌ๊ณ  ์ž„๋ฒ ๋””๋“œ์™€ IoT๋“ฑ ๋ชจ๋“  ๊ฐœ๋ฐœ์„ ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์—์„œ Kotlin์œผ๋กœ๋งŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํ•œ๋งŒํผ Kotlin์€ ๊พธ์ค€ํžˆ ์˜์—ญ์„ ๋„“ํ˜€๊ฐ€๋ฉฐ ๋ฐœ์ „ํ•ด๊ฐ€๊ณ ์žˆ๋Š” ์ถ”์„ธ์ž…๋‹ˆ๋‹ค.

์ €ํฌ๊ฐ€ Android ๊ฐœ๋ฐœ์„ ๋“ค์–ด๊ฐ„ ์‹œ์ ์—๋Š” Kotlin์ด ๋ฐœํ‘œ๋˜์ง€ ์•Š์•˜์—ˆ๊ณ , ์–ผ๋งˆ ์ „๊นŒ์ง€๋งŒ ํ•ด๋„ ์ฐธ๊ณ ํ• ๋งŒํ•œ ์†Œ์Šค๊ฐ€ ๋งŽ์ง€ ์•Š์•˜๊ธฐ์— ์ €ํฌ ํ”„๋กœ์ ํŠธ์—๋Š” ์ ์šฉํ•˜์ง€ ์•Š์•˜์ง€๋งŒ, ์•ž์œผ๋กœ Android๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฐœ๋ฐœ์ž๋ผ๋ฉด Kotlin์˜ ์‚ฌ์šฉ๋ฒ•์„ ์ตํžˆ๋Š” ๊ฒƒ์€ ํ•„์ˆ˜๋ผ ํ•  ์ˆ˜ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค!

2. Web Crawling ๊ธฐ์ˆ 

1) Web Crawling์ด๋ž€

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

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

์ €ํฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ณต๊ณต์‚ฌ์ดํŠธ๋ฅผ ํฌ๋กค๋ง ํ•˜์—ฌ, ํœ ์ฒด์–ด ์‚ฌ์šฉ์ž๋“ค์ด ํ•„์š”๋กœ ํ•˜๋Š” ์ •๋ณด๋งŒ์„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋‚˜ํƒ€๋‚ด์–ด ์ฃผ๊ธฐ ์œ„ํ•ด ์ด ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ด‘์—ญ์‹œ ๊ฐ™์€ ๋Œ€๋„์‹œ์—์„œ๋Š” ์ง€๋ฐฉ์ž์น˜๋‹จ์ฒด์—์„œ ํœ ์ฒด์–ด ์‚ฌ์šฉ์ž๋“ค์„ ์œ„ํ•œ ์‹œ์„ค์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์›นํŽ˜์ด์ง€๋ฅผ ์šด์˜ํ•˜๋Š” ๊ณณ์ด ์žˆ๋Š”๋ฐ์š”, (๋Œ€ํ‘œ์ ์œผ๋กœ ์„œ์šธํŠน๋ณ„์‹œ์˜ โ€˜ํ•จ๊ป˜ ์„œ์šธ(http://disability.seoul.go.kr)โ€™, ๋Œ€ํ•œ๋ฏผ๊ตญ ๊ด€๊ด‘๊ณต์‚ฌ์˜ โ€˜๋Œ€ํ•œ๋ฏผ๊ตญ ๊ตฌ์„๊ตฌ์„(http://korean.visitkorea.or.kr)โ€™, ๋Œ€๊ตฌ๊ด‘์—ญ์‹œ์˜ โ€˜ํœ ์ฒด์–ด๋กœ ์ฆ๊ธฐ๋Š” ๋Œ€๊ตฌ๊ด€๊ด‘(http://wheeltour.or.kr)โ€™, ์šธ์‚ฐ์‹œ์˜ โ€˜์žฅ์• ์ธํŽธ์˜์‹œ์„ค ์ •๋ณด ๊ฒ€์ƒ‰(http://usbf.kr)โ€™ ๋“ฑ)

์ด๋Ÿฌํ•œ ์‚ฌ์ดํŠธ๋ฅผ ๋’ค์ ธ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์‹œ์„ค์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ์žˆ์„ ์‹œ, ์ •๋ณด๋ฅผ Jsonํ˜•ํƒœ๋กœ ํฌ๋กค๋งํ•˜์—ฌ ๊ฐ€์ ธ์™€์„œ ํŒŒ์‹ฑํ•˜๊ณ , ํ•„์š”ํ•œ ์ •๋ณด๋งŒ์„ ๊ฐ€๊ณตํ•˜์—ฌ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์–ด๋–ป๊ฒŒ ์›น์—์„œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ง€๋ฅผ ์‚ดํŽด๋ณผ๊ฒŒ์š”.

2) Jsoup ์‚ฌ์šฉ๋ฒ•

Java์—๋Š” Jsoup๋ผ๋Š” ํŒŒ์‹ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

// ๊ฐ„๋žตํ™”๋œ GET, POST

Document google1 = Jsoup.connect("http://www.google.com").get();

Document google2 = Jsoup.connect("http://www.google.com").post();


// Response๋กœ๋ถ€ํ„ฐ Document ์–ป์–ด์˜ค๊ธฐ

Connection.Response response = Jsoup.connect("http://www.google.com")

                                    .method(Connection.Method.GET)

                                    .execute();

Document google3 = response.parse();

Connect๋ฅผ ์ด์šฉํ•˜์—ฌ URL์— ์ ‘์†ํ•˜๊ณ  ์ •๋ณด๋ฅผ Get์ด๋‚˜ Post ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Document๋ฅผ ์–ป์–ด์˜ต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š๊ณ  Response๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ›์•„์˜ฌ ์ˆ˜๋„ ์žˆ์ง€์š”.

Document document = response.parse();

String html = document.html();

String text = document.text();

Document๋Š” text()๋‚˜ html()์ด๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ String์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

html()์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž ๋ชจ๋“œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ํŽ˜์ด์ง€์˜ html ํƒœ๊ทธ์™€ ๊ทธ ์•ˆ์˜ content๋ฅผ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋˜๊ณ ์š”, text()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํƒœ๊ทธ ์‚ฌ์ด์˜ ๋ฌธ์ž์—ด๋งŒ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

ํŠน์ •ํ•œ html์š”์†Œ๋ฅผ ์–ป์–ด์˜ค๋ ค๋ฉด, select("query") ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Document googleDocument = response.parse();

Element btnK = googleDocument.select("input[name=btnK]").first();

String btnKValue = btnK.attr("value");

(์ถœ์ฒ˜: http://partnerjun.tistory.com/42)


3. Tensorflow๋ฅผ ์ด์šฉํ•œ ์ž…๊ตฌ ์ด๋ฏธ์ง€ ๋ถ„์„

1) Tensorflow ๋ž€

๊ตฌ๊ธ€์—์„œ ์ œ๊ณตํ•˜๋Š” Deep Learning ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ Tensorflow ํ•œ๋ฒˆ์ฏค์€ ๋‹ค๋“ค ๋“ค์–ด๋ณด์…จ์„ ๊ฑฐ๋ผ ์ƒ๊ฐํ•ด์š”! Tensorflow๋Š” ๊ตฌ๊ธ€ ๋ธŒ๋ ˆ์ธํŒ€์—์„œ ๋งŒ๋“  ์˜คํ”ˆ์†Œ์Šค ์†Œํ”„ํŠธ์›จ์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋จธ์‹ ๋Ÿฌ๋‹์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์–ด์š”. Tensorflow๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ์™€ iOS ๊ฐ™์€ ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์€ ๋ฌผ๋ก  ๋ฆฌ๋ˆ…์Šค, MacOS์˜ ๋ฐ์Šคํฌํƒ‘์ด๋‚˜ ์„œ๋ฒ„ ์‹œ์Šคํ…œ์—๋„ ๊ตฌ๋™๋  ์ˆ˜ ์žˆ์–ด์š”. ๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ ๊ทธ๋ž˜ํ”„(Data Flow Graph) ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ ๊ทธ๋ž˜ํ”„๋Š” ์ˆ˜ํ•™ ๊ณ„์‚ฐ๊ณผ ๋ฐ์ดํ„ฐ์˜ ํ๋ฆ„์„ ๋…ธ๋“œ(Node) ์™€ ์—ฃ์ง€(Edge)๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„(Directed Graph)๋กœ ํ‘œํ˜„ํ•ด์š”. ๋…ธ๋“œ๋Š” ์ˆ˜ํ•™์  ๊ณ„์‚ฐ, ๋ฐ์ดํ„ฐ ์ž…์ถœ๋ ฅ, ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ์˜ ์ฝ๊ธฐ ์ €์žฅ ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์—ฃ์ง€๋Š” ๋…ธ๋“œ๋“ค ๊ฐ„ ๋ฐ์ดํ„ฐ์˜ ์ž…์ถœ๋ ฅ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ์—ฃ์ง€๋Š” ๋™์  ์‚ฌ์ด์ฆˆ์˜ ๋‹ค์ฐจ์› ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด์„ ์‹ค์–ด๋‚˜๋ฅด๋Š”๋ฐ, ์ด ๋‹ค์ฐจ์› ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด์„ ํ…์„œ(Tensor)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ Tensorflow๋ผ๋Š” ์ด๋ฆ„์ด ์ง€์–ด์กŒ์Šต๋‹ˆ๋‹ค.

Tensorflow ํŠน์ง•

  • ๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ ๊ทธ๋ž˜ํ”„๋ฅผ ํ†ตํ•œ ํ’๋ถ€ํ•œ ํ‘œํ˜„๋ ฅ
  • ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด CPU/GPU ๋ชจ๋“œ๋กœ ๋™์žฅ
  • ์•„์ด๋””์–ด ํ…Œ์ŠคํŠธ์—์„œ ์„œ๋น„์Šค ๋‹จ๊ณ„๊นŒ์ง€ ์ด์šฉ ๊ฐ€๋Šฅ
  • ๊ณ„์‚ฐ ๊ตฌ์กฐ์™€ ๋ชฉํ‘œ ํ•จ์ˆ˜๋งŒ ์ •์˜ํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋ฏธ๋ถ„ ๊ณ„์‚ฐ์„ ์ฒ˜๋ฆฌ
  • Python/C++๋ฅผ ์ง€์›ํ•˜๋ฉฐ, SWIG๋ฅผ ํ†ตํ•ด ๋‹ค์–‘ํ•œ ์–ธ์–ด ์ง€์› ๊ฐ€๋Šฅ

Tensorflow ์„ค์น˜ ๊ณผ์ •

  • UNIX ๊ณ„์—ด OS (Linux/Max OSX)
  • GPU๋ฒ„์ „์€ Linux ๋งŒ ์ง€์›

โ‘  PIP ์„ค์น˜

ํ…์„œํ”Œ๋กœ์šฐ๋ฅผ ์„ค์น˜ํ•˜๊ธฐ์— ์•ž์„œ PIP๋ฅผ ์„ค์น˜ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โ‘ก Tensorflow ์„ค์น˜

ํ…์„œํ”Œ๋กœ์šฐ ํŒŒ์ผ ๋ฐ›์„ ์ฃผ์†Œ๋ฅผ ์„ธํŒ…ํ•ฉ๋‹ˆ๋‹ค. Python ๋ฒ„์ „์— ๋”ฐ๋ผ ๋งž์ถ”์–ด ๊ณจ๋ผ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ ๋‹ค์Œ, ํ…์„œํ”Œ๋กœ์šฐ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

โ‘ข ํ…Œ์ŠคํŠธ ์ฝ”๋“œ

(์ถœ์ฒ˜: http://blog.danggun.net/4064)

2) Inception V3๋ž€

Inception V3๋Š” ImageNet์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ›ˆ๋ จ๋œ ๊ตฌ๊ธ€์ด ๊ฐœ๋ฐœํ•œ ์ด๋ฏธ์ง€ ์ธ์‹์˜ ๊ฐ€์žฅ ์ตœ์‹  ๋ชจ๋ธ์ด์—์š”. ImageNet์€ ๊ตฌ์กฐํ™”๋œ ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋˜์š”.

Inception V3 ๋ชจ๋ธ์„ ๋‹ค์šด๋ฐ›์€ ๋’ค ์‚ฌ์ง„์„ ์ธํ’‹์œผ๋กœ ์ฃผ์–ด ๋ถ„๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค.

์œ„์˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ๋” ์ดํ•ด๊ฐ€ ์‰ฌ์šธ ํ…๋ฐ์š”, Inception V3 ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜ ๋ผ๋ฒจ๊ณผ ํผ์„ผํŠธ๋กœ ๊ฐ๊ฐ ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ ํ•™์Šต์ด ๋˜์–ด์žˆ๋Š” ๋ชจ๋ธ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ˆœํžˆ ์‚ฌ์ง„์„ ์ธํ’‹์œผ๋กœ ์ฃผ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์œ„์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €ํฌ์˜ ๋ชฉ์ ์ธ ์ž…๊ตฌ ํŒ๋ณ„์„ ์œ„ํ•ด์„œ ๋ฏธ๋ฆฌ ๋ชจ์•„๋‘” ์ž…๊ตฌ ์‚ฌ์ง„ ์•ฝ 1500์žฅ๊ณผ ์ž…๊ตฌ๊ฐ€ ์•„๋‹Œ ์‚ฌ์ง„ ์•ฝ 1500์žฅ์„ ๊ฐ€์ง€๊ณ  Inception V3 ๋ชจ๋ธ๋กœ ๋ถ„๋ฅ˜ํ•ด ์ž…๊ตฌ ์‚ฌ์ง„์ผ ๋•Œ์— ์–ด๋–ค ๋ผ๋ฒจ์ด ๋†’์€ ํ™•๋ฅ ๋กœ ๋‚˜ํƒ€๋‚˜๋Š”์ง€ ์‹คํ—˜ํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ž…๊ตฌ๊ฐ€ ์•„๋‹Œ ์‚ฌ์ง„๋“ค์„ ๋Œ๋ ธ์„ ๋•Œ๋„ ๋™์ผํ•˜๊ฒŒ ์‹คํ—˜ํ•ด๋ณด์•˜์–ด์š”.

์ž…๊ตฌ ์‚ฌ์ง„ 1380๊ฐœ๋ฅผ ๋Œ๋ ธ์„ ๋•Œ ๊ฒฐ๊ณผ๋กœ ์ถœ๋ ฅ๋œ ๋ผ๋ฒจ๋“ค์ด ์ „์ฒด ์‚ฌ์ง„์—์„œ ๋ช‡ ํผ์„ผํŠธ๋ฅผ ์ฐจ์ง€ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๋‚˜ํƒ€๋‚˜๋Š” ๋นˆ๋„์ˆ˜๋ฅผ ๋ถ„์„ํ•œ ๊ฒฐ๊ณผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‚˜ํƒ€๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ž…๊ตฌ๊ฐ€ ์•„๋‹Œ ์‚ฌ์ง„์„ ๋Œ๋ ธ์„ ๋•Œ ๋‚˜ํƒ€๋‚˜๋Š” ๋ผ๋ฒจ๋“ค๋„ ํ•จ๊ป˜ ๋ถ„์„ํ•ด ๋ณด์•˜๋Š”๋ฐ์š”, ์ž…๊ตฌ ์‚ฌ์ง„์ด ์•„๋‹˜์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ž…๊ตฌ์ธ ์‚ฌ์ง„์—์„œ ๋งŽ์ด ๋‚˜ํƒ€๋‚˜๋Š” ๋ผ๋ฒจ๊ณผ ๊ฒน์น˜๋Š” ๊ฒƒ๋“ค์ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €ํฌ๊ฐ€ ์‹ค์ œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์‚ฌ์šฉํ•œ Inception V3 ๊ทธ๋ž˜ํ”„๋Š” ๊ธฐ์กด์˜ ์•ฝ ๋งŒ ๊ฐœ ๋ผ๋ฒจ์„ ๊ฐ€์ง„ ๋ชจ๋ธ์ด ์•„๋‹ˆ๋ผ ์ข€๋” ์†๋„๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ๊ธฐ ์œ„ํ•ด์„œ ์ฒœ ๊ฐœ์˜ ๋ผ๋ฒจ์„ ๊ฐ€์ง„ ๊ทธ๋ž˜ํ”„๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ์š”, ์•„๋ž˜ ์‚ฌ์ง„์€ ์ž…๊ตฌ์— ํ•ด๋‹น๋˜๋Š” ๋ผ๋ฒจ์„ ์ฒœ ๊ฐœ ๋ชจ๋ธ์˜ ๋ผ๋ฒจ์— ์ ์šฉ์‹œ์ผœ ์ตœ์ข…์ ์œผ๋กœ ๊ฑธ๋Ÿฌ์ง„ ์ž…๊ตฌ ๋ผ๋ฒจ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

3) ์•ˆ๋“œ๋กœ์ด๋“œ์™€ Tensorflow ์—ฐ๋™

์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค์—์„œ ์ž‘์—…ํ•˜๋˜ ๊ธฐ์กด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ด…๋‹ˆ๋‹ค. Assets ํด๋”๋ฅผ ์ƒ์„ฑํ•ด ์ค€ ๋’ค ๊ทธ๋ž˜ํ”„ ๋ผ๋ฒจ ์ •๋ณด๋ฅผ ๋‹ด์€ imagenet_comp_graph_label_strings.txt ํŒŒ์ผ๊ณผ Inception V3 ๊ทธ๋ž˜ํ”„ ํŒŒ์ผ์€ tensorflow_inception_graph.pb๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋„ฃ์–ด์ค๋‹ˆ๋‹ค.

๊ทธ๋ž˜ํ”„ ์ด์™ธ์˜ ์†Œ์Šค ์ฝ”๋“œ๋Š” TensorFlowMachineLearningExample์—ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ  ํ–ˆ์œผ๋‹ˆ ๋” ๊ถ๊ธˆํ•œ ๊ฒŒ ์žˆ์œผ์‹œ๋‹ค๋ฉด ์—ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”! ํ•„์š”ํ•œ ์†Œ์Šค ์ฝ”๋“œ์™€ ๊ทธ๋ž˜ํ”„ ํŒŒ์ผ์„ ๊ฐ–์ถ”๋ฉด ์ด์ œ ์•ˆ๋“œ๋กœ์ด๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

4) ์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‹ค๋ฉด ๊ตฌ์ฒด์ ์œผ๋กœ ์‹œ์„ค์— ๋Œ€ํ•œ ์ด๋ฏธ์ง€๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐ€์ ธ์˜ค๋Š”์ง€ ์„ค๋ช…ํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. HTML parsing์„ ํ†ตํ•ด ๊ฒ€์ƒ‰ํ•˜๊ณ ์ž ํ•˜๋Š” ์‹œ์„ค์˜ ์ด๋ฏธ์ง€ url๋“ค์„ ๊ตฌ๊ธ€ ์ด๋ฏธ์ง€ ๊ฒ€์ƒ‰์œผ๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ url๋“ค์„ ๊ฐ’์œผ๋กœ ์ž…๋ ฅ ๋ฐ›์•„ Bitmap ํ˜•์‹์œผ๋กœ ๋ฐ”๊พผ ๋’ค Inception ๋ชจ๋ธ์„ ๊ฑฐ์ณ ์‚ฌ์ง„์— ํ•ด๋‹น๋˜๋Š” ๋ผ๋ฒจ๋“ค์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์‚ฌ์ง„์˜ ๋ผ๋ฒจ๋“ค์„ ์–ด๋–ป๊ฒŒ ์ž…๊ตฌ ์‚ฌ์ง„์œผ๋กœ ํŒ๋ณ„ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹œ๊ฐํ™” ์ž๋ฃŒ์ž…๋‹ˆ๋‹ค.

์ด์™€ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์ณ ํ•ด๋‹น ์‚ฌ์ง„์ด ์ž…๊ตฌ ์‚ฌ์ง„ ํ˜น์€ ๊ฑด๋ฌผ ์‚ฌ์ง„์ธ์ง€๋ฅผ ํŒ๋ณ„ํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ ๊นŒ์ง€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ด๋ฏธ์ง€ ๋ถ„์„ ๋ถ€๋ถ„์„ ์•Œ์•„๋ณด์•˜๋Š”๋ฐ์š”, ๋‹ค์Œ์œผ๋กœ ๋ฆฌ๋ทฐ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค


4. ๋ฆฌ๋ทฐ ์ž‘์„ฑ ๊ธฐ๋Šฅ

Wheelric์˜ ๋‘ ๋ฒˆ์งธ ๊ธฐ๋Šฅ์€ ๋ฆฌ๋ทฐ ์ž‘์„ฑ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ž‘์„ฑ๋œ ์ •๋ณด๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์„ ์ด์šฉํ•˜๋Š”๋ฐ์š”. ์ด ์‹œ์Šคํ…œ์€ ์„œ๋ฒ„ ์•ˆ์— ์„ค์น˜๋˜์–ด, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ํŒŒํŠธ์—์„œ๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ์™€ DB๋ฅผ ์—ฐ๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1) ์•ˆ๋“œ๋กœ์ด๋“œ & ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์—ฐ๋™๋ฐฉ๋ฒ•

LAMP

์—ฐ๋™์— ํ•„์š”ํ•œ ๊ตฌ์„ฑ์€ ์œ„์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•ˆ๋“œ๋กœ์ด๋“œ App์„ ์ œ์™ธํ•œ ์œ„์˜ ๋„ค๊ฐ€์ง€ ์š”์†Œ๋ฅผ ์ผ์ปฌ์–ด LAMP๋ผ ๋ถ€๋ฅด๋Š”๋ฐ, ์ด๋Š” Linux(์„œ๋ฒ„), Apache(์›น์„œ๋ฒ„), MySQL(๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค), Php(์›น ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด)๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. AWS(Amazon Web Service)๋Š” ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ, EC2 ์ธ์Šคํ„ด์Šค๋Š” ์‰ฝ๊ฒŒ ๋งํ•ด ๊ฐ€์ƒ์˜ ์ปดํ“จํ„ฐ ํ•œ๋Œ€๋ฅผ ๋นŒ๋ฆฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž์‹ ์˜ ํ•„์š”์— ๋”ฐ๋ผ OS๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ wheeliric์€ Linux๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ๋ทฐ ํ”Œ๋žซํผ ์šด์šฉ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ MySQL ๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. MySQL์ด ์•ˆ๋“œ๋กœ์ด๋“œ application๊ณผ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์›น์„œ๋ฒ„ Apache๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, php๋Š” ์›น ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋กœ, php ํŒŒ์ผ์€ apache ์›น์„œ๋ฒ„ ๋‚ด์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ, ํ˜น์‹œ Eclipse๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์„œ๋ฒ„์˜ mysql๊ณผ ์—ฐ๋™๋˜๋Š” console ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•ด๋ณด์…จ๋‚˜์š”? ์ดํด๋ฆฝ์Šค+ Java ํ™˜๊ฒฝ์—์„œ๋Š” JDBC๋ผ์ด๋ธŒ๋Ÿฌ๋ฅผ ์‚ฌ์šฉ, ์›น์„œ๋ฒ„๋ฅผ ์“ฐ์ง€ ์•Š๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ”๋กœ mysql๊ณผ ์—ฐ๋™ํ•˜์…จ์„๊ฒ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์›น์„œ๋ฒ„, ์™œ ์จ์•ผํ• ๊นŒ์š”? ๋ฐ”๋กœ, ์•ˆ๋“œ๋กœ์ด๋“œ์˜ ๊ฒฝ์šฐ, ๋ณด์•ˆ์˜ ์ด์œ ๋กœ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ์ง์ ‘ ์—ฐ๋™์„ ๋ง‰์•„๋†จ๊ธฐ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ค‘๊ฐ„์— ์›น์„œ๋ฒ„๋ฅผ ํ•œ๋ฒˆ ๊ฑฐ์ณ์„œ ์ •๋ณด๋ฅผ ๊บผ๋‚ด์˜ต๋‹ˆ๋‹ค.

Java ์ฝ”๋“œ๋กœ Http ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด, Apache ์›น์„œ๋ฒ„๋Š” ์š”์ฒญ๋ฐ›์€ php ํŒŒ์ผ์„ ์ฝ๊ณ , ์ด์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ Json ํฌ๋ฉง์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์œ„์™€ ๊ฐ™์ด ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์œ„์˜ json ๋ฐ์ดํ„ฐ๋Š” ํŒŒ์‹ฑ๋œ ํ˜•ํƒœ์ด๋ฉฐ, ์‹ค์ œ ๊ฐ€์žฅ ์ฒ˜์Œ์— ๋ฐ›์•„์ง€๋Š” ๋ฐ์ดํ„ฐ์˜ ํ˜•ํƒœ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๊ด„ํ˜ธ๋กœ ์ค‘์ฒฉ๋˜์„œ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋‚˜์˜ string์œผ๋กœ ๋ฐ›์•„์ง„ ๋ฐ์ดํ„ฐ๋Š”, ์ž๋ฐ” ์ฝ”๋“œ๋‹จ์—์„œ ํŒŒ์‹ฑ์„ ํ†ตํ•ด ์šฐ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๋ฝ‘์•„๋‚ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์œ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ˆ๋กœ ๋“ค๋ฉด, John์˜ ๊ฐ€์ž…์ •๋ณด์ธ month, day, year๋“ฑ๋งŒ ๋ฝ‘์•„๋‚ด๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

2) ์ฃผ์š” ์ฝ”๋“œ

MySQL๊ณผ์˜ ์—ฐ๋™ ์œ„์ฃผ๋กœ ์ด์•ผ๊ธฐํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์ฝ๊ธฐ - (1) ์ž๋ฐ”์ฝ”๋“œ

(์œ„์˜ ์„œ๋ฒ„ ์ฃผ์†Œ๋Š” ํ˜„์žฌ ๋ฐ€์•ŒํŒ€์˜ ์„œ๋ฒ„ ์ฃผ์†Œ์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.)

์ด๋•Œ php ํŒŒ์ผ์€ EC2 ์„œ๋ฒ„์˜ /var/html/www/html/์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

Ex. /var/www/html/getReview.php

๋ฐ์ดํ„ฐ ์ฝ๊ธฐ - (2) php์ฝ”๋“œ

๋ฐ์ดํ„ฐ ์“ฐ๊ธฐ

๋ฐ์ดํ„ฐ์“ฐ๊ธฐ๋Š” ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ์™€ ๋ฐฉ๋ฒ•์ด ๊ฑฐ์˜ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ ์€ 2๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

  • ์ž๋ฐ” ์ฝ”๋“œ ์ƒ์˜ URL

๊ธฐ์กด์—๋Š” php ํŒŒ์ผ๋ช…์œผ๋กœ ์ฃผ์†Œ๊ฐ€ ๋๋‚ฌ๋‹ค๋ฉด, ์ด๋ฒˆ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๊ธฐ๋กํ•˜๊ณ ์žํ•˜๋Š” ํŒŒ๋ผ๋ฉ”ํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

signUp.php?ID=" + id +"&nick="+nick,

  • Php ํŒŒ์ผ ์•ˆ์˜ ์ฟผ๋ฆฌ๋ฌธ

3) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™์‹œ ์ฃผ์˜ ์‚ฌํ•ญ: ์ธ์ฝ”๋”ฉ

๋งŽ์€ ์ฃผ์˜์‚ฌํ•ญ์ด ์žˆ๊ฒ ์ง€๋งŒ, ์ œ ๊ฒฝ์šฐ ๊ฐ€์žฅ ์• ๋ฅผ ๋จน์—ˆ๋˜ ๊ฒฝ์šฐ๋Š” ์ธ์ฝ”๋”ฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํ•œ๊ธ€ ๋ฐ์ดํ„ฐ์˜ ๊นจ์ง์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡๊ฐ€์ง€ ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • /etc/mysql/my.cnf ์ˆ˜์ •

[client]

default-character-set=utf8

[mysql]

default-character-set=utf8

[mysqld]

collation-server = utf8_unicode_ci

init-connect='SET NAMES utf8'

character-set-server = utf8

(์ถœ์ฒ˜: https://nesoy.github.io/articles/2017-05/mysql-UTF8)

*๊ธฐ์กด์˜ Database๋‚˜ table์˜ charset์€ ๋ณ€๊ฒฝ๋˜๋Š”๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘ ๋ณ€๊ฒฝ ํ•„์š”

ALTER DATABASE [DB๋ช…] DEFAULT CHARACTER SET utf8;

ALTER TABLE [ํ…Œ์ด๋ธ” ๋ช…] CONVERT TO CHARACTER SET utf8;

์ดํ›„ mysql ์žฌ์‹œ์ž‘ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

  • ์ž๋ฐ” ์ฝ”๋“œ๋‹จ

  • Php ํŒŒ์ผ


โ…ข. ๊ฒฐ๋ก 

์‹œ์„ ์—์„œ ์˜ค๋žœ ๊ธฐ๊ฐ„ ํ”„๋กœ์ ํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ด์˜ค๋ฉด์„œ ๊ฐ€์žฅ ๋งŽ์ด ํ–ˆ๋˜ ๊ณ ๋ฏผ์€ ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ์š•์‹ฌ๊ณผ ์‹ค์งˆ์  ์‚ฌ์šฉ์ž์˜ ํ•„์š” ๋ฅผ ์ ˆ์ถฉํ•˜๋Š” ์ผ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ์ž…์žฅ์— ๋งž์ถ”๋‹ค๋ณด๋‹ˆ, ์ƒ๊ฐ๋ณด๋‹ค ๊ฒฐ๊ณผ๋ฌผ์ด ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์ฒ˜๋Ÿผ ์šฐ์™€! ํƒ„์„ฑ์ด ๋‚˜์˜ค์ง€ ์•Š๋Š” ๋‹จ์ˆœํ•œ ๊ตฌ์กฐ๋กœ ๋ณด์—ฌ ์†์ƒํ•จ์„ ๋А๋‚„ ๊ฒฝ์šฐ๋„ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ ๋“  ์ƒ๊ฐ์€ ๊ทธ๋ž˜๋„ ์ฐธ ๋ฟŒ๋“ฏํ•˜๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ์„ธ์ƒ์— ์†Œ๋ง์„ ์‹น ํ‹”์šฐ๋Š” ํ•œ ํ†จ์˜ ๋ฐ€์•Œ์ด ๋˜๊ณ ์ž, ์‹œ์ž‘ํ•œ ํ”„๋กœ์ ํŠธ์ด๊ธฐ์—, ์‚ฌ์šฉ์ž๋ถ„์˜ ๊ณ ๋ง™๋‹ค*๋Š” ๋ง ํ•œ๋งˆ๋””์— ์ €ํฌ๋Š” ์˜ค๋Š˜๋„ ๋ณด๋žŒ์ฐน๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Clone this wiki locally