Ruby on Rails 와함께하는 애자일웹개발 2007-05-31 유스풀패러다임김석준 (sjoonk@gmail.com)
Start! 2
1. 프로젝트준비 미션 타겟팅 & 사용자조사 서비스 Ideation 개발프레임워크의선택 개발환경 RoR의기본개념들 3
미션 (Mission) 사람들의인맥관리를 도와주는서비스 4
타겟팅 SI vs. 웹서비스 사용자의특정성? User Segmentation 브레인스토밍 + 직관 (?) 타겟프로파일 20대후반 ~ 40대 직장인또는자영업자 인터넷사용자 타겟유저인터뷰 5
사용자조사 일주일에한번 전화 Day 를정하거나하루한시간정도시간을내어친지, 지인에안부를묻는다. 상대방에대해지속적으로관심을가질수있어야. 인맥관리리스트가있으면좋겠다. 인맥은연결될수록강해지는근육질같은것. 좋은인맥을많은사람에게소개해줄수있으면... 처음소개받고명함교환하고정답게인사했다하더라도차츰잊혀지기시작 잠자는인맥을 깨우고, 연결하고, 각성시켜주는 그런장치가있으면좋겠다. 6
페르소나 (Persona) 김일점 / 34 세 ( 남 ) 직업 : 외국계 IT 회사시스템관리자 자주가는사이트 : SCR 클럽, DC 인사이드 인맥보다는일처리가더중요하다고생각했어요. 사교적이지못하기도하구요. 그러나최근인맥의중요성을실감합니다. 이런내가인맥을관리할수있도록도와주는도구가있으면좋겠습니다. 허무회 / 40 세 ( 남 ) 직업 : 개인사업가 ( 부동산 ) 자주가는사이트 : 머니투데이, 조선닷컴 아는사람은많은데, 그렇게친하다고는생각되지않습니다. 막상혼자있을때전화를걸거나만날사람을떠올리면? 글쎄요. 지속적으로관계를이어나갈수있는무언가가있으면좋을것같군요. 7
서비스 Ideation : 주요기능도출 8
서비스 Ideation : Paper Prototyping 9
개발프레임워크의선택 Ruby on Rails Django ErlyWeb Struts ASP.NET PHP... Why? 10
개발환경 RadRails LAMP Subversion Team Wiki 모임기록 피드백 정보공유 11
RoR 의기본개념들 MVC 아키텍처 액티브레코드, 액션팩 ( 액션뷰, 액션컨트롤러 ) 구성보다관례 (Convension over Configuration) 스캐폴딩 ERb 템플릿 레일스라우팅 ORM 데이터베이스마이그레이션 자바스크립트 & Ajax 통합 12
2. Iteration I 1 차개발 가치중심사용자스토리 즉석설계 개발시작 사용자별페이지만들기 첫릴리즈 자바스크립트와 Ajax Ajax 어디까지적용할것인가? RJS or Not? 13
가치중심사용자스토리 14
스토리 : 선택과추정 xxx xx 3 xxxxx 4 4 xxxx xx xxxxx 0.5 xxxxxxx 4 xxxxx xxx 4.5 4 4 xxxx xx 4 xxxxxxx 4 xxx xxx 사용자가치우선 무엇을했을때사용자가가장가치를느낄까? 시단위작업추정 1 주단위로구분 간략한서술 알아볼수만있으면 기능 / 비기능포함 예 : 테스터에이메일발송 15
스토리 : 작업관리 새로운가치발견 오늘할일 피드백 할일목록 4 4 xxxx xx xxxxx 배포 완료한일 (Wiki 에기록 ) 적용 ( 구현 ) 테스트 16
즉석설계 Paper Prototyping 스토리보드 17
개발시작 Person 모델만들기 script/generate model Person / migration Scaffold 생성하고수정하기 script/generate scaffold people main index 헬퍼메서드만들기와각종폼헬퍼들사용하기 Data-only migration 인맥리스트만들기 새스토리추가하기 person Story 모델추가하기 Post-back 액션 has_many :stories, :order => created_at DESC 18
사용자별페이지만들기 User 모델추가 script/generate model User migration 추가하기 Route 추가 user.connect :user, :controller => main, :action => list HTTP_Authentication 플러그인 svn co http://dev.rubyonrails.org/svn/rails/plugins/http_aut hentication/ http_authentication 19
첫릴리즈 20
사용자별페이지라우팅 http://localhost:3000/me http://localhost:3000/me/recent user.connect :user, :controller => main map.connect :user/:action, :controller => main 식별 (recognize) :controller => main, :action => index, :user => user :controller => main, :action => recent, :user => user 생성 (generate) url_for :user => me url_for :user => me, :action => recent user_url me 21
사용자로그인기능구현 가장간단한방법? 직접구현 Rails Recipes #31, #32 등 HTTP Authentication 직접구현? or 플러그인 Httpasswd, http_authentication 등 3rd Party Library & Plugins 활용 Login Engine Login Generator Acts as authenticated 등 22
자바스크립트와 Ajax 특정인의상세정보를집중해서볼수있었으면.. 지난스토리를다볼수있었으면.. Prototype 을이용한 Ajax 호출구현 link_to_remote pagination_links_remote Control.Modal Modal Window Lightbox (http://livepipe.net/projects/control_modal/) 23
Ajax Pagination list.rhtml 파셜 _summary.rhtml 더보기 Close more_msg.rhtml 1 2 3 24
pagination_links_remote module ActionView module Helpers module PaginationHelper def pagination_links_remote(paginator, page_options={}, ajax_options={}, html_options={}) name = page_options[:name] DEFAULT_OPTIONS[:name] params = (page_options[:params] DEFAULT_OPTIONS[:params]).clone pagination_links_each(paginator, page_options) do n params[name] = n ajax_options[:url] = params link_to_remote(n.to_s, ajax_options, html_options) end end end # PaginationHelper end # Helpers end # ActionView 25
Ajax, 어디까지적용할것인가? 26
RJS or Not? remote_form_for :user, :update => userlist, :position => :bottom, :url => { :action => } do <div id= userlist > 액션 : render :partial => :user, :locals => Vs. 파셜 remote_form_for :user, :url => { :action => } do rjs: page.insert_html :bottom, userlist, :partial => :user, :locals => 27
3. ClosedAlpha 사용자테스트와피드백 회고와코드리뷰 28
사용자테스트와피드백 29
회고와코드리뷰 ThreeFs * Facts/ 사실, 한일 Feelings/ 느낌, 감정 Findings/ 배운점, 교훈 코드리뷰 중복제거 (Don t Repeat Yourself!) 고약한냄새 새로운가치의발견? * http://xper.org/wiki/xp/threefs 30
4. Iteration II - 2 차개발 코드리팩터링 사용자가치추가해나가기 vcard와 ERb ( 인맥 ) 관계지도그리기 미처구현하지못한가치들 레일스테스팅프레임워크 31
코드리팩터링 MVC : 역할분담 컨트롤러나누기 파셜뷰와헬퍼의활용 before_filter Post-back 액션 respond_to... RESTful? 32
사용자가치추가해나가기 인맥이한눈에들어오는관계지도... 개인별정보를다운로드받을수있게... 오늘연락할사람을콕찍어줘!... 33
vcard 와 ERb vcard, hcard, Microformats 루비 vcard 라이브러리 ERb 템플릿 def export_vcard @person = Person.find(params[:id]) render :layout => false, :content_type => 'text/x-vcard' end BEGIN:VCARD VERSION:3.0 N:<%= @person.name %> FN:<%= @person.name %> BDAY:<%= @person.birthday.strftime("%y%m%d") %> PHOTO;VALUE=URI:http://example.com/image.png TEL:<%=@person.phone %> TEL;TYPE=office,pref:<%= @person.phone_office %> EMAIL;TYPE=pref:<%= @person.email %> END:VCARD 34
( 인맥 ) 관계지도그리기 The Rails Way Prototype & Script.aculo.us 라이브러리 레일스내장헬퍼메서드 인라인 (inline) 자바스크립트 High-level abtraction The jquery Way Low-level JavaScript 접근 Unobtrusive, 다수의플러그인 Prototype과공존? * 그림출처 : Google 이미지검색 35
미처구현하지못한가치들 오늘꼭연락해야할사람 ( 자동 ) 추천하기 내가아는사람을다른사람과연결짓기 사용자정의필드추가하기 내가지금인맥관리를제대로하고있나? 통계 좀더쉽고편한사용자인터페이스 예 : ㄱ, ㄴ, ㄷ,.., 기타별탭네비게이션 예쁜디자인 성능 ( 최적화 ) 36
레일스테스팅프레임워크 Unit 테스트 Functional 테스트 Integration 테스트 RSpec Selenium, Waitr, Fitnesse 37
5. ClosedBeta 배포와확장 검색기능과 RESTful 레일스 사용자테스트, 측정과분석 38
배포와확장 (scaling) WEBrick (Apache & FCGI) Mongrel Mongrel cluster mod_proxy_balance mongrel Rails App. REQ httpd static (cache) 39
검색기능과 RESTful 레일스 검색기능추가하기 SELECT * WHERE ooo LIKE % 뭐뭐 % Ferret / Acts As Ferret Any other? RESTful 레일스? 리소스 URL CRUD 컨트롤러 map.resources 추가 다양한클라이언트응대 (respond_to) ActiveResource 라이브러리 40
RESTful 레일스로리팩터링 class StoriesController < ApplicationController # GET /stories # GET /stories.xml def index @person = Person.find(params[:person_id]) @stories = Story.find(:all, :conditions => {:person_id => params[:person_id]}) respond_to do format format.html { render :layout => false } format.xml { render :xml => @stories.to_xml } end end # GET /stories/1 # GET /stories/1.xml def show @story = Story.find(params[:id], :conditions => {:person_id => params[:person_id]})... 41
레일스의미래 현재레일스 2.0 모델액티브레코드액티브레코드 뷰 ERb Markaby, DRYML, HAML, Liquid, 컨트롤러 일반컨트롤러 CRUD 컨트롤러 ( 리소스 ) 자바스크립트통합 Prototype 중심 jquery 수용 웹서비스액티브웹서비스액티브리소스 테스팅기능테스트 Rspec 배포 Apache + mongrel Nginx + mongrel 42
사용자테스트, 측정과분석 베타테스팅 ASAP 초대방식과커뮤니케이션 측정과분석 로그분석 Survey 사용자인터뷰 43
6. Lessons Learned 프로젝트반추 성공의이유 다시시작한다면? 고민거리와개인적으로얻은것들 Why RoR? 높은추상화의 DSL... 쉬운접근, 높은생산성 관례에따르기 개방성 ( 루비언어자체, 플러그인등 ) 44
Thank you! 45