Skip to content

Latest commit

ย 

History

History
1160 lines (948 loc) ยท 39.5 KB

File metadata and controls

1160 lines (948 loc) ยท 39.5 KB

Index > AP User Guide > Ruby ๊ฐœ๋ฐœ

Table of Contents

  1. ๊ฐœ์š”
  2. Ruby ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ๊ฐ€์ด๋“œ

1. ๊ฐœ์š”

1.1. ๋ฌธ์„œ ๊ฐœ์š”

1.1.1. ๋ชฉ์ 

๋ณธ ๋ฌธ์„œ(Ruby ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ)๋Š” ๊ฐœ๋ฐฉํ˜• ํ”Œ๋žซํผ ํ”„๋กœ์ ํŠธ์˜ ์„œ๋น„์ŠคํŒฉ(Mysql, Cubrid, MongoDB, RabbitMQ, Redis, GlusterFS)์„ Ruby ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์—ฐ๋™ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ณ  Ruby ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ œ์‹œํ•˜๋Š” ๋ฌธ์„œ์ด๋‹ค.

1.1.2. ๋ฒ”์œ„

๋ณธ ๋ฌธ์„œ์˜ ๋ฒ”์œ„๋Š” Open PaaS ํ”„๋กœ์ ํŠธ์˜ Ruby ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ๊ณผ ์„œ๋น„์ŠคํŒฉ ์—ฐ๋™, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ์— ๋Œ€ํ•œ ๋‚ด์šฉ์œผ๋กœ ํ•œ์ •๋˜์–ด ์žˆ๋‹ค.

1.1.3. ์ฐธ๊ณ  ์ž๋ฃŒ

http://rubyinstaller.org/
https://docs.pivotal.io/pivotalcf/buildpacks/ruby/index.html/
http://rubykr.github.io/rails_guides/getting_started.html/
https://github.com/brianmario/mysql2/
http://www.cubrid.org/manual/93/ko/api/ruby.html/
https://docs.mongodb.org/ecosystem/drivers/ruby/
http://rubybunny.info/articles/getting_started.html/
https://github.com/redis/redis-rb/
https://github.com/fog/fog/

2. Ruby ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ๊ฐ€์ด๋“œ

2.1. ๊ฐœ์š”

๊ฐœ๋ฐฉํ˜• ํ”Œ๋žซํผ์— ๋“ฑ๋ก๋œ ๋‹ค์–‘ํ•œ ์„œ๋น„์ŠคํŒฉ์„ Ruby์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋ฐ”์ธ๋”ฉํ•˜๊ณ  ํ•ด๋‹น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ฐ”์ธ๋”ฉ๋œ ์„œ๋น„์Šค ํ™˜๊ฒฝ์ •๋ณด(VCAP_SERVICES)๋ฅผ ์ด์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ด€ ์—ฐ๋™ํ•˜๊ณ  ๊ฐ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋„๋ก Windows๊ธฐ๋ฐ˜ ํ™˜๊ฒฝ์—์„œ ๊ฐœ๋ฐฉํ˜• ํ”Œ๋žซํผ์— ๋ฐฐํฌํ•  Ruby ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•œ๋‹ค.

2.2. ๊ฐœ๋ฐœํ™˜๊ฒฝ ๊ตฌ์„ฑ

Ruby ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™˜๊ฒฝ์œผ๋กœ ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ ๊ตฌ์„ฑ ํ•œ๋‹ค.

  • OS : Windows 7 64bit
  • Ruby : 1.9.3-p551
  • Framwork : Ruby On Rails 4.1.8
  • IDE : RubyMine 7.1.1

โ€ป CubridDB์˜ Ruby ๋“œ๋ผ์ด๋ฒ„ ์ตœ์‹  ์ง€์› ๋ฒ„์ „์ด Ruby 1.9.3 ๊นŒ์ง€ ์ง€์›ํ•˜์—ฌ ํ•ด๋‹น ๋ฒ„์ „์„ ์„ ํƒํ•˜์˜€๋‹ค. ๊ฐ ์„œ๋น„์Šค๋ณ„ ์ง€์› ๋˜๋Š” ๋“œ๋ผ์ด๋ฒ„(๋˜๋Š” Gem)์— ๋งž๋Š” Ruby ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ธธ ๊ถŒ์žฅํ•œ๋‹ค.
โ€ป Ruby IDE๋Š” ๊ฐœ๋ณ„ ์„ ํƒํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

2.2.1. Ruby & Ruby On Rails์„ค์น˜
  1. Ruby & DevKit ๋‹ค์šด๋กœ๋“œ
    http://rubyinstaller.org/downloads/
    ruby01
  • ๋‹ค์šด๋กœ๋“œ
    RubyInstallers : Ruby 1.9.3-p551
    DEVELOPMENT KIT : DevKit-tdm-32-4.5.2-20111229-1559-sfx
  1. Ruby ์„ค์น˜
  • Ruby 1.9.3-p551.exe ๋”๋ธ”ํด๋ฆญํ•˜์—ฌ ์„ค์น˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
    ruby02
  • โ€œOKโ€ ๋ฒ„ํŠผ ํด๋ฆญ

ruby03

  • โ€œI accept the Licenseโ€ ์„ ํƒ ํ›„ โ€œNextโ€ ๋ฒ„ํŠผ ํด๋ฆญ

ruby04

  • โ€œAdd Ruby executables to your PATHโ€ ์„ ํƒ ํ›„ โ€œInstallโ€ ๋ฒ„ํŠผ ํด๋ฆญ

ruby05

  • โ€œFinishโ€ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜์—ฌ Ruby ์„ค์น˜๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค.
  1. DEVELOPMENT KIT ์„ค์น˜
  • DevKit-tdm-32-4.5.2-20111229-1559-sfx.exe์„ ๋”๋ธ”ํด๋ฆญํ•˜์—ฌ ์„ค์น˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
    ruby06
    ruby07
  • ์„ค์น˜ํ•  ํด๋”๋ฅผ ์ง€์ •ํ•˜๊ณ  โ€œExtractโ€๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ๋‹ค.
  • Windows์˜ CMD ์ฐฝ์„ ์‹คํ–‰ํ•˜์—ฌ DevKit ์„ค์น˜ ํด๋”๋กœ ์ด๋™ํ•œ๋‹ค.

ruby dk.rb init

  • โ€œruby dk.rb initโ€ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ โ€œconfig.ymlโ€ ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค. ruby08

ruby dk.rb install

  • โ€œruby dk.rb installโ€ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ DevKit์„ ์„ค์น˜ํ•œ๋‹ค. ruby09
  • โ€œruby โ€“vโ€ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ๋ฃจ๋น„ ๋ฒ„์ „์„ ํ™•์ธํ•œ๋‹ค. ruby10
  1. Ruby On Rails ์„ค์น˜
  • โ€œgem update rdocโ€ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ rdoc gem์„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.(๋ฏธ ์‹คํ–‰์‹œ rails install์‹œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ ํ•  ์ˆ˜ ์žˆ๋‹ค.) ruby11
  • โ€œgem install rails โ€“v 4.1.8โ€ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ rails์„ ์„ค์น˜ํ•œ๋‹ค. ruby12
  • โ€œrails โ€“vโ€ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ rails์˜ ๋ฒ„์ „์„ ํ™•์ธํ•œ๋‹ค. ruby13

2.3. ๊ฐœ๋ฐœ

