Rails 1.2 Release Candidate 1이 나왔습니다!

RJS기능을 앞에 내세웠던 Rails 1,1이 발표된지 8개월만에 Rails 1.2가 정식 배포를 준비중입니다. deepblue님께서 소개해주신대로 Rails 1.2에서는 REST가 중요한 화두입니다. 사실 저도 이 기능을 사용하기 위해 EdgeRails를 사용해왔습니다. Rails 1.1.6에 덧붙여진 무수히 많은 신기능들을 써보고 싶어서지요. EdgeRails는 rubyonrails.org의 소스트리에 있는 가장 최신의 소스를 받아서 사용하는 것을 말합니다. 콘솔에서 rake freeze:rails:edge라는 명령어를 통해서 Rails 1.1.6 gem이 독자적인 rails 소스 받아서 사용하도록 프로젝트를 변경할 수 있습니다. 매번 패치가 나올때 마다 소스를 업테이트 해줘야했습니다. 덕분에 주변 사람들을 좀 괴롭혀왔지요.

이번에 나올(release candidate란 정식 배포를 위한 준비본입니다. 아직 정식 배포가 된 것이 아니에요~) Rails 1.2에서  주목할 기능은 단연 REST와 Multibyte입니다.

REST란 Representation State Transfer의 줄임말입니다.
웹 프로그래밍을 해보신 분들은 GET과 POST에 대해서 들어보신 적이 있으실 겁니다. 그 차이도 잘 알고 계시죠? REST는 여기서 한발 더 나아갑니다. RESTful한 CRUD(create, read, update, delete 4가지의 기본적인 행동을 말합니다.)를 작성한다는 것은 GET과 POST이외 PUT과 DELETE라는 방법을 사용한다는 것입니다.
PUT이나 DELETE라는 전송방법을 처음 들어보신 분들이 계실것 같습니다. (저도 rails를 통해 처음 알게 되었습니다.) 기능상 구현이 된 것이 아니고 인터넷 전송에서 GET과 POST이외에 "전송의 목적를 전송방법으로 알수 있게 해보자"는 목적으로 PUT과 DELETE도 써보자는 제안에서 나온 것입니다. 현존하는  브라우져에서는 아직 지원되지 않기 때문에 실제로는 변수를 통해 PUT인지 DELETE인지를 추가로 전달하게 되어있지만, 대단한 발상의 전환입니다.
게시판의 글을 읽기 위해서는 GET을 통해 글 번호를 전달하고, 글을 새로 작성하기 위해서는 POST를 써왔습니다. 여기에 덧붙여서 글을 수정할때는 PUT을, 글 삭제에는 DELETE을 사용하자는 것이지요. 이렇게 전송방식에 의미를 부여하여 다음과 같이 컨트롤러를 작성하게 됩니다.
 
  # GET /posts
  def index
    # 글 목록 갖고오기
  end

  # GET /posts/1
  def show
    # 1번의 글을 갖고오기
  end

  # GET /posts/new
  def new
    # 새글 쓰는 화면을 위한 코드 - a
  end

  # GET /posts/1;edit
  def edit
    # 1번 글 수정 화면을 위한 코드 - b
  end

  # POST /posts
  def create
    # a를 통해 새로 사용자가 작성한 글을 DB에 넣는 코드
  end

  # PUT /posts/1
  def update
    # b를 통해 사용자가 수정한 글을 DB에 반영하는 코드
  end

  # DELETE /posts/1
  def destroy
    # 1번 글을 지우는 코드
  end
이런 식으로 됩니다. 이런 스타일로 작성하는 것을 강요하는 것은 아닙니다만, 이런 스타일로 컨트롤러를 코딩하면 소스 코드를 간결하게 정리할 수 있습니다. 웹 프로그래밍이라는 것이 DB와 사용자와의 사이에서 앞에 말씀드린 CRUD를 하기 위한 대리인이라 생각한다면 무수히 많아질 메소드와 복잡해질 구조를 간결하게 정리할 수 있습니다.
객체지향적인 Ruby를 사용하면서도 정작 웹 프로그래밍에서는 어쩔수 없이 덜 객체지향적인 구조로 Rails를 코딩해왔습니다. MVC라는 model - view - controler의 분리도 잘 활용하지 못했지요. 메소드 이름은 복잡해지고 하나의 컨트롤러에 모든 메소드가 다 모여있고, view 디렉토리 안에도 파일이 넘쳐나고... 하지만, DHH는 RESTful CRUD를 통해 좀더 객체지향적으로 웹 프로그래밍을 할 수 있게 우리를 안내했습니다. RESTful CRUD를 당장 적용해보고 싶은데 어려워서 잘 모르겠다고 생각하시는 분들은 Peepcode의 Restful Rails 스크린케스트를 구입해서 감상해보세요. 1시간이 조금넘는 내용을 통해 배우시다보면 $9가 아깝지 않습니다. 아니면 적어도 무료로 같이 배포되는 REST Cheat Sheet라도 한번 보시면 좋을 것 같습니다.

Multibyte는 유니코드를 지원하는 라이브러리입니다.
Rails를 유니코드의 천국으로 만들어줍니다. 다음과 같은 기능을 합니다.
  1. Ruby가 유니코드를 다룰 수 있도록 $KCODE = 'u' 설정
  2. DB 접속시 UTF8으로 전송하도록 설정
  3. 웹 페이지 header에 문자열이 UTF8임을 선언
  4. 유니코드 문자열을 깨트리지 않으면서 문자열을 다룰 수 있는 메소드 제공
  5. decompose를 통한 한글 자모 분리
