제공 : 한빛 네트워크
저자 : Bill Walton
역자 : 노재현
원문 : Cookin" with Ruby on Rails - May
점심시간이 다가오고 CB는 갑자기 피자 생각이 났다. “저번에 보스가 가져왔던 피자 정말 맛있었는데. 생각만 해도 피자 향기가 난단 말이야.” 앗 잠깐만. 정말 좋은 향기가 나는데. 그러자 보스가 손에 맛있는 파이를 들고 웃으면서 나타났다.
CB : 안녕하세요. 어쩐일이세요?
Boss : 어 CB. 지난번에
도와줬던 일도 있고해서 잠시 들려서 고맙다는 말을 하고 싶었어. 정말 고마웠네.
CB : 별 말씀을요. 오히려 Ruby on Rails에 대해서 알려드릴 수 있어서 제가 더 좋은 시간이 되었습니다. 정말 오랜만에 뵙는데, 그 때 일은 어떻게 잘 해결하셨는지 궁금하네요?
Boss : 시연은 정말 잘 끝낼 수 있었어. 한 동안 볼 수 없었던건 미팅을 끝내고 나오면서 앞으로 해야할 일들이 정말 많다는 걸 알게 되었기 때문이고, 내가 일처리를 위해서 만나야 할 사람이 많았기 때문이었어. 지금 당장 자세한 얘기까진 할 수 없지만 곧 자세한 사항을 다 말해줄께.
간단히 말하자면 자네가 저번에 만들어줬던 간단한 애플리케이션을 회사에서 지원받고 있는 웹사이트에 올렸었어. 왜냐면 VP에서 우리 부서에서 개발하고자 하는 것에 대한 확신을 필요로 했었거든. 알다시피 우리 회사에서 우리 부서가 하는 일은 회사의 식기에 관련된 회계, 자산관리, 소프트웨어 개발에 대한 거였잖아. 우리가 했던 웹 관련 개발이 아니였고. 그래서 우리가 무엇을 할 수 있는지 회사에서는 알기를 원했었던 거지. 자네가 도와준 덕분에 회사에서 하고 있는 일을 계속 진행해도 좋다고 허락을 받게 되었어.
회사에서는 고객들을 위한 요리법 사이트를 만들고 싶어해. 예를 들면 고객들이 요리법을 사이트에 올리고, 원하는 요리법을 찾기 위해서 검색하고, 자기만의 요리책에 원하는 요리방법을 저장할 수 있는 그런 사이트 말이지. 아무래도 우리가 열심히 만들면 정말 멋있는 사이트가 될 수 있을 것 같아. 한번에 하나씩 확실하게 한다면 말이지. 그리고 회사와의 얘기에서 사이트에 있는 "피드백" 링크를 통해서 요청이 들어오는 사항에 대해서만 개발을 해야 한다는 조건도 전달 받았어. 물론 회사의 VP에게서 오는 요청도 포함해야 겠지만.
CB : 와! 잘됐네요. 그럼 그 피자를 제가 들어드리는 것 말고(그는 피자 상자로 다가서며 웃으면서 말했다) 뭘 도와드리면 될까요? 제 말은 제가 Rails를 이용해서 뭔가를 한다는 것을 아주 좋아하긴 하는데 현재 하고 있는 일도 많이 있고, 단순히 코딩하는 것 이외에도 개발이라는 것에는 여러가지가 있거든요. 뭔가 생각하시는 거라도?
Boss : 맞아 CB. 사실 폴이 곧 도착할거야. 음 그리고 자네가 맞고 있는 일의 일부를 다른 팀원에게 넘길 생각이야. 그리고 자네가 하루의 반정도의 시간을 내줄 수 있을거라고 생각하고 있지. 아 폴이 왔네. 이제 나는 두 사람에게 맡기고 그만 가봐야 겠네. 점심시간 동안에 자네 둘이서 뭔가 괜찮은 계획을 세워주면 좋겠군. 어떤가?
CB : 걱정하지 않으셔도 됩니다. 피자까지 주셨는데요. 뭔가 좋은 계획 뿐만 아니라 당장 애플리케이션 개발에 착수할 수 있을 것 같네요. 폴 의자 가져와서 앉고 냅킨 준비하게.
Paul : 네. 아직 Rails 개발환경 설정은 되어 있죠?
CB : 당연하지. 먼저 피자 한 조각 먹고. 자 시작해 볼까.
Paul : 하하. 먼저 시작하기 전에 아까 전에 말씀하셨던 "애플리케이션 개발에 당장 착수할 수 있겠다"고 하신건 무슨 뜻이예요? 제가 생각하기엔 코딩을 하기엔 아직 필요한 정보가 충분치 않은 것 같은데요.
CB : 잘 봤어, 폴. 아마도 우리의 상사 혹은 누군가가 있어야 우리의 개발을 시작할 수 있겠지. 그 사람이 전체적인 사이트를 어떻게 사용하게 될 것인지를 말해줄 수 있을 거고 우린 그 말에 따라서 코딩을 시작하겠지. 그리고 버그를 수정해 가면서 계속해서 개발을 할 수 있을거고. 그런데 오늘은 우릴 도와줄 사람이 없으니 코딩을 할 수 는 없어. 하지만 우리가 애플리케이션을 개발하기 전에 먼저 준비해 놓을게 있는데, 바로 단위 테스트(Unit Tests)와 마이그레이션(Migrations)이야. 이 정도 준비는 보스의 허락이 필요없는 일이라 금방할 수 있지.
Paul : 알겠어요. 단위 테스트는 알겠는데, 마이그레이션(Migrations)은 뭐예요?
CB : 마이그레이션이라고 하는건 Rails에 있는 기능인데 데이터베이스 컴포넌트를 관리하기 위해서 만들어진 거야. SQL 대신에 Ruby 스크립트를 이용해서 스키마를 관리할 수 있게 해서 데이터베이스 의존성을 약화시켰다고 보면 돼. 하나의 마이그레이션 스크립트로 여러가지 데이터베이스용 스크립트를 만들어 낼 수 있어. 예를 들면 MySQL, PostgreSQL, SQLite, SQL Server, Sybase, Oracle과 같은걸 말이지(DB2를 제외한 모든 데이터베이스). 또 라이브 데이터베이스에 있는 데이터를 보존하기 위한 기능도 있어.
여기에 David Heinemer-Hanson이라는 Rails 개발자가 만들어 놓은 좋은 비디오가 있으니 꼭 한 번 보라고. 그리고
Rails 문서를 보는것도 정말 좋아.
Paul : 네. 그럼 뭐부터 할까요? 마이그레이션, 단위테스트 아니면 계획부터 잡을까요?
CB : 먼저 계획부터 세워 보자구. 젤 먼저 했으면 하는 건 역활 정의야. 자 여기 우리 3명이 있지. 폴, 나, 그리고 보스. 그리고 3가지 역활이 있어 : 개발자, 고객, 테스터. 자 그럼 이렇게 해보면 어떨까? 보스는 고객의 역활을 맡고 폴은 테스터 그리고 내가 개발자 역활을 하는거지. 테스터의 역활은 정확히 개발자와 고객의 역활의 중간이라고 보면 될거야. 어때?
Paul : 네 좋아요. 저를 테스터라고 해서 뒤로 밀어놓지만 않는다면요. 제 말은, 제가 여기서 아키텍처 구성과 프로젝트 관리 역할을 조금 했었거든요.
CB : 그런게 아니야. 그냥 일을 진행하기 위해서 정한거라고 생각하면 돼. 일을 하면서 역활 변경을 자주 하게 될거야. 폴이 테스터를 하게 되면 Rails 개발에 더 빨리 적응할 수 있을 거고, 테스터의 역활이 고객과 개발자 사이의 중간에 위치해 있기 때문에 평소에 프로젝트 관리를 하던 폴이 하면 보스와 의사소통이 더 쉬울 거라고 생각해서 그렇게 정한거야. 괜찮지?
Paul : 네. 해보죠. 더 생각해 볼게 뭐가 있을까요?
CB : 글쎄. 아직 예산이나 프로젝트 일정이 정해지지 않아서 계획 세우는 일을 더 진행하기는 힘들것 같은데, 그치?
Paul : 네, 그럼 마이그레이션을 할까요? 단위 테스트를 준비할까요?
CB : 어느 쪽을 해도 괜찮은데, 먼저 마이그레이션을 하는게 단위 테스트를 할 때 도움이 될거야.
Paul : 도움이 되는 쪽을 먼저 하죠.
CB : 그럼 시작해보자구. 먼저 애플리케이션이 정상적으로 작동하는지부터 확인해보지. Instant Rails를 먼저 띄우고, mongrel을 실행해서 뭘 할 수 있는지 보면 될거야. 자 직접 해봐 폴. 직접 해보는게 보기만 하는것보다 훨씬 빨리 배울 수 있어.
Paul : 음… 제가 기억하기론 먼저 커맨드 창을 연 다음에, rails 디렉토리로 변경하고, 다음을 쳤었던 것 같아요.
mongrel_rails start
[그림 1]
CB : 기억력 참 좋은데!
Paul : 아니예요. 저번에 사용했던 URL은 기억이 안 나는데요.
CB : 괜찮아. 모든 Rails의 URL은 컨트롤러에 있는 함수 이름과 맵핑이 된다는 것만 기억하면 돼. URL을 알고 싶을땐 app/controllers 디렉토리로 이동한 후에 뭐가 있는지만 확인해 보면 되지. 다른 커맨드 창을 하나 더 열고.
[그림 2]
Paul : 아, 이제 알겠다.
http://localhost:3000/recipe
[그림 3]
CB : 아직 정상작동 하는지 한번 확인해 보는게 어떨까? 안될리는 없겠지만 그래도 확인하고 가는게 좋을 것 같아. 그 동안 나는 피자 하나 더 먹고올께.
Paul : 좋은 생각인데요. 저는 일하고 CB씨는 먹고. 세상은 공평치 않아요.
CB : 그렇게 생각하지 말고 Rails를 익히기 위한 하나의 기회로 생각하라고.^^
Paul : (CB가 피자 한 조각을 다 먹고난 후에) 잘 되는것 같네요. 이제 뭘 할까요?
CB : 지난번에 우리가 만들었던 SQL 기억나? 그거 한 번 찾아봐. 애플리케이션 루트 디렉토리 밑에 db 라는 디렉토리 안에 create.sql 이라는 파일이 있을거야.
[그림 4]
CB : 이참에 데이터베이스도 같이 보면서 마이그레이션이 어떻게 되는 것인지 한 번 보는게 좋겠어. 아직 MySQL-Front가 설치되어 있으니 이걸로 보는게 좋겠군.
[그림 5]
CB : 그리고 이번엔 파일 시스템도 같이 보자구. Rails가 자동적으로 생성하는 파일들이 있는데 꼭 알아두어야 해. 우선 탐색기를 실행하고 db 디렉토리를 보면
[그림 6]
CB : 이제부터 무엇을 할 것인지에 대해서 설명을 먼저 하지. 음 전에도 말했듯이 마이그레이션은 Rails가 데이터베이스를 손쉽게 관리할 수 있게 하는 시스템이라고 보면 돼. 우린 이미 사용할 데이터베이스를 만들어 두었으니 첫 번째로 할 일은 마이그레이션을 할 수 있도록 사전준비를 해두는 거야. 사전준비를 위해서 4가지 일을 해야 하는데, 첫 번째가 데이터베이스 스키마의 현재 스냅샷을 저장해 두는 거야. 그럼 한 번 해 보자구. 먼저 커맨드 창을 띄운 후에 애플리케이션 디렉토리로 이동하고 다음을 입력하면 돼
rake db:schema:dump
[그림 7]
Paul : 아무일도 일어난 것 같지 않은데요?
CB : 보기엔 그렇지만 탐색기로 보면 뭔가가 생성되었다는 것을 알 수 있지.
[그림 8]
CB : schema.rb 라는 파일이 생겼어. 이건 조금 이따 볼 거고 두 번째 단계로 넘어가자구. 이제 마이그레이션 파일을 생성해야 되는데 다음과 같이 커맨드 창으로 돌아가서 다음을 입력하면 돼
ruby scriptgenerate migration BaselineSchema
[그림 9]
Paul : 이번엔 뭔가가 일어났다는걸 확실히 알 수 있네요.
CB : 맞아. 디렉토리를 하나 만들고 그 안에 마이그레이션 파일이 생성되었지. 더 보기 전에 위에서 말했던 스키마를 보도록 하자고.
[그림 10]
Paul : 처음에 우리가 만들었던 SQL하고 많이 비슷한데요?
CB : 맞아. 비슷해서 더 좋지. 제일 위를 봐봐. Rails는 데이터베이스의 초기 상태와 데이터베이스를 어떻게 생성해야 하는지를 저장해 두고 있어. 처음부터 데이터베이스를 만들어 두지 않고 시작했으면 이 스키마 파일을 고쳐야 할 일은 없었겠지만, 이미 만들어 놓은 데이터베이스를 가지고 개발을 계속하려면 한가지 수정을 해야 할 것이 있어. Rails한테 우리가 사용하고 있는 데이터베이스가 어떤 마이그레이션 파일을 이용하는지를 알려줘야 하거든. 그래서 스키마 정의가 있는 줄에 버전 번호를 추가해 줘야 해.
[그림 11]
CB : 위와 같이 수정했으니 Rails는 "001_" 이라는 마이그레이션 파일이 현재 스키마로 마이그레이션 하기 위해 필요한 명령들을 가지고 있다는 것을 알 수 있게 돼. 그럼 마지막 일을 해볼까? 마지막 할 일은 이제껏 한 모든걸 동기화 시켜주는 거야. 커맨드 창으로 돌아가서 다음 명령을 입력하면 돼.
rake db:migrate
[그림 12]
Paul : 근데 그다지 많은 일을 한 것 같지는 않네요? 좀 전에 스키마에게 동기화를 위해서 어떤 마이그레이션 파일을 사용할 지를 알려주는 것이라고 했잖아요? 좀 더 자세히 설명해주세요. 제대로 동기화가 됐는지 어떻게 알 수 있죠?
CB : 좋은 질문이야. 데이터베이스를 보면서 설명해 줄께.
역자 노재현님은 어렸을 때부터 컴퓨터를 접하게 된 덕에 프로그래밍을 오랫동안 정겹게 하고 있는 프로그래머 입니다. 특히나 게임 및 OS 개발에 관심이 많으며, 심심할 때면 뭔가 새로운 프로그램을 만들어내는 것을 좋아합니다. 다음에서 웹 관련 개발을 한 후에 현재는
www.osguru.net이라는 OS관련 웹사이트를 운영하며 넥슨에서 게임 개발을 하고 있습니다.
* e-mail:
wonbear@gmail.com
* homepage:
http://www.oguru.net