Ruby ์ƒ˜ํ”Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒ์„ฑ๊ณผ ํ™˜๊ฒฝ์„ค์ •, VCAP_SERVICES ์ •๋ณด์˜ ํš๋“ ๋ฐ ๊ฐ ์„œ๋น„์Šค์˜ ์—ฐ๋™ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•˜์—ฌ ์„ค๋ช…ํ•œ๋‹ค.

  • ์ƒ˜ํ”Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‹ค์šด๋กœ๋“œ

์™„์„ฑ๋œ ์ƒ˜ํ”Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์•„๋ž˜ ๋งํฌ์˜ /OpenPaaSSample/ruby-sample-app ์—์„œ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

https://nextcloud.paas-ta.org/index.php/s/x8Tg37WDFiL5ZDi/download

2.3.1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒ์„ฑ
  1. Rails ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒ์„ฑ(bundle install ์ œ์™ธ)

rails new [application name] โ€“B โ€“skip-bundle ruby14 ruby15

  1. ์ž๋™ ์ƒ์„ฑ ํด๋” ๋ฐ ํŒŒ์ผ ์ •์˜
ํŒŒ์ผ/ํด๋” ๋ชฉ์ 
Gemfile ์ด ํŒŒ์ผ์€ ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ ˆ์ผ์ฆˆ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—๊ฒŒ ํ•„์š”ํ•œ ์ ฌ์˜ ์˜์กด์„ฑ ์ •๋ณด๋ฅผ ๊ธฐ์ˆ ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
README ์ด ํŒŒ์ผ์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ์งง๋ง‰ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. ์„ค์น˜, ์‚ฌ์šฉ ๋ฐฉ๋ฒ• ๊ธฐ์ˆ ์— ์“ฐ์ž…๋‹ˆ๋‹ค.
Rakefile ์ด ํŒŒ์ผ์€ ํ„ฐ๋ฏธ๋„์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฐ์น˜์žก๋“ค์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
app/ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ์ปจํŠธ๋กค๋Ÿฌ, ๋ชจ๋ธ, ๋ทฐ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” ์ด ํด๋”์— ์ง‘์ค‘ํ•  ๊ฒƒ ์ž…๋‹ˆ๋‹ค.
config/ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹คํ–‰ ์‹œ๊ฐ„์˜ ๊ทœ์น™, ๋ผ์šฐํŒ…, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ ์„ค์ •์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
config.ru ๋ž™(Rack) ๊ธฐ๋ฐ˜์˜ ์„œ๋ฒ„๋“ค์ด ์‹œ์ž‘ํ• ๋•Œ ํ•„์š”ํ•œ ์„ค์ • ์ž…๋‹ˆ๋‹ค.
db/ ํ˜„์žฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์Šคํ‚ค๋งˆ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.(๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์œผ๋กœ ์ž˜ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.) ์—ฌ๋Ÿฌ๋ถ„์€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐฐ์šฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
doc/ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช… ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค.
lib/ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•œ ํ™•์žฅ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. (์ด ๋ฌธ์„œ์—์„œ ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)
public/ ์™ธ๋ถ€์—์„œ ๋ณผ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ํด๋” ์ž…๋‹ˆ๋‹ค.์ด๋ฏธ์ง€, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ, ์Šคํƒ€์ผ์‹œํŠธ๋‚˜ ๊ทธ์™ธ ์ •์ ์ธ ํŒŒ์ผ๋“ค์€ ์ด๊ณณ์— ๋‘์„ธ์š”.
script/ ๋ ˆ์ผ์ฆˆ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰์‹œํ‚ค๊ฑฐ๋‚˜, ๋ฐฐํฌ, ์‹คํ–‰ ๊ด€๋ จํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‘์„ธ์š”.
test/ ์œ ๋‹› ํ…Œ์ŠคํŠธ, ํ”ฝ์Šค์ณ, ๊ทธ์™€ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ ๋„๊ตฌ๋“ค ์ž…๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์€ ๋ ˆ์ผ์ฆˆ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ๊ฐ€ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
tmp/ ์ž„์‹œ ํŒŒ์ผ
vendor/ ์„œ๋“œ ํŒŒํ‹ฐ ์ฝ”๋“œ๋“ค์„ ์œ„ํ•œ ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๋ ˆ์ผ์ฆˆ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ฃจ๋น„ ์ ฌ๊ณผ ๋ ˆ์ผ์ฆˆ ์†Œ์Šค-ํ”„๋กœ์ ํŠธ ๋‚ด์— ์„ค์น˜์‹œ-์™€ ๋ฏธ๋ฆฌ ํŒจํ‚ค์ง•๋œ ์ถ”๊ฐ€ ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์ด ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
2.3.2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™˜๊ฒฝ์„ค์ •

ํ•ด๋‹น ์˜ˆ์ œ๋Š” Ruby 1.9.3์„ ๊ธฐ์ค€์œผ๋กœ ๊ฐ ๋“œ๋ผ์ด๋ฒ„์˜ ๋ฒ„์ „์„ ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒํ•˜์—ฌ ์„ค์น˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
./Gemfile ์ˆ˜์ •(์„ค์ •)์‹œ ์„ค์น˜๋œ Ruby์˜ ๋ฒ„์ „์— ๋งž๋Š” ์ ฌ์„ ์„ค์น˜ํ•˜๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ/ํด๋” ๋ชฉ์ 
./Gemfile ์ด ํŒŒ์ผ์€ ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ ˆ์ผ์ฆˆ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—๊ฒŒ ํ•„์š”ํ•œ ์ ฌ์˜ ์˜์กด์„ฑ ์ •๋ณด๋ฅผ ๊ธฐ์ˆ 
./config/application.rb ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ™˜๊ฒฝ์„ค์ •
./config/routes.rb Request URL๊ณผ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋งคํ•‘ ์„ค์ •
./config/environments/development.rb ๊ฐœ๋ฐœํ™˜๊ฒฝ ์„ค์ •(Localhost ์„œ๋ฒ„ ์‹คํ–‰์‹œ ๊ธฐ๋ณธ ํ™˜๊ฒฝ์„ค์ •)
./config/environments/production.rb ์ƒ์šฉํ™˜๊ฒฝ ์„ค์ •(๊ฐœ๋ฐฉํ˜• ํ”Œ๋žซํผ ๋ฐฐํฌ์‹œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ณธ ํ™˜๊ฒฝ์„ค์ •)
  1. ./Gemfile ์ˆ˜์ •
  • ๊ฐ ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉํ•  ๋“œ๋ผ์ด๋ฒ„ ๋ฐ ํ•„์š”ํ•œ ์ ฌ์„ ์ •์˜ํ•œ๋‹ค.
# https => http ๋ณ€๊ฒฝ
source 'http://rubygems.org' 

# Ruby ๋ฒ„์ „ ๋ช…์‹œ
ruby '1.9.3' 

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.1.8'
...(์ค‘๋žต)...
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin]

# Cloud Foundry ์œ ํ‹ธ
gem 'cf-app-utils'

# MySQL ๋“œ๋ผ์ด๋ฒ„
gem 'mysql2', '~> 0.3.20'

# Cubrid ๋“œ๋ผ์ด๋ฒ„
gem 'cubrid'

# MongoDB ๋“œ๋ผ์ด๋ฒ„
gem 'mongo'#, '~> 2.1'

# RabbitMP ๋“œ๋ผ์ด๋ฒ„
gem 'amq-protocol', '1.9.2'
gem 'bunny', '1.7.0'

