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 와 리소스
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 등
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 . . .
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 "title" t.text "body" t.datetime "created_at" t.datetime "updated_at" t.integer "user_id" Post t.integer "post_id" t.text "body" t.string "author" t.datetime "created_at" t.datetime "updated_at" 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
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 "title 은 반드시 입력해야 한다 " do @post.save.should be_false end it "title 은 중복되어서는 안된다 " do @post.title = 'Original Title' @post.save @new_post = Post.new(:title => 'Original Title') @new_post.save.should_not be_true end it "title 은 5 자 이상이어야 한다 " it "body 는 최대 1,000 자까지 쓸 수 있다 " end Behavior Example
34. 스펙 먼저 ! require File.dirname(__FILE__) + '/../spec_helper' describe User do before(:each) do @user = User.create(:name => ' 김석준 ') end it “ 여러 명의 친구를 가진다 " do kim = User.create(:name => ' 김철수 ') hong = User.create(:name => ' 홍길동 ') @user.friends << kim @user.friends << hong @user.should have(2).friends end end
41. 경험으로부터의 발견 ( 사용자에게 ) 소중한 것 먼저 . 요구사항은 변한다 . 바퀴를 새로 만들려 하지 말자 . 웹표준의 준수 짧은 반복 , 점진적 개선과 배포 . 테스트 ( 또는 스펙 ) 먼저 ! 리소스 (Resource) 중심 사고 . 코드리뷰와 DRY!
42. 끝 = 새로운 시작 Take very small steps 처음부터 코딩으로 달려들지 마세요 . 대신 , 예제 (example) 를 하나 추가하세요 . 그러면 그 예제가 여러분을 다음 번 할일로 안내할 거예요 . 코드가 꼬이기 전에 리팩터링하는 시간을 가지는 걸 잊지 마세요 . 언제나 코드를 명료하게 유지하세요 . * 출처 : http:// rspec.info/