ݺߣ

ݺߣShare a Scribd company logo
레일스 를 이용한 애자일 웹 개발  가이드 2008. 3. 14 유스풀패러다임  김석준 ( [email_address] )
애자일 소프트웨어 개발과 레일스 애자일을 지원하는 레일스의 주요 기능들 마무리
“ 사람들이 소프트웨어를 계속 사용하는 한 소프트웨어는 절대로 ‘완료’되지 않는다 . ”
애자일 소프트웨어 개발 People ‘ 프로세스와 도구’ 보다는 ‘개인과 상호작용’ Working Software ‘ 포괄적인 문서화’ 보다는 ‘동작하는 소프트웨어’ Collaboration ‘ 계약 협상’ 보다는 ‘고객과의 협력’ Responsiveness ‘ 계획 준수’ 보다는 ‘변화에 대응’
왜  레일스 인가 ? 레일스는 ..  애자일을 지원하는 하나의 ‘도구’ 설정보다 관례   (Convention over   Configuration) 반복금지 !   (DRY!) 루비 언어 빠른 개발 편리한 유지보수 적은 코딩량 즐거움 ( 행복 ?) 사람 원칙 프랙티스 도구
레일스 세상에 처음 공개 (2004.7) David Heinemeier Hansson Basecamp  프로젝트 (37signals) 가 모태 레일스  1.0 (2005.12) Scaffold  코드 자동 생성 등 레일스  1.1 (2006.3) RJS,  통합테스팅 등 레일스  1.2 (2007.1) 리소스 (resource)  개념 도입 레일스  2.0 (2007.12) MVC  웹 프레임워크에서  REST  플랫폼으로 ( http://weblog.rubyonrails.org/2007/12/7/rails-2-0-it-s-done )
레일스  기본 구성요소들 MVC  구조 액티브레코드 ,  액션뷰 ,  액션컨트롤러 스크립트 자동생성 (code generation) 템플릿 (html, xml, js  등 ) 라우팅 (routing) 액티브레코드와  OR/M 데이터베이스 마이그레이션 자바스크립트와  Ajax  처리 헬퍼 (helper), RJS 배포 (Deployment) 플러그인 (Plugin) REST 와 리소스
레일스  레퍼런스 *  참고 : http://rubyonrails.org/
레일스 의 확산 레일스의 ‘친구’들 Django CakePHP Grails ErlyWeb jRuby on Rails 루비  VM jRuby: Java Powerd Ruby Implementation YARV: Yet Another Ruby VM (ruby 1.9.1)  IronRuby : Ruby + Microsoft .NET Rubinius  등
애자일 소프트웨어 개발과 레일스 애자일을 지원하는 레일스의 주요 기능들 마무리
“ 프로그램이 쓸모 있으려면 어떤 기능이  필수적인지 사용자에게 물어보라 . ”
5 분만에 블로그를 만든다구요 ?? $ rails myblog *  출처 : “ 루비온레일스와 함께하는 애자일 웹개발”  ( 인사이트 )
DEMO Iteration#1 사용자가 글을 작성한다 ?H
설계 먼저 ! “ 리소스 (resource)”  중심 설계 Post http://mycom.kr/posts C reate R etrieve U pdate D elete GET PUT DELETE POST
7 가지 표준  REST  액션들 포스트 삭제 destroy DELETE /posts/1 포스트 갱신 update PUT  /posts/1 새 포스트 생성 create POST /posts 포스트 수정 edit GET  /posts/1/edit 포스트 생성 new GET  /posts/1/new 특정 포스트 show GET  /posts/1 포스트 목록 index GET  /posts 의미 대응 액션 URI
리소스 표현 (representation) def index @posts = Post.find(:all) respond_to do |format| format.html # index.html.erb format.xml  { render :xml => @posts } end end Desktop App. RIA (Flex ..) ActiveResource Mobile (iPhone..) HTML XML JSON . . .
One ‘ 리소스’ , Multi Use  http://localhost:3000/posts http://localhost:3000/posts.xml http://localhost:3000/posts.json http://localhost:3000/posts.iphone . . .
XML-RPC vs. SOAP vs. REST
( 코딩하는데 )  얼마나 걸리나요 ? class User < ActiveRecord::Base has_many :posts end class Post < ActiveRecord::Base belongs_to :user end $ script/generate model User $ script/generate scaffold Post $ rake db:migrate user posts
“ 자기 자신은 정말 많은 노력을 하고 있다고  생각하지만 잘 안되는 이유는 쓸데없는 일에  매달려 있기 때문이다 . ”
액티브레코드와  OR/M class Post < ActiveRecord::Base has_many :comments end class Comment < ActiveRecord::Base belongs_to :post end t.string  &quot;title&quot; t.text  &quot;body&quot; t.datetime &quot;created_at&quot; t.datetime &quot;updated_at&quot; t.integer  &quot;user_id&quot; Post t.integer  &quot;post_id&quot; t.text  &quot;body&quot; t.string  &quot;author&quot; t.datetime &quot;created_at&quot; t.datetime &quot;updated_at&quot; Comment *
다대다 관계의 표현 등 has_and_belongs_to_many (habtm) has_many :through (Rails 1.1  이상 ) 조인 테이블 조인 모델
액티브레코드 마이그레이션 class CreatePosts < ActiveRecord::Migration def self.up create_table :posts do |t| t.string :title t.text :body t.datetime :created_at t.datetime :updated_at t.integer :user_id end end def self.down drop_table :posts end end db/migrate/001_create_posts.rb
“ 요구사항은 잉크처럼 유동적이다 . ”
{ action }.html.erb <h1>New comment</h1> <%= error_messages_for :comment %> <%  form_for([@post, @comment])  do |f| %> <p> <label for=&quot;body&quot;>Body</label><br /> <%= f.text_area :body, :rows => 3 %> <label for=&quot;author&quot;>Author</label><br /> <%= f.text_field :author %> </p> <p> <%= f.submit &quot;Create&quot; %> </p> <% end %> <%= link_to 'Back', posts_path %> app/views/comments/new.html.erb
Prototype 과  scriptaculous  라이브러리 탑재 편리한  JavaScript & Ajax  헬퍼 (helper) 들 RJS (Ruby JavaScript) 점진적 개선하기 (Progressive Enhancement) 레일스와 자바스크립트 <%= javascript_include_tag 'jquery-1.2.3.pack.js' %> <%= yield :javascript %> <%= javascript_include_tag :defaults %> STRUCTURE PRESENTATION BEHAVIOR
바퀴를 다시 만들지 않기 레일스 플러그인 Restful_authentication Will_paginate Attatchment_fu . . . 루비젬 http://rubyforge.org/ http://agilewebdevelopment.com/plugins
“ 단위테스트가 더 나은 설계를 보장하지는  않지만 ,  더 쉬운 코드를 만들어 주고  해야할 일에만 집중하게 해 준다 . ”
레일스 테스팅 프레임워크 Test::Unit 단위 테스팅 모델 객체에 대한 단위 테스팅 :  Unit Test 컨트롤러에 대한 단위 테스팅 :  Functional Test 통합 테스팅 전체 스토리 흐름에 대한 테스팅 :  Integration Test  기타 셀레늄 (selenium) 을 이용한 사용자 테스팅 (blackbox) 참고 : “ 자바 개발자를 위한 레일스” ( 인사이트 ) 6 장 Rcov 를 이용한 테스트 커버리지 관리 등
BDD(Behavior Driven Development) $ script/spec -fs specodelsost_spec.rb Post - title 은 반드시 입력해야 한다 - title 은 중복되어서는 안된다 - title 은  5 자 이상이어야 한다  (PENDING: Not Yet Implemented) - body 는 최대  1,000 자까지 쓸 수 있다  (PENDING: Not Yet Implemented) Pending: Post title 은  5 자 이상이어야 한다  (Not Yet Implemented) Post body 는 최대  1,000 자까지 쓸 수 있다  (Not Yet Implemented) Finished in 0.731 seconds 4 examples, 0 failures, 2 pending
RSpec describe Post  do before(:each) do @post = Post.new end it &quot;title 은 반드시 입력해야 한다 &quot;  do @post.save.should be_false end it &quot;title 은 중복되어서는 안된다 &quot;  do @post.title = 'Original Title' @post.save @new_post = Post.new(:title => 'Original Title') @new_post.save.should_not be_true end it &quot;title 은  5 자 이상이어야 한다 &quot; it &quot;body 는 최대  1,000 자까지 쓸 수 있다 &quot; end Behavior Example
Spec – Code - Refactor
DEMO Iteration#2 사용자는 여러 명의 친구들과  친구관계를 맺는다 ?H
스펙 먼저 ! require File.dirname(__FILE__) + '/../spec_helper' describe User do before(:each) do @user = User.create(:name => ' 김석준 ') end it “ 여러 명의 친구를 가진다 &quot; do kim = User.create(:name => ' 김철수 ') hong = User.create(:name => ' 홍길동 ') @user.friends << kim @user.friends << hong @user.should have(2).friends end end
실패 확인 !
구현 예 ( 자기참조 다대다 연관과 조인모델 ) class User < ActiveRecord::Base has_many :friendships has_many :friends, :through => :friendships end $ script/generate model Freindship $ rake db:migrate class Friendship < ActiveRecord::Base belongs_to :user belongs_to :friend, :class_name => 'User‘ end friend 나 ‘ 김철수’ ‘ 홍길동’ User Friendship * *
성공 !   그러나 완전히 끝난 건 아닙니다 ..
“ 짧은 반복으로 개발하고 점진적으로 배포하자 .   앞으로  1 년이나 남은 프로젝트에서  집중하기란 쉬운 일이 아니다 .” 로컬 빌드 하루에 여러 번 체크 인 반복 1~4 주 기능추가 1~6 월 데모 및 연습 릴리스 *  출처 : “ 애자일 프랙티스”  ( 인사이트 )
레일스 배포 (Deployment) *  출처 : http://ikspres.springnote.com/pages/622563 NginX + Mongrel_cluster Apache + mod_proxy_balance + Mongrel_cluster Pound + Mongrel_cluster Pen/Balance + Mongrel_cluster Mongrel ( evented Mongrel) Webrick 무지 빠르고 .  간지나는 아파치 아니면 안되요 .  좀  복잡해도 참을께요 좀 더 빠르거요 . SSL  되면서요 좀 더 빠른거요 .  쉬우면서 . 이제 조금 알 것 같네요 . 레일스 오늘 처음이에요
애자일 소프트웨어 개발과 레일스 애자일을 지원하는 레일스의 주요 기능들 마무리
경험으로부터의 발견 ( 사용자에게 )  소중한 것 먼저 . 요구사항은 변한다 . 바퀴를 새로 만들려 하지 말자 . 웹표준의 준수 짧은 반복 ,  점진적 개선과 배포 . 테스트 ( 또는 스펙 )  먼저 ! 리소스 (Resource)  중심 사고 . 코드리뷰와  DRY!
끝  =  새로운 시작 Take very small steps 처음부터 코딩으로 달려들지 마세요 .  대신 ,  예제 (example) 를 하나 추가하세요 .  그러면 그 예제가 여러분을 다음 번 할일로 안내할 거예요 .  코드가 꼬이기 전에  리팩터링하는 시간을 가지는 걸  잊지 마세요 .  언제나 코드를  명료하게 유지하세요 . *  출처 :  http:// rspec.info/

More Related Content

레일스를 이용한 애자일 웹 개발 가이드

  • 1. 레일스 를 이용한 애자일 웹 개발 가이드 2008. 3. 14 유스풀패러다임 김석준 ( [email_address] )
  • 2. 애자일 소프트웨어 개발과 레일스 애자일을 지원하는 레일스의 주요 기능들 마무리
  • 3. “ 사람들이 소프트웨어를 계속 사용하는 한 소프트웨어는 절대로 ‘완료’되지 않는다 . ”
  • 4. 애자일 소프트웨어 개발 People ‘ 프로세스와 도구’ 보다는 ‘개인과 상호작용’ Working Software ‘ 포괄적인 문서화’ 보다는 ‘동작하는 소프트웨어’ Collaboration ‘ 계약 협상’ 보다는 ‘고객과의 협력’ Responsiveness ‘ 계획 준수’ 보다는 ‘변화에 대응’
  • 5. 왜 레일스 인가 ? 레일스는 .. 애자일을 지원하는 하나의 ‘도구’ 설정보다 관례 (Convention over Configuration) 반복금지 ! (DRY!) 루비 언어 빠른 개발 편리한 유지보수 적은 코딩량 즐거움 ( 행복 ?) 사람 원칙 프랙티스 도구
  • 6. 레일스 세상에 처음 공개 (2004.7) David Heinemeier Hansson Basecamp 프로젝트 (37signals) 가 모태 레일스 1.0 (2005.12) Scaffold 코드 자동 생성 등 레일스 1.1 (2006.3) RJS, 통합테스팅 등 레일스 1.2 (2007.1) 리소스 (resource) 개념 도입 레일스 2.0 (2007.12) MVC 웹 프레임워크에서 REST 플랫폼으로 ( http://weblog.rubyonrails.org/2007/12/7/rails-2-0-it-s-done )
  • 7. 레일스 기본 구성요소들 MVC 구조 액티브레코드 , 액션뷰 , 액션컨트롤러 스크립트 자동생성 (code generation) 템플릿 (html, xml, js 등 ) 라우팅 (routing) 액티브레코드와 OR/M 데이터베이스 마이그레이션 자바스크립트와 Ajax 처리 헬퍼 (helper), RJS 배포 (Deployment) 플러그인 (Plugin) REST 와 리소스
  • 8. 레일스 레퍼런스 * 참고 : http://rubyonrails.org/
  • 9. 레일스 의 확산 레일스의 ‘친구’들 Django CakePHP Grails ErlyWeb jRuby on Rails 루비 VM jRuby: Java Powerd Ruby Implementation YARV: Yet Another Ruby VM (ruby 1.9.1) IronRuby : Ruby + Microsoft .NET Rubinius 등
  • 10. 애자일 소프트웨어 개발과 레일스 애자일을 지원하는 레일스의 주요 기능들 마무리
  • 11. “ 프로그램이 쓸모 있으려면 어떤 기능이 필수적인지 사용자에게 물어보라 . ”
  • 12. 5 분만에 블로그를 만든다구요 ?? $ rails myblog * 출처 : “ 루비온레일스와 함께하는 애자일 웹개발” ( 인사이트 )
  • 13. DEMO Iteration#1 사용자가 글을 작성한다 ?H
  • 14. 설계 먼저 ! “ 리소스 (resource)” 중심 설계 Post http://mycom.kr/posts C reate R etrieve U pdate D elete GET PUT DELETE POST
  • 15. 7 가지 표준 REST 액션들 포스트 삭제 destroy DELETE /posts/1 포스트 갱신 update PUT /posts/1 새 포스트 생성 create POST /posts 포스트 수정 edit GET /posts/1/edit 포스트 생성 new GET /posts/1/new 특정 포스트 show GET /posts/1 포스트 목록 index GET /posts 의미 대응 액션 URI
  • 16. 리소스 표현 (representation) def index @posts = Post.find(:all) respond_to do |format| format.html # index.html.erb format.xml { render :xml => @posts } end end Desktop App. RIA (Flex ..) ActiveResource Mobile (iPhone..) HTML XML JSON . . .
  • 17. One ‘ 리소스’ , Multi Use http://localhost:3000/posts http://localhost:3000/posts.xml http://localhost:3000/posts.json http://localhost:3000/posts.iphone . . .
  • 18. XML-RPC vs. SOAP vs. REST
  • 19. ( 코딩하는데 ) 얼마나 걸리나요 ? class User < ActiveRecord::Base has_many :posts end class Post < ActiveRecord::Base belongs_to :user end $ script/generate model User $ script/generate scaffold Post $ rake db:migrate user posts
  • 20. “ 자기 자신은 정말 많은 노력을 하고 있다고 생각하지만 잘 안되는 이유는 쓸데없는 일에 매달려 있기 때문이다 . ”
  • 21. 액티브레코드와 OR/M class Post < ActiveRecord::Base has_many :comments end class Comment < ActiveRecord::Base belongs_to :post end t.string &quot;title&quot; t.text &quot;body&quot; t.datetime &quot;created_at&quot; t.datetime &quot;updated_at&quot; t.integer &quot;user_id&quot; Post t.integer &quot;post_id&quot; t.text &quot;body&quot; t.string &quot;author&quot; t.datetime &quot;created_at&quot; t.datetime &quot;updated_at&quot; Comment *
  • 22. 다대다 관계의 표현 등 has_and_belongs_to_many (habtm) has_many :through (Rails 1.1 이상 ) 조인 테이블 조인 모델
  • 23. 액티브레코드 마이그레이션 class CreatePosts < ActiveRecord::Migration def self.up create_table :posts do |t| t.string :title t.text :body t.datetime :created_at t.datetime :updated_at t.integer :user_id end end def self.down drop_table :posts end end db/migrate/001_create_posts.rb
  • 24. “ 요구사항은 잉크처럼 유동적이다 . ”
  • 25. { action }.html.erb <h1>New comment</h1> <%= error_messages_for :comment %> <% form_for([@post, @comment]) do |f| %> <p> <label for=&quot;body&quot;>Body</label><br /> <%= f.text_area :body, :rows => 3 %> <label for=&quot;author&quot;>Author</label><br /> <%= f.text_field :author %> </p> <p> <%= f.submit &quot;Create&quot; %> </p> <% end %> <%= link_to 'Back', posts_path %> app/views/comments/new.html.erb
  • 26. Prototype 과 scriptaculous 라이브러리 탑재 편리한 JavaScript & Ajax 헬퍼 (helper) 들 RJS (Ruby JavaScript) 점진적 개선하기 (Progressive Enhancement) 레일스와 자바스크립트 <%= javascript_include_tag 'jquery-1.2.3.pack.js' %> <%= yield :javascript %> <%= javascript_include_tag :defaults %> STRUCTURE PRESENTATION BEHAVIOR
  • 27. 바퀴를 다시 만들지 않기 레일스 플러그인 Restful_authentication Will_paginate Attatchment_fu . . . 루비젬 http://rubyforge.org/ http://agilewebdevelopment.com/plugins
  • 28. “ 단위테스트가 더 나은 설계를 보장하지는 않지만 , 더 쉬운 코드를 만들어 주고 해야할 일에만 집중하게 해 준다 . ”
  • 29. 레일스 테스팅 프레임워크 Test::Unit 단위 테스팅 모델 객체에 대한 단위 테스팅 : Unit Test 컨트롤러에 대한 단위 테스팅 : Functional Test 통합 테스팅 전체 스토리 흐름에 대한 테스팅 : Integration Test 기타 셀레늄 (selenium) 을 이용한 사용자 테스팅 (blackbox) 참고 : “ 자바 개발자를 위한 레일스” ( 인사이트 ) 6 장 Rcov 를 이용한 테스트 커버리지 관리 등
  • 30. BDD(Behavior Driven Development) $ script/spec -fs specodelsost_spec.rb Post - title 은 반드시 입력해야 한다 - title 은 중복되어서는 안된다 - title 은 5 자 이상이어야 한다 (PENDING: Not Yet Implemented) - body 는 최대 1,000 자까지 쓸 수 있다 (PENDING: Not Yet Implemented) Pending: Post title 은 5 자 이상이어야 한다 (Not Yet Implemented) Post body 는 최대 1,000 자까지 쓸 수 있다 (Not Yet Implemented) Finished in 0.731 seconds 4 examples, 0 failures, 2 pending
  • 31. RSpec describe Post do before(:each) do @post = Post.new end it &quot;title 은 반드시 입력해야 한다 &quot; do @post.save.should be_false end it &quot;title 은 중복되어서는 안된다 &quot; do @post.title = 'Original Title' @post.save @new_post = Post.new(:title => 'Original Title') @new_post.save.should_not be_true end it &quot;title 은 5 자 이상이어야 한다 &quot; it &quot;body 는 최대 1,000 자까지 쓸 수 있다 &quot; end Behavior Example
  • 32. Spec – Code - Refactor
  • 33. DEMO Iteration#2 사용자는 여러 명의 친구들과 친구관계를 맺는다 ?H
  • 34. 스펙 먼저 ! require File.dirname(__FILE__) + '/../spec_helper' describe User do before(:each) do @user = User.create(:name => ' 김석준 ') end it “ 여러 명의 친구를 가진다 &quot; do kim = User.create(:name => ' 김철수 ') hong = User.create(:name => ' 홍길동 ') @user.friends << kim @user.friends << hong @user.should have(2).friends end end
  • 36. 구현 예 ( 자기참조 다대다 연관과 조인모델 ) class User < ActiveRecord::Base has_many :friendships has_many :friends, :through => :friendships end $ script/generate model Freindship $ rake db:migrate class Friendship < ActiveRecord::Base belongs_to :user belongs_to :friend, :class_name => 'User‘ end friend 나 ‘ 김철수’ ‘ 홍길동’ User Friendship * *
  • 37. 성공 ! 그러나 완전히 끝난 건 아닙니다 ..
  • 38. “ 짧은 반복으로 개발하고 점진적으로 배포하자 . 앞으로 1 년이나 남은 프로젝트에서 집중하기란 쉬운 일이 아니다 .” 로컬 빌드 하루에 여러 번 체크 인 반복 1~4 주 기능추가 1~6 월 데모 및 연습 릴리스 * 출처 : “ 애자일 프랙티스” ( 인사이트 )
  • 39. 레일스 배포 (Deployment) * 출처 : http://ikspres.springnote.com/pages/622563 NginX + Mongrel_cluster Apache + mod_proxy_balance + Mongrel_cluster Pound + Mongrel_cluster Pen/Balance + Mongrel_cluster Mongrel ( evented Mongrel) Webrick 무지 빠르고 . 간지나는 아파치 아니면 안되요 . 좀  복잡해도 참을께요 좀 더 빠르거요 . SSL 되면서요 좀 더 빠른거요 . 쉬우면서 . 이제 조금 알 것 같네요 . 레일스 오늘 처음이에요
  • 40. 애자일 소프트웨어 개발과 레일스 애자일을 지원하는 레일스의 주요 기능들 마무리
  • 41. 경험으로부터의 발견 ( 사용자에게 ) 소중한 것 먼저 . 요구사항은 변한다 . 바퀴를 새로 만들려 하지 말자 . 웹표준의 준수 짧은 반복 , 점진적 개선과 배포 . 테스트 ( 또는 스펙 ) 먼저 ! 리소스 (Resource) 중심 사고 . 코드리뷰와 DRY!
  • 42. 끝 = 새로운 시작 Take very small steps 처음부터 코딩으로 달려들지 마세요 . 대신 , 예제 (example) 를 하나 추가하세요 . 그러면 그 예제가 여러분을 다음 번 할일로 안내할 거예요 . 코드가 꼬이기 전에 리팩터링하는 시간을 가지는 걸 잊지 마세요 . 언제나 코드를 명료하게 유지하세요 . * 출처 : http:// rspec.info/