# Openstack for swift(glusterfs)' ๋“œ๋ผ์ด๋ฒ„
gem 'net-ssh', '2.9.2'
gem 'fog-google', '0.1.0'
gem 'fog', '1.34.0'

# Redis ๋“œ๋ผ์ด๋ฒ„
gem 'redis'

group :development, :test do
  gem 'rspec-rails', '~> 3.0.0'
end

โ€ป Windows ํ™˜๊ฒฝ์—์„œ Cubrid ๋“œ๋ผ์ด๋ฒ„๋Š” Cubrid์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ํ•ด๋‹น Ruby ๋ฒ„์ „์— ๋งž๋Š” Cubrid๋ฅผ ์„ค์น˜ํ•˜์—ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐธ์กฐ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ์•ผํ•œ๋‹ค.
โ€ป ํ•ด๋‹น ์ƒ˜ํ”Œ์€ Ruby 1.9.3(64bit ๋ฏธ์ง€์›) ์ด๋ฏ€๋กœ CUBRID-Windows-x86(32bit)๋ฒ„์ „์„ ์„ค์น˜ํ•˜์˜€๋‹ค.

  1. ์ ฌ ์„ค์น˜
  • Gemfile์— ์ •์˜๋œ ์ ฌ์„ ์„ค์น˜ํ•œ๋‹ค.
bundle install
  1. ./config/application.rb ์ˆ˜์ •
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ™˜๊ฒฝ์„ค์ •
require File.expand_path('../boot', __FILE__)