1~3번을 위한 팁은 분명 존재했지만, 프로그래머를 귀찮게 했습니다. 저도 KoreanRails란 플러그인을 통해 귀찮은 부분을 줄이게 하려고 했습니다. 하지만 이제 Rails 1.2에서는 기본적으로 유니코드에 대한 추가적인 고민을 하지 않아도 되게 되었습니다. (만세~) 여기에 유니코드를 지원하는 각종 메소드 (이제 한글도 글자 단위로 글자수를 셀 수 있습니다!)도 우리를 즐겁게합니다. ActiveSupport::MultiByte 스크린케스트를 보시면 Multibyte의 강력함을 느끼실 수 있을 것입니다.
그리고 5번! 외국에서는 별로 신경 안쓰겠지만 우리라면 관심이 가는 기능!
"한".chars.decompose[2]
라는 코딩은 ㅎㅏㄴ 을 나눈 자모 중 3번째 (0번부터 시작하죠)인 종성의 codepoint를 반환합니다. 루비 포럼에 은/는/이/가 조사를 처리하는 방법에 대한 글을 올렸는데, 여기에서 단어가 모음으로 끝나는지 자음으로 끝나는지 단 한줄의 조건문으로 알 수 있었습니다. 이 기능을 깔끔하게 사용할 수 있는 방법(메소드 명이라던지, 변수를 넘기는 방식이라던지)을 정하게 되면 KoreanRails 플러그인에 넣을 생각입니다.

Rails 1.2 RC1 설치는
gem install rails --source http://gems.rubyonrails.org --include-dependencies
를 통해 gem으로 설치하실 수 있습니다. (공식 블로그에 소개된 내용이죠.) 하지만 저는 gem을 업데이트하기 보다는 프로젝트별로 개별화된 사용을 권해드립니다. 많은 변화때문로 인해 기존의 프로젝트의 코드를 손보셔야하기 때문이죠.
프로젝트 루트에서
rake rails:freeze:edge TAG=rel_1-2-0_RC1
를 입력하시면 1.2 RC1의 Rails 라이브러리를 vendor 디렉토리 안에 넣어줍니다. 그리고 해당 프로젝트는 vendor 디렉토리 안에 있는 Rails 라이브러리를 사용하도록 되죠. 스케폴딩을 사용해보신 적이 있으신 분은
ruby script/generate scaffold_resource post title:string created_on:date body:text published:boolean
라고 입력해보세요. (예전 스케폴드랑 비슷한데 좀 복잡해졌죠?) 그리고는 자동으로 생성되는 소스를 한번 감상해보세요. :)


Rails 1.2에는 여기서 다루지 못한, 그리고 RubyOnRails 공식 블로그에서도 조차 다 소개하지 못한 많은 기능 개선이 있었습니다. 하지만 저는 REST와 Multibyte만으로도 너무 즐겁습니다.
by 정목 | 2006/11/24 12:16 | Ruby & Rails | 트랙백 | 덧글(27)
트랙백 주소 : http://niceview.egloos.com/tb/2835787
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Commented by 마잇 at 2006/11/24 14:09
REST에 대해서 막 읽어보고 다니는 참이었는데 잘 설명해주셨네요.

같은 대상이지만 상황에 따라 다르게 반응하게 만드는 군요.

컨트롤러 코드 쓰기가 확실히 좋을 것 같습니다.

상세한 설명 감사합니다.
Commented by 테이_ble at 2006/11/24 14:31
그렇지만 1.2 나오면 깔아야겠습니다...^^:;
Commented by deepblue at 2006/11/24 16:46
이런 친절한 설명을!! ^^
Commented by 정목 at 2006/11/25 00:55
마잇님 / 네~ REST가 처음에는 많이 어색하고 어렵게 느껴집니다만, 정말 재미있는 방법입니다.

테이_ble님 / ㅎㅎ 1.2가 정식 배포되면 꼭 REST랑 Multibyte를 써보세요~

deepblue님 / ^-^v
Commented by warrior at 2006/11/26 00:58
정말 잘 정리해 놓으셨군요~ ^^ PUT/DELETE를 사용하는 건 ATOM에서 이미 포함된 내용으로 알고 있습니다. Google Data였던가 하여튼 반년쯤 전에 발표된 것에서도 이와 같은 방식으로 REST를 통해 글을 쓰고 지우고 하는 스펙을 지원했답니다.
Commented by 정목 at 2006/11/27 23:17
아 그렇군요~ 좋은 정보 알려주셔서 감사합니다.
Commented by Nathaniel at 2008/06/11 18:09
Commented by Hilary at 2008/06/11 18:09
Commented by Joan at 2008/06/11 18:09
Commented by Ned at 2008/06/11 22:30
Commented by Paula at 2008/06/11 22:30
Commented by Louis at 2008/06/12 01:03
Commented by Amy at 2008/06/12 01:03
Commented by Dick at 2008/06/12 01:30
Commented by Flossie at 2008/06/12 01:30
Commented by Veronica at 2008/06/12 01:30
Commented by Isabel at 2008/06/12 01:30
Commented by Dora at 2008/06/20 17:28
Commented by Muriel at 2008/06/20 17:28
Commented by Flossie at 2008/06/27 02:14
Commented by Dob at 2008/06/27 02:15
Commented by Leo at 2008/07/02 18:21
Commented by Monica at 2008/07/04 23:31
Commented by Silvester at 2008/07/04 23:31
Commented by Moses at 2008/07/04 23:31
Commented by Sanders at 2008/07/04 23:31
Commented by Fre at 2008/07/04 23:31

:         :

:

비공개 덧글