require 'rails/all'

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module RubySampleApp
  class Application < Rails::Application
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.

    # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
    # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
    # config.time_zone = 'Central Time (US & Canada)'

    # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
    # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
    # config.i18n.default_locale = :de

    # Rails ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ๋™์‹œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ Loading path ์ถ”๊ฐ€
    config.autoload_paths += %W(#{config.root}/lib)

    # ์˜ˆ์™ธ์ฒ˜๋ฆฌ(routes.rb์ฐธ์กฐ ํ•˜๋„๋ก ์„ค์ •)
    config.exceptions_app = self.routes

  end
end
  1. ./config/routes.rb ์ˆ˜์ •
  • Request URL๊ณผ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋งคํ•‘ ์„ค์ •
Rails.application.routes.draw do

  # ์ธ๋ฑ์Šค(root) ํŽ˜์ด์ง€ ์„ค์ •
root 'static#login'

# ์ •์ ํŽ˜์ด์ง€์„ค์ •(.html)
  get '/login' => 'static#login'
  get '/main/:org_id' => 'static#main'
  get '/manage' => 'static#manage'
...(์ค‘๋žต)...
  # ๊ธฐ๋Šฅ๋ณ„ API Path ์„ค์ •
#[HTTP๋ฉ”์„œ๋“œ] โ€˜[Uri]โ€™   =>   โ€˜[Controller#๋ฉ”์„œ๋“œ]โ€™
  get	'org-chart/:org_id/mysql' 	  	=> 'org_chart_mysql#index'
  get	'org-chart/:org_id/cubrid' 	  	=> 'org_chart_cubrid#index'
get	'org-chart/:org_id/mongo' 	=> 'org_chart_mongo#index'
...(์ƒ๋žต)
  1. ./config/environments/development.rb
  • ๊ฐœ๋ฐœํ™˜๊ฒฝ ์„ค์ •( Localhost ์„œ๋ฒ„ ์‹คํ–‰์‹œ ๊ธฐ๋ณธ ํ™˜๊ฒฝ์„ค์ •)
Rails.application.configure do
  # Settings specified here will take precedence over those in config/application.rb.
...(์ค‘๋žต)...

# Show full error reports and disable caching.
# ์˜ˆ์™ธ ๋ฐœ์ƒ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ ์„ค์ •(Jsonํ˜•์œผ๋กœ ๋ฐ˜ํ™˜ ๋ฐ›๊ธฐ์œ„ํ•จ)
  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = false

...(์ค‘๋žต)...

# public static html page view
# ./public ํด๋” ์ ‘๊ทผ ํ—ˆ์šฉ ์—ฌ๋ถ€ ์„ค์ •(js, css, image ์ •์  ๋ฆฌ์†Œ์Šค)
  config.serve_static_assets = true

  # Disable request forgery protection in test environment
# authenticity_token ignore
# Post, Put ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์‹œ ์ธ์ฆ ์ ˆ์ฐจ ์„ค์ •
  config.action_controller.allow_forgery_protection    = false
end
  1. ./config/environments/production.rb
  • ์ƒ์šฉํ™˜๊ฒฝ ์„ค์ •(๊ฐœ๋ฐฉํ˜• ํ”Œ๋žซํผ ๋ฐฐํฌ์‹œ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ณธ ํ™˜๊ฒฝ์„ค์ •)
Rails.application.configure do
  # Settings specified here will take precedence over those in config/application.rb.

...(์ค‘๋žต)...

  # Disable request forgery protection in test environment
  # authenticity_token ignore
# Post, Put ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์‹œ ์ธ์ฆ ์ ˆ์ฐจ ์„ค์ •
config.action_controller.allow_forgery_protection    = false
2.3.3. VCAP_SERVICES ํ™˜๊ฒฝ์„ค์ • ์ •๋ณด

๊ฐœ๋ฐฉํ˜• ํ”Œ๋žซํผ์— ๋ฐฐํฌ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐ”์ธ๋”ฉ๋œ ์„œ๋น„์Šค๋ณ„ ์ ‘์† ์ •๋ณด๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋ณ„๋กœ ๋“ฑ๋ก๋˜์–ด์žˆ๋Š” VCAP_SERVICES ํ™˜๊ฒฝ์„ค์ • ์ •๋ณด๋ฅผ ์ฝ์–ด๋“ค์—ฌ ์ •๋ณด๋ฅผ ํš๋“ ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŒŒ์ผ/ํด๋” ๋ชฉ์ 
./lib/vcap.rb ๊ฐœ๋ฐฉํ˜• ํ”Œ๋žซํผ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋ณ„ VCAP_SERVICES ํ™˜๊ฒฝ์ •๋ณด์—์„œ ์„œ๋น„์Šค๋ณ„ ์ ‘์†์ •๋ณด๋ฅผ ์ฝ์–ด์˜ค๋Š” ํด๋ž˜์Šค
  1. ๊ฐœ๋ฐฉํ˜• ํ”Œ๋žซํผ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ™˜๊ฒฝ์ •๋ณด
  • ์„œ๋น„์Šค๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋ฉด JSON ํ˜•ํƒœ๋กœ ํ™˜๊ฒฝ์„ค์ • ์ •๋ณด๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณ„๋กœ ๋“ฑ๋ก๋œ๋‹ค.
{
 "VCAP_SERVICES": {
 "p-mysql": [
   {
    "credentials": {
     "hostname": "10.30.40.63",
     "jdbcUrl": "jdbc:mysql://10.30.40.63:3306/cf_ea68784e_3de6_439d_afc1_d51b4e95627b?user=ZwCFnQRiT3KANqHZ\u0026password=qs7oqi4nSvWq6UQa",
     "name": "cf_ea68784e_3de6_439d_afc1_d51b4e95627b",
     "password": "qs7oqi4nSvWq6UQa",
     "port": 3306,
     "uri": "mysql://ZwCFnQRiT3KANqHZ:qs7oqi4nSvWq6UQa@10.30.40.63:3306/cf_ea68784e_3de6_439d_afc1_d51b4e95627b?reconnect=true",
     "username": "ZwCFnQRiT3KANqHZ"
    },
    "label": "p-mysql",
    "name": "sample-mysql-instance",
    "plan": "100mb",
    "tags": [
     "mysql"
    ]
   }
  ],
...(์ดํ•˜ ์ƒ๋žต)...
  1. ./lib/vcap.rb ํŒŒ์ผ ์ƒ์„ฑ
  • ๊ฐœ๋ฐฉํ˜• ํ”Œ๋žซํผ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋ณ„ VCAP_SERVICES ํ™˜๊ฒฝ์ •๋ณด์—์„œ ์„œ๋น„์Šค๋ณ„ ์ ‘์†์ •๋ณด๋ฅผ ์ฝ์–ด์˜ค๋Š” ํด๋ž˜์Šค
# cf-app-utils ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ
require 'cf-app-utils' 

module VcapService
  class Vcap

# ํด๋ž˜์Šค ์ดˆ๊ธฐํ™” ๋ฉ”์„œ๋“œ
    def initialize 
    end

    def serviceInfo(service) #VCAP_SERVICES ์ •๋ณด ์กฐํšŒ ๋ฉ”์„œ๋“œ
      #VCAP_SERVICES์— ๋“ฑ๋ก๋œ ์„œ๋น„์Šค์˜ label ์ •๋ณด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์กฐํšŒํ•˜์—ฌ ์ •๋ณด๋ฅผ ๋ฐ˜ํ™˜
      CF::App::Credentials.find_by_service_label(service) 
    end
  end
end
  • cf-app-utils ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„๊ฒฝ์šฐ
# cf-app-utils์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ง์ ‘ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜์—ฌ Jsonํ˜•ํƒœ๋กœ ์ •๋ณด๋ฅผ ์ฝ์–ด์˜ฌ์ˆ˜ ์žˆ๋‹ค.

vcap_services = JSON.parse(ENV['VCAP_SERVICES'])
2.3.4. Mysql ์—ฐ๋™
ํŒŒ์ผ/ํด๋” ๋ชฉ์ 
./lib/mysql_service.rb Vcap ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜์—ฌ Connection์„ ์ƒ์„ฑํ•˜๋Š” ํด๋ž˜์Šค
./app/controllers/orgs_chart_mysql_controller.rb ์„œ๋น„์Šค Connection ํด๋ž˜์Šค ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค
  1. ./lib/mysql_service.rb
  • Vcap ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜์—ฌ Mysql Connection์„ ์ƒ์„ฑํ•˜๋Š” ํด๋ž˜์Šค
require 'vcap'
module Connector
  class MysqlService < VcapService::Vcap

    def initialize
      super()
    end
    def connector
      credentials = serviceInfo('p-mysql') # โ€œp-mysqlโ€ ์„œ๋น„์Šค credentials ์กฐํšŒ
      Mysql2::Client.new(:host =>  credentials['hostname'],
                         :username => credentials['username'],
                         :password => credentials['password'],
                         :database => credentials['name'])
    end
end
end
  1. ./app/controllers/orgs_chart_mysql_controller.rb ์„œ๋น„์Šค Connection ํด๋ž˜์Šค ํ˜ธ์ถœ
# encoding: UTF-8      # Encoding ์ง€์ •(ํ•œ๊ธ€์ง€์›)
require 'mysql_service'   # mysql_service ํด๋ž˜์Šค ์ถ”๊ฐ€ (๊ฐ ์„œ๋น„์Šค๋ณ„ ํด๋ž˜์Šค ์ถ”๊ฐ€๋ถ€๋ถ„)
class OrgChartMysqlController < ApplicationController
  before_action :db_connection    # ์ „์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ(DB ์ ‘์†)
  before_action :set_param, only: [:index] 
  before_action :set_org, only: [:index] 
  after_action :db_close  # ํ›„์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ (DB ๋‹ซ์Œ)

  # Org ๊ทธ๋ฃน ๋ชฉ๋ก ์กฐํšŒ ๋ฉ”์„œ๋“œ
  def index
    if @org == nil
      render json: {error: 'request value wrong'}, status: 400
    else
      render json: {org: @org, groups: @client.query(@query.group_index(@param[:org_id]))}
    end
  end

# ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ์ „ ์„œ๋น„์Šค ์ ‘์†
  def db_connection
    @client = Connector::MysqlService.new.connector #์„œ๋น„์Šค ์—ฐ๋™ ํด๋ž˜์Šค๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ ‘์†์ •๋ณด๋ฅผ ํš๋“ํ•˜๊ณ  ์ด๋ฅผ ํด๋ž˜์Šค ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜์˜€๋‹ค.
    @query = Connector::MysqlQuery.new
  end

# ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์ด ๋๋‚œํ›„ ์„œ๋น„์Šค ๋‹ซ์Œ
  def db_close
    @client.close
  end

  # Param ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ
def set_param
    @param = {:org_id => params[:org_id]}
  end

  # Org ์ •๋ณด ์กฐํšŒ ๋ฉ”์„œ๋“œ
  def set_org
    begin
      @org = @client.query(@query.org_show(@param[:org_id])).first
    rescue
      @org = nil
    end
  end
end

โ€ปํ•ด๋‹น ํด๋ž˜์Šค๋Š” ์ƒ˜ํ”Œ ์˜ˆ์ œ์ด๋ฉฐ ์„œ๋น„์Šค์˜ ์ ‘์†์ •๋ณด์˜ ํš๋“ ๋ฐ ํ™œ์šฉ ๋ฐฉ๋ฒ•์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌ์กฐ๋ฐ ํŠน์„ฑ์— ๋งž๊ฒŒ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.

2.3.5. Cubrid ์—ฐ๋™
ํŒŒ์ผ/ํด๋” ๋ชฉ์ 
./lib/cubrid_service.rb Vcap ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜์—ฌ Connection์„ ์ƒ์„ฑํ•˜๋Š” ํด๋ž˜์Šค
./app/controllers/orgs_chart_cubrid_controller.rb ์„œ๋น„์Šค Connection ํด๋ž˜์Šค ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค
  1. ./lib/cubrid_service.rb
  • Vcap ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜์—ฌ Cubrid Connection์„ ์ƒ์„ฑํ•˜๋Š” ํด๋ž˜์Šค
require 'vcap'
module Connector
  class CubridService < VcapService::Vcap

    def initialize
      super()
    end
    def connector
      credentials = serviceInfo('CubridDB') # โ€œCubridDBโ€ ์„œ๋น„์Šค credentials ์กฐํšŒ
      Cubrid.connect(credentials['name'],
                            credentials['hostname'],
                            33000,
                            credentials['username'],
                            credentials['password'])
    end
end
end
  1. ./app/controllers/orgs_chart_cubrid_controller.rb ์„œ๋น„์Šค Connection ํด๋ž˜์Šค ํ˜ธ์ถœ
# encoding: UTF-8      # Encoding ์ง€์ •(ํ•œ๊ธ€์ง€์›)
require 'cubrid_service'    # cubrid_service ํด๋ž˜์Šค ์ถ”๊ฐ€ (๊ฐ ์„œ๋น„์Šค๋ณ„ ํด๋ž˜์Šค ์ถ”๊ฐ€๋ถ€๋ถ„)
class OrgChartMysqlController < ApplicationController
  before_action :db_connection    # ์ „์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ(DB ์ ‘์†)
  before_action :set_param, only: [:index] 
  before_action :set_org, only: [:index] 
  after_action :db_close  # ํ›„์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ (DB ๋‹ซ์Œ)

  # Org ๊ทธ๋ฃน ๋ชฉ๋ก ์กฐํšŒ ๋ฉ”์„œ๋“œ
  def index
    if @org == nil
      render json: {error: 'request value wrong'}, status: 400
    else
      result = @client.query(@query.group_index(@param[:org_id]))
      groups = []
      while rs = result.fetch_hash
        rs['label'] = rs['label'].to_s.force_encoding('UTF-8')
        rs['desc'] = rs['desc'].to_s.force_encoding('UTF-8')
        rs['thumb_img_name'] = rs['url'].to_s.force_encoding('UTF-8')
        rs['thumb_img_path'] = rs['url'].to_s.force_encoding('UTF-8')
        rs['url'] = rs['url'].to_s.force_encoding('UTF-8')
        groups.push(rs)
      end
      render json: {org: @org, groups: groups}
    end  end

# ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ์ „ ์„œ๋น„์Šค ์ ‘์†
  def db_connection
    @client = Connector::CubridService.new.connector #์„œ๋น„์Šค ์—ฐ๋™ ํด๋ž˜์Šค๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ ‘์†์ •๋ณด๋ฅผ ํš๋“ํ•˜๊ณ  ์ด๋ฅผ ํด๋ž˜์Šค ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜์˜€๋‹ค.
    @query = Connector::MysqlQuery.new
  end

# ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์ด ๋๋‚œํ›„ ์„œ๋น„์Šค ๋‹ซ์Œ
  def db_close
    @client.close
  end

  # Param ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ
def set_param
    @param = {:org_id => params[:org_id]}
  end

  # Org ์ •๋ณด ์กฐํšŒ ๋ฉ”์„œ๋“œ
  def set_org
    begin
      @org = @client.query(@query.org_show(@param[:org_id])).first
    rescue
      @org = nil
    end
  end
end

โ€ปํ•ด๋‹น ํด๋ž˜์Šค๋Š” ์ƒ˜ํ”Œ ์˜ˆ์ œ์ด๋ฉฐ ์„œ๋น„์Šค์˜ ์ ‘์†์ •๋ณด์˜ ํš๋“ ๋ฐ ํ™œ์šฉ ๋ฐฉ๋ฒ•์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌ์กฐ๋ฐ ํŠน์„ฑ์— ๋งž๊ฒŒ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.

2.3.6. MongoDB ์—ฐ๋™
ํŒŒ์ผ/ํด๋” ๋ชฉ์ 
./lib/mongo_service.rb Vcap ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜์—ฌ Connection์„ ์ƒ์„ฑํ•˜๋Š” ํด๋ž˜์Šค
./app/controllers/orgs_chart_mongo_controller.rb ์„œ๋น„์Šค Connection ํด๋ž˜์Šค ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค
  1. ./lib/mongo_service.rb
  • Vcap ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜์—ฌ MongoDB Connection์„ ์ƒ์„ฑํ•˜๋Š” ํด๋ž˜์Šค
require 'vcap'
module Connector
  class MongoService < VcapService::Vcap

    def initialize
      super()
    end
    def connector
      credentials = serviceInfo('Mongo-DB') # โ€œMongo-DBโ€ ์„œ๋น„์Šค credentials ์กฐํšŒ
      Mongo::Client.new(credentials['hosts'],
                        :database => credentials['name'],
                        :user =>  credentials['username'],
                        :password => credentials['password'],
                        :connect => :sharded)

    end
  end
end
  1. ./app/controllers/orgs_chart_mongo_controller.rb ์„œ๋น„์Šค Connection ํด๋ž˜์Šค ํ˜ธ์ถœ
# encoding: UTF-8      # Encoding ์ง€์ •(ํ•œ๊ธ€์ง€์›)
require โ€˜mongo_serviceโ€™    # mongo_service ํด๋ž˜์Šค ์ถ”๊ฐ€ (๊ฐ ์„œ๋น„์Šค๋ณ„ ํด๋ž˜์Šค ์ถ”๊ฐ€๋ถ€๋ถ„)
class OrgChartMysqlController < ApplicationController
  before_action :db_connection    # ์ „์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ(DB ์ ‘์†)
  before_action :set_param, only: [:index] 
  before_action :set_org, only: [:index] 

  # Org ๊ทธ๋ฃน ๋ชฉ๋ก ์กฐํšŒ ๋ฉ”์„œ๋“œ
  def index
    if @org == nil
      render json: {error: 'request value wrong'}, status: 400
    else
      result = @client[:Groups].find(:orgId => BSON::ObjectId(@param[:orgId])).sort({ _id: -1 } )
      groups=[]
      result.each do |rs|
        rs['created'] = Date.strptime(rs['created'].as_json['t'].to_s,'%s').strftime('%F')
        rs['modified'] = Date.strptime(rs['modified'].as_json['t'].to_s,'%s').strftime('%F')
        rs_new = {'id' => rs.delete('_id').to_s,
                  'org_id' => rs.delete('orgId').to_s,
                  'parent_id' => rs.delete('parentId').to_s,
                  'label' => rs.delete('label').to_s,
                  'desc' => rs.delete('desc').to_s,
                  'thumb_img_name' => rs.delete('thumbImgName').to_s,
                  'thumb_img_path' => rs.delete('thumbImgPath').to_s,
                  'url' => rs.delete('url').to_s,
                  'created' => rs.delete('created').to_s,
                  'modified' => rs.delete('modified').to_s
        }.merge(rs)
        groups.push(rs_new)
      end
      render json: {org: @org, groups: groups}
    end
  end

# ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ์ „ ์„œ๋น„์Šค ์ ‘์†
  def db_connection
    @client = Connector:: MongoService.new.connector #์„œ๋น„์Šค ์—ฐ๋™ ํด๋ž˜์Šค๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ ‘์†์ •๋ณด๋ฅผ ํš๋“ํ•˜๊ณ  ์ด๋ฅผ ํด๋ž˜์Šค ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜์˜€๋‹ค.
  end

# Param ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ
def set_param
    @param = {:orgId => params[:org_id]}
  end

  # Org ์ •๋ณด ์กฐํšŒ ๋ฉ”์„œ๋“œ
  def set_org
    begin
      #@org = @client[:Orgs].find(:_id => BSON::ObjectId(@param[:orgId])).first
      org_tmp = @client[:Orgs].find(:_id => BSON::ObjectId(@param[:orgId])).first
      org_tmp['created'] = Date.strptime(org_tmp['created'].as_json['t'].to_s,'%s').strftime('%F')
      org_tmp['modified'] = Date.strptime(org_tmp['modified'].as_json['t'].to_s,'%s').strftime('%F')
      @org = {'id' => org_tmp.delete('_id').to_s}.merge(org_tmp)
    rescue
      @org = nil
    End
  end
end

โ€ปํ•ด๋‹น ํด๋ž˜์Šค๋Š” ์ƒ˜ํ”Œ ์˜ˆ์ œ์ด๋ฉฐ ์„œ๋น„์Šค์˜ ์ ‘์†์ •๋ณด์˜ ํš๋“ ๋ฐ ํ™œ์šฉ ๋ฐฉ๋ฒ•์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌ์กฐ๋ฐ ํŠน์„ฑ์— ๋งž๊ฒŒ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.

2.3.7. Redis ์—ฐ๋™
ํŒŒ์ผ/ํด๋” ๋ชฉ์ 
./lib/redis_service.rb Vcap ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜์—ฌ Connection์„ ์ƒ์„ฑํ•˜๋Š” ํด๋ž˜์Šค
./app/controllers/login_controller.rb ์„œ๋น„์Šค Connection ํด๋ž˜์Šค ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค
  1. ./lib/rddis_service.rb
  • Vcap ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜์—ฌ Redis Connection์„ ์ƒ์„ฑํ•˜๋Š” ํด๋ž˜์Šค
require 'vcap'
module Connector
  class RedisService < VcapService::Vcap

    def initialize
      super()
    end
    def connector
      credentials = serviceInfo('redis-sb') # โ€œredis-sbโ€ ์„œ๋น„์Šค credentials ์กฐํšŒ
      Redis.new(:host => credentials['host'],
                :port => credentials['port'],
                :password => credentials['password'])
    end
  end
end
  1. ./app/controllers/login_controller.rb ์„œ๋น„์Šค Connection ํด๋ž˜์Šค ํ˜ธ์ถœ
# encoding: UTF-8      # Encoding ์ง€์ •(ํ•œ๊ธ€์ง€์›)
require โ€˜redis_serviceโ€™    # redis_service ํด๋ž˜์Šค ์ถ”๊ฐ€ (๊ฐ ์„œ๋น„์Šค๋ณ„ ํด๋ž˜์Šค ์ถ”๊ฐ€๋ถ€๋ถ„)
class LoginController < ApplicationController
  #์„ ์ฒ˜๋ฆฌ ๋ฉ”์†Œ๋“œ
  before_action :redis_connection # Redis ์„œ๋ฒ„ ์ ‘์†

  def login
    id = params[:id]
    pwd = params[:password]

    if id == nil || id =='' || pwd == nil || pwd == ''
      render json: {error: 'request value wrong'}, status: 400
    elsif (id.eql? 'admin') && (pwd.eql? 'admin')
      key = SecureRandom.uuid.to_s
      @redis.set(key, "admin")
      cookies['login_cookie'] = key
      render json: {}
    else
      render json: {error: 'not authz'}, status: 401
    end
  end

  def logout
    key = cookies['login_cookie'].to_s
    p key
    @redis.del(key)
    render json: {}
  end

  def redis_connection
    @redis = Connector::RedisService.new.connector  #์„œ๋น„์Šค ์—ฐ๋™ ํด๋ž˜์Šค๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ ‘์†์ •๋ณด๋ฅผ ํš๋“ํ•˜๊ณ  ์ด๋ฅผ ํด๋ž˜์Šค ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜์˜€๋‹ค.
  end
end

โ€ปํ•ด๋‹น ํด๋ž˜์Šค๋Š” ์ƒ˜ํ”Œ ์˜ˆ์ œ์ด๋ฉฐ ์„œ๋น„์Šค์˜ ์ ‘์†์ •๋ณด์˜ ํš๋“ ๋ฐ ํ™œ์šฉ ๋ฐฉ๋ฒ•์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌ์กฐ๋ฐ ํŠน์„ฑ์— ๋งž๊ฒŒ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.

2.3.8. RabbitMQ์—ฐ๋™
ํŒŒ์ผ/ํด๋” ๋ชฉ์ 
./lib/rabbitmq_service.rb Vcap ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜์—ฌ Connection์„ ์ƒ์„ฑํ•˜๋Š” ํด๋ž˜์Šค
./app/controllers/status_controller.rb ์„œ๋น„์Šค Connection ํด๋ž˜์Šค ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค
  1. ./lib/rabbitmq_service.rb
  • Vcap ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜์—ฌ RabbitMQ Connection์„ ์ƒ์„ฑํ•˜๋Š” ํด๋ž˜์Šค
require 'vcap'
module Connector
  class RabbitmqService < VcapService::Vcap

    def initialize
      super()
    end
    def connector

      credentials = serviceInfo('p-rabbitmq') # โ€œp-rabbitmqlโ€ ์„œ๋น„์Šค credentials ์กฐํšŒ
      protocols = credentials['protocols']
      amqp_credentials = protocols['amqp+ssl'] || protocols['amqp']
      Bunny.new(
          :host      => amqp_credentials['hosts'].sample,
          :port      => amqp_credentials['port'],
          :vhost     => amqp_credentials['vhost'],
          :user      => amqp_credentials['username'],
          :pass      => amqp_credentials['password'],
          tls_ca_certificates: %w(./tls/ca_certificate.pem),
          verify_peer: false)
    end
  end
end

โ€ปBunny 2.2.x ์ดํ›„ ๋“œ๋ผ์ด๋ฒ„ ๋ฒ„์ „์—์„œ๋Š” TLS/SSL CA์˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์œผ๋กœ ์„ค์ •๋œ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. Ex) Ubuntu/Debian : /etc/ssl/certs/ca-certificates.crt

  1. ./app/controllers/status_controller.rb ์„œ๋น„์Šค Connection ํด๋ž˜์Šค ํ˜ธ์ถœ
# encoding: UTF-8      # Encoding ์ง€์ •(ํ•œ๊ธ€์ง€์›)
require โ€˜rabbitmq_serviceโ€™    # rabbitmq_service ํด๋ž˜์Šค ์ถ”๊ฐ€ (๊ฐ ์„œ๋น„์Šค๋ณ„ ํด๋ž˜์Šค ์ถ”๊ฐ€๋ถ€๋ถ„)
class StatusController < ApplicationController
  before_action :rabbit_ connection # RabbitMQ ์„œ๋ฒ„ ์ ‘์†
  def status

    if ENV['RAILS_ENV'].to_s != "development" && !ENV['RAILS_ENV'].to_s != "test"
      @conn.start

      orgId = params[:org_id]
      dbType = params[:db_type]
      queue_name = dbType +'_'+ orgId.to_s

      @channel ||= @conn.create_channel
      @queue ||= @channel.queue(queue_name, :auto_delete => true)

      if @conn.queue_exists?(queue_name)
        delivery_info, metadata, payload = @queue.pop
      else
        delivery_info, metadata, payload = nil
      end

      @conn.stop
    end

    if payload == nil || payload.length == 0
      payload = 'NO_CHANGES'
    end
    render json: {:status => payload}

  end

  def rabbit_connection
    @conn = Connector::RabbitmqService.new.connector   #์„œ๋น„์Šค ์—ฐ๋™ ํด๋ž˜์Šค๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ ‘์†์ •๋ณด๋ฅผ ํš๋“ํ•˜๊ณ  ์ด๋ฅผ ํด๋ž˜์Šค ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜์˜€๋‹ค.

  end
end

โ€ปํ•ด๋‹น ํด๋ž˜์Šค๋Š” ์ƒ˜ํ”Œ ์˜ˆ์ œ์ด๋ฉฐ ์„œ๋น„์Šค์˜ ์ ‘์†์ •๋ณด์˜ ํš๋“ ๋ฐ ํ™œ์šฉ ๋ฐฉ๋ฒ•์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌ์กฐ๋ฐ ํŠน์„ฑ์— ๋งž๊ฒŒ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.

2.3.9. GlusterFS ์—ฐ๋™
ํŒŒ์ผ/ํด๋” ๋ชฉ์ 
./lib/glusterfs_service.rb Vcap ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜์—ฌ Connection์„ ์ƒ์„ฑํ•˜๋Š” ํด๋ž˜์Šค
./app/controllers/upload_controller.rb ์„œ๋น„์Šค Connection ํด๋ž˜์Šค ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ ํด๋ž˜์Šค
  1. ./lib/glusterfs_service.rb
  • Vcap ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•˜์—ฌ GlusterFS Connection์„ ์ƒ์„ฑํ•˜๋Š” ํด๋ž˜์Šค
require 'vcap'
module Connector
  class Glusterfs < VcapService::Vcap

    def initialize
      super()
    end
    def connector
      credentials = serviceInfo('glusterfs') # โ€œglusterfsโ€ ์„œ๋น„์Šค credentials ์กฐํšŒ
      Fog::Storage.new({
                           :provider            => 'OpenStack',
                           :openstack_username  => credentials['username'],
                           :openstack_api_key   => credentials['password'],
                           :openstack_auth_url  => credentials['auth_url']+'/tokens'
                       })
    end
  end
end
  1. ./app/controllers/upload_controller.rb ์„œ๋น„์Šค Connection ํด๋ž˜์Šค ํ˜ธ์ถœ
# encoding: UTF-8      # Encoding ์ง€์ •(ํ•œ๊ธ€์ง€์›)
require โ€˜glusterfs_serviceโ€™    # glusterfs_service ํด๋ž˜์Šค ์ถ”๊ฐ€ (๊ฐ ์„œ๋น„์Šค๋ณ„ ํด๋ž˜์Šค ์ถ”๊ฐ€๋ถ€๋ถ„)
class UploadController < ApplicationController
  before_filter :authenticate   # ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ์ „ ์ธ์ฆ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  before_action :gs_connection  # ํŒŒ์ผ ์—…๋กœ๋“œ๋ฅผ ์œ„ํ•œ Swift ์ธ์ฆ์ •๋ณด๋ฅผ ํš๋“ํ•ฉ๋‹ˆ๋‹ค.

  # ํŒŒ์ผ์„ ์—…๋กœ๋“œ ํ•ฉ๋‹ˆ๋‹ค.
  def upload
    @img = params[:file]

    if @img == nil || @img == ''
      render json: {error: 'request value wrong'}, status: 400
    else
      cont = @service.directories.get "ruby-thumb"

      if cont == nil
        cont = @service.directories.create :key => 'ruby-thumb', :public => true
        cont.save
      end

      file = cont.files.create :key => DateTime.now.strftime('%Q')+"_" + @img.original_filename, :body => File.open(@img.tempfile.path)

      render json: {thumb_img_path: file.public_url}
    end
  end

  def gs_connection
    @service = Connector::Glusterfs.new.connector   #์„œ๋น„์Šค ์—ฐ๋™ ํด๋ž˜์Šค๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ ‘์†์ •๋ณด๋ฅผ ํš๋“ํ•˜๊ณ  ์ด๋ฅผ ํด๋ž˜์Šค ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜์˜€๋‹ค.

  end
end

โ€ปํ•ด๋‹น ํด๋ž˜์Šค๋Š” ์ƒ˜ํ”Œ ์˜ˆ์ œ์ด๋ฉฐ ์„œ๋น„์Šค์˜ ์ ‘์†์ •๋ณด์˜ ํš๋“ ๋ฐ ํ™œ์šฉ ๋ฐฉ๋ฒ•์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌ์กฐ๋ฐ ํŠน์„ฑ์— ๋งž๊ฒŒ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.

2.4. ๋ฐฐํฌ

๊ฐœ๋ฐœ ์™„๋ฃŒ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐฉํ˜• ํ”Œ๋žซํผ์— ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•œ๋‹ค.

2.4.1. ๊ฐœ๋ฐฉํ˜• ํ”Œ๋žซํผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ
ํŒŒ์ผ/ํด๋” ๋ชฉ์ 
./manifest.yml ๊ฐœ๋ฐฉํ˜• ํ”Œ๋žซํผ ๋ฐฐํฌ ํ™˜๊ฒฝ ์„ค์ • ํŒŒ์ผ
  1. ./manifest.yml ์ƒ์„ฑ
  • cf push ๋ช…๋ น์‹œ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ manifest.yml์„ ์ฐธ์กฐํ•˜์—ฌ ๋ฐฐํฌ๊ฐ€ ์ง„ํ–‰๋œ๋‹ค.
---
applications:
- name: ruby-sample-app # ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฆ„
  memory: 512M        # ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์ด์ฆˆ
  instances: 1           # ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์Šคํ„ด์Šค ๊ฐœ์ˆ˜
  path: .                # ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์œ„์น˜
  command: bundle exec rails server -p $PORT # ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ ํ›„ ์‹คํ–‰ ๋ช…๋ น์–ด

โ€ป์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šคํ…Œ์ด์ง•์‹œ ํ• ๋‹ฌ ๋ฐ›์€ ํฌํŠธ๊ฐ€ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๋“ฑ๋ก๋˜์–ด์žˆ๋‹ค. ์ด $PORT๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ ์ฒดํฌ์—๋„ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ์œ„์™€ ๊ฐ™์ด ํฌํŠธ๋ฅผ ์ง€์ •ํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

  1. ๊ฐœ๋ฐฉํ˜• ํ”Œ๋žซํผ ๋กœ๊ทธ์ธ
$ cf api https://api.cf.open-paas.com   # ๊ฐœ๋ฐฉํ˜• ํ”Œ๋žซํผ TARGET ์ง€์ •
 #cf api [๊ฐœ๋ฐฉํ˜• ํ”Œ๋žซํผ API ์ฃผ์†Œ] : ๊ฐœ๋ฐฉํ˜• ํ”Œ๋žซํผ API ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•œ๋‹ค.

$ cf login -u testUser -o sample_test -s sample_space   # ๋กœ๊ทธ์ธ ์š”์ฒญ
 #cf login โ€“u [์‚ฌ์šฉ์ž ์ด๋ฆ„] โ€“o [์กฐ์ง๋ช…] โ€“s [์ŠคํŽ˜์ด์Šค๋ช…] : ์กฐ์ง, ์ŠคํŽ˜์ด์Šค๊ฐ€ ์—†์„๊ฒฝ์šฐ ์ƒ์„ฑํ•„์š”

API endpoint: https://api.cf.open-paas.com

Password> 
Authenticating...
OK

Targeted org sample_test

Targeted space sample_space
                   
API endpoint:   https://api.cf.open-paas.com (API version: 2.29.0)   
User:           testUser   
Org:            sample_test   
Space:          sample_space   

$
  1. ๊ฐœ๋ฐฉํ˜• ํ”Œ๋žซํผ ์„œ๋น„์Šค ์ƒ์„ฑ
$ cf marketplace     # ๋งˆ์ผ“ํ”Œ๋ ˆ์ด์Šค ๋ชฉ๋ก ์š”์ฒญ

service         plans                    description
p-mysql	       100mb, 1gb		MySQL databases on demand   
p-rabbitmq     standard		        RabbitMQ is a robust โ€ฆ..   
redis-sb	       shared-vm, dedicated-vm	Redis service to provide a โ€ฆโ€ฆ

$ cf create-service p-mysql 100mb sample-mysql-instance    # ์„œ๋น„์Šค ์ƒ์„ฑ
 #cf create-service [์„œ๋น„์Šค๋ช…] [ํ”Œ๋žœ๋ช…] [์ƒ์„ฑํ•  ์„œ๋น„์Šค๋ช…]

$ cf services    # ์„œ๋น„์Šค ๋ชฉ๋ก ์กฐํšŒ

name                       service       plan              bound apps		lastโ€ฆ
sample-mysql-instance       p-mysql      100mb            node-sample, p....	โ€ฆ
sample-rabbitmq-instance    p-rabbitmq   standard           python-sample-....	โ€ฆ
sample-redis-instance        redis-sb      shared-vm         python-sample-....	โ€ฆ
  1. ๊ฐœ๋ฐฉํ˜• ํ”Œ๋žซํผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์„œ๋น„์Šค ๋ฐ”์ธ๋”ฉ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘
$ cf push -b https://github.com/cloudfoundry/ruby-buildpack.git#v1.3.1 --no-start 
# ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—…๋กœ๋“œ๋งŒ ์‹คํ–‰ํ•˜๊ณ  ์‹œ์ž‘ํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.
# ์ตœ๊ทผ Ruby ๋นŒ๋“œํŒฉ(1.3.1์ดํ›„)์€ Ruby 1.9.3์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค. Ruby 1.9.3์„ ์ง€์›ํ•˜๋Š” ๋นŒ๋“œํŒฉ์„ ์ง€์ •ํ•˜์—ฌ ๋ฐฐํฌํ•œ๋‹ค. ๊ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ Ruby ๋ฒ„์ „์— ๋งž๋Š” ๋นŒ๋“œํŒฉ์„ ์ง€์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•˜๊ฑฐ๋‚˜ ๊ฐœ๋ฐฉํ˜• ํ”Œ๋žซํผ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋ณธ ๋นŒ๋“œํŒฉ์„ ์‚ฌ์šฉํ• ๊ฒฝ์šฐ โ€“b ์˜ต์…˜์„ ์ œ์™ธ ํ•˜์—ฌ๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.
# cf push โ€“b [์‚ฌ์šฉ์ž ๋นŒ๋“œํŒฉ URL] โ€“no-start

$ cf services   # ์„œ๋น„์Šค ๋ชฉ๋ก ์กฐํšŒ

name                       service       plan              bound apps		lastโ€ฆ
sample-mysql-instance       p-mysql      100mb            node-sample, p....	โ€ฆ
sample-cubrid-instance      CubridDB      utf8              node-sample, p....	โ€ฆ
sample-mongo-instance      Mongo-DB   default-plan        node-sample, p....	โ€ฆ
sample-rabbitmq-instance    p-rabbitmq   standard           python-sample-....	โ€ฆ
sample-redis-instance        redis-sb      shared-vm         python-sample-....	โ€ฆ
sample-glusterfs-instance    glusterfs      glusterfs-1000Mb   glusterfs-samp....	โ€ฆ

$ cf bind-service ruby-sample-app sample-mysql-instance   # ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋น„์Šค ๋ฐ”์ธ๋”ฉ
# cf bind-service [์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ช…] [์„œ๋น„์Šค ๋ช…]

$ cf start ruby-sample-app    # ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘
# cf start [์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ช…]

โ€ป์ตœ์‹  ๋นŒ๋“œํŒฉ์€ Ruby 1.9.3์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ruby-buildpack 1.3.1 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐฉํ˜• ํ”Œ๋žซํผ์—์„œ ์ง€์›ํ•˜๋Š” ๊ธฐ๋ณธ ๋นŒ๋“œํŒฉ์„ ์‚ฌ์šฉํ• ๊ฒฝ์šฐ โ€“b ์˜ต์…˜์„ ์ œ์™ธ

โ€ป์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ์ ˆ์ฐจ๋ฅผ ์œˆ๋„์šฐ ๋จธ์‹ ์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ(cf cli๋ฅผ ์œˆ๋„์šฐ ๋จธ์‹ ์— ์„ค์น˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ), ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘('cf start')์ด ์ œ๋Œ€๋กœ ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ๋Š” bin ํด๋”๋‚ด์˜ 3๊ฐœ์˜ ํŒŒ์ผ bundle, rake, rails๋ฅผ ์œ ๋‹‰์Šค์šฉ์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ 'cf push' ๋ถ€ํ„ฐ ๋‹ค์‹œ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ ๋ณ€ํ™˜ ์ ˆ์ฐจ๋Š” ๋‹ค์Œ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

  1. ์œˆ๋„์šฐ ์ปค๋งจ๋“œ ์ฐฝ์„ ์—ด์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํด๋”๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

  2. (๋ฐฉ๋ฒ•1.) ๋‹ค์Œ์˜ url์—์„œ dos2unix๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•˜๊ณ  ์••์ถ•์„ ํ•ด์ œํ•˜์—ฌ dos2unix.exeํŒŒ์ผ์„ ์ƒ˜ํ”Œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ bin ํด๋”๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    http://sourceforge.net/projects/dos2unix/files/latest/download

    (๋ฐฉ๋ฒ•2.) ์ƒ˜ํ”Œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ 'git clone'ํ•œ ์‚ฌ์šฉ์ž๋Š” ๋‹ค์Œ์˜ ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํด๋” ๋‚ด์˜ dos2unix ํŒŒ์ผ์˜ ํŒŒ์ผ๋ช…์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. 'rename' ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋ฉด, 'ren' ๋ช…๋ น์–ด๋ฅผ ๋Œ€์‹  ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์ง์ ‘ ํŒŒ์ผ๋ช…์„ 'dos2unix.exe'๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ๋„ ๋ฌด๋ฐฉํ•ฉ๋‹ˆ๋‹ค.

rename dos2unix dos2unix.exe

  1. ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ bin ํด๋” ๋‚ด์˜ 3๊ฐœ์˜ ํŒŒ์ผ์„ ์œ ๋‹‰์Šค ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

dos2unix bin/bundle bin/rake bin/rails
โ€ป ์œˆ๋„์šฐ์ฆˆ Power Shell์—์„œ๋Š” ํ•ด๋‹น ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ด์šฉํ•˜๋ฉด ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณ€ํ™˜์ด ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ™”๋ฉด์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ruby16

  1. [4) ๊ฐœ๋ฐฉํ˜• ํ”Œ๋žซํผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์„œ๋น„์Šค ๋ฐ”์ธ๋”ฉ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘] ์ ˆ์ฐจ๋ฅผ ๋‹ค์‹œ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

2.5. ํ…Œ์ŠคํŠธ

Rspec์„ ์ด์šฉํ•œ Ruby ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ…Œ์ŠคํŠธ

  1. ํด๋” ๋ฐ ํŒŒ์ผ ์ •์˜
ํŒŒ์ผ/ํด๋” ๋ชฉ์ 
Spec rspec ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๋ฃจ๋น„ ํŒŒ์ผ์ด ์กด์žฌ ํด๋”
*_spec rspec ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๋ฃจ๋น„ ํŒŒ์ผ
  1. ํ…Œ์ŠคํŠธ ์‹คํ–‰

bundle exec rspec
โ€ป์ •์ƒ์ ์ธ ํ…Œ์ŠคํŠธ ์ง„ํ–‰์„ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น ์„œ๋น„์Šค์™€ ์ ‘์†์ด ๊ฐ€๋Šฅํ•˜์—ฌ์•ผ ํ•œ๋‹ค.(ํ”„๋ก์‹œ, ํ„ฐ๋„๋ง ๋“ฑ..)

Index > AP User Guide > Ruby ๊ฐœ๋ฐœ