Flying Mate


Prototype.js(이하 프로토타입)의 라인수는 1.5.0 버전에서 2500줄이었다가 1.6.0 버전에서 4200줄이 되었다. 엄청난 코드량이다. 프로토타입의 코드들은 메서드명이나 프로퍼티명을 축약하지 않고 의미를 살려 작성되었다. 덕분에 코드량이 많아보이지만 코드만 보고도 로직을 이해하는 것이 가능하다.

특별한 경우(IE의 메모리 누수나 오페라, 사파리 등의 버그 핸들링)가 아니면 주석이 없다. 경쟁 프레임워크인 jQuery(uncompressed 버전)는 변수명을 좀 축약한 대신 주석이 많은 편이다. 게다가 jQuery는 친절하게도 Packed(압축)버전을 제공하고 있고 이 버전을 장려하는 듯, 다운로드 리스트의 가장 상단(또는 좌측)에 두고 있다.

YSlow에서는 Packed나 Minify(코드 압축)를 좋은 웹페이지의 덕목으로 평가한다. 자바스크립트 파일을 압축하면 용량이 1/5 정도로 줄어드는데, 개인적으로는 코드 압축이 전송 비용의 측면에서 어느 정도 효율적일지 조금 의구심이 있다. 가령 프로토타입(1.5.0버전 2500라인)은 압축하지 않아도 70KB밖에 되지 않는데, 이 정도면 사이트 로고 이미지 정도의 크기이다. 코드 압축은 비용 효율 측면 보다는 코드 보안 측면에서 더 의미있어 보인다. 물론 Beautify가 불가능한 압축 방식을 적용했다는 가정 하에.

어쨌든 알려진 바와 같이, 프로토타입과 스크립타큘러스(Script.aculo.us)는 레일스 코어팀의 일부가 개발을 담당했다. 덕분에 RJS를 통해 레일스와 잘 통합이 되고 있고, 레일스나 루비의 철학들이 프로토타입 안에 녹아있다는 느낌을 받기도 한다. 예를 들면, 루비에서 Enumerable 모듈을 통해 객체를 배열처럼 다룰 수 있는 다양한 메서드를 제공하듯, 프로토타입에서도 Enumerable 객체를 생성해 유용한 메서드들을 정의하고 이를 Array, Hash 등에 Object.extend(객체 확장)시킨다.

Ajax의 대표적인 프레임워크로 인식되는 것과는 달리, 사실 프로토타입은 Ajax와 관련된 코드가 많지 않다. Ajax객체와 그 하위 객체들을 정의하는 코드는 750라인부터 1060라인까지 총 300라인 정도이다. (1.6.0에서는 360라인 정도) 나머지 라인은 대게 유틸리티 함수 정의 조금, 그리고 대부분은 객체들의 메서드 정의이다.

기존 자바스크립트 객체인 Object, Array, Number, String 등을 확장해 다양한 메서드를 포함시키고, 주기적인 실행을 처리해주는 PeriodicalExecuter, html문서 내의 엘리먼트를 쉽게 찾아주는 Selector, 특정 패턴을 문자열로 대치시켜주는 Template, 범위의 시작지점과 끝지점을 인자로 받아 Enumerable을 만들어주는 ObjectRange, 폼과 엘리먼트를 관찰해 이벤트 발생시 콜백을 호출해주는 TimedObserver와 EventObserver 등을 정의하고 있다.

Object.extend 메서드는 프로토타입에서 정의한 객체 확장 방식인데 OOP의 상속과 유사한 기능을 하지만 자유도가 더 높고, 구현은 아주 심플하다. 인자로 받은 두 개의 객체 중 두 번째 객체의 프로퍼티 값들을 첫 번째 객체의 프로퍼티에 복사해서 리턴하는 것으로 끝이다.

Object.extend = function(destination, source) {
    for (var property in source) {
       destination[property] = source[property];
    }
    return destination;
}

자바스크립트의 객체가 키/값 형태의 단순한 Dictionary이므로, 키에 대한 값들만 복사해 넣으면 상속의 개념을 구현할 수 있고, Object.extend가 그것을 해준다. 프로토타입은 내부적으로 Object.extend를 자주 사용한다. 특히 객체에 메서드를 추가할 때 사용되는데, 메서드 목록을 포함하는 {}리터럴을 Object.extend의 두 번째 인자에 두는 방식이다.

Object.extend(Number.prototype, {
    toColorPart: function() ...

그리고 프로토타입은 객체 인스턴스를 만드는 편리항 방법을 제공하기 위해 Class라는 객체에 create메서드를 정의하고 있다. 1.5.0에서의 Class.create()는 this.initialize.apply(this, arguments)를 실행하는 익명 함수를 반환하는 것이 전부(총 6라인)였는데, 1.6.0에서는 superclass와 subclass에 대한 처리가 추가되어 30라인으로 늘어났다.

Class.create()의 가장 중요한 역할은 new 키워드를 통해 객체 인스턴스를 만들 때 생성자 역할을 하는 initialize메서드가 호출되도록 초기화하는 것이다. new 키워드가 사용되는 경우는 특정 객체의 인스턴스를 생성할 경우이므로, 인스턴스 생성을 목적으로 하는 객체의 정의에만 Class.create()를 사용하고 있다.

가령 Enumerable은 객체이긴 하지만 인스턴스를 생성하기 위한 객체가 아니며, 상/하위클래스 개념 보다는 루비의 모듈(Module)처럼 믹스해서 사용하는 개념이 강하기 때문에 Class.create를 사용하지 않는다. 반대로 Template이나 Selector는 사용자가 직접 인스턴스를 생성해 활용할 수 있는 객체이므로 Class.create를 통해 객체를 정의한다. 물론 사용자 자신의 객체를 Class.create로 생성하면 자바나 C#의 클래스 정의를 어설프게나마 모사할 수 있다.

객체, 클래스, 인스턴스, 모듈 등 다양한 용어가 나왔는데, 자바스크립트에서는 객체나 인스턴스 개념은 있었지만 클래스나 모듈 등의 개념이 명확하지 않았는데, 프로토타입에 의해 이런 개념들이 좀더 명시적으로 드러났다고 볼 수 있다. 프로토타입의 다양한 객체 정의 방식이 이런 객체의 개념을 다양하게 확장했다. (클래스, 인스턴스, 모듈 모두 객체의 종류)

인스턴스 생성시 초기화되도록
(initialized) Class.create()를 설계했기에 new 키워드로 호출하면 좀 더 그럴싸한 인스턴스(로 모사된 객체)가 생겨났고, Enumerable는 클래스나 인스턴스도 아닌 모듈의 역할을 하며 다중 상속의 개념을 구현하고 있고, Ajax.Base는 Ajax.Updater나 Ajax.Request가 상속하는 기반 클래스의 역할을 한다. 고급언어에나 있던 다양한 객체 형태를 자바스크립트에서도 엇비슷하게 사용할 수 있게 되었다.

프로토타입을 사용하는 이유는 여러가지가 있겠지만, 가장 의미있는 이유는 아마도 이런 설계방식을 개발자 코드에도 자연스럽게 유도해주기 때문이 아닐까. 유틸리티 함수(특히 document.getElementById()를 대신해주는 $())도 쓸모가 많고 기존의 폼과 엘리먼트를 확장해주는 Form과 Element 객체의 메서드들도 편리하지만 그런 것들은 복사해서 붙여넣으면 되는 것이지 프로토타입 프레임워크를 통째로 사용하게 하는 핵심은 아니다. (물론 유틸리티 함수만을 사용하기 위해 프레임워크를 통째로 쓰는 사람도 있을 것이다)

그렇다면 프로토타입을 사용하는 것과, 자바스크립트 UI를 객체지향으로 구현하는 것은 어떤 관계가 있을까? 코드의 형태는 비슷해지겠지만 사실 긴밀한 연결고리는 없어보인다. 프로토타입의 객체들은 동작 구현을 위한 것이 아니라 객체 정의 자체를 위한 것인 반면, 자바스크립트 UI를 객체지향적으로 구현한다는 것은 사용자가 발생시키는 이벤트에 대한 객체간의 연쇄작용(이벤트 핸들링)을 설계한다는 측면이 강해서 둘 사이의 사고방식이 많이 다르다고 본다.

프로토타입이 저수준의 객체를 잘 정의해주기 때문에 개발자는 굳이 객체를 새로 정의하지 않고 function들의 목록만 가지고 애플리케이션을 만들 수 있다. 사용자의 행위(클릭, 입력)에 대해 function들을 실행시켜주는 것이 지금까지 자바스크립트 UI개발의 일반적인 방식이었다.

function기반으로 설계한 코드를 객체지향으로 전환하기 위해서는 사고방식도 바꿔야 한다. 사용자의 행위가 function을 유발하는 것이 아니라, 사용자가 특정 UI 객체에 이벤트를 발생시켜 그 객체와 연관된 객체의 이벤트 핸들러가 반응하는 개념이 되는 것이다. 음, 사실 이는 객체지향의 이슈라기 보다는 옵저버 패턴이나 이벤트 기반 프로그래밍의 영역인 것 같기도 하다. 상속 등의 주제 보다는 이벤트 핸들러를 정의하는 것이 코드의 대부분이니. 이 내용은 주제에서 벗어나므로 따로 글을 정리해야겠다.

프로토타입은 계속 진화하고 있다. 진화의 방식은 객체의 생성과 병합 과정이 아닐까 싶다. 1.5.0에서는 DOM에 엘리먼트를 추가할 때 사용할 수 있도록 Insertion 객체를 제공했다가 1.6.0에서는 Element 객체의 insert 메서드로 병합되었다. Insertion 객체는 정말 억지로 만들었다는 느낌이 들었었는데 아니나다를까 다른 객체의 메서드로 강등되었다. 중요한 역할을 하긴 하지만 객체로 독립하기엔 심심한 감이 있었다.

또 엘리먼트의 좌표값과 관련된 메서드를 제공하는 Position 객체도, 상당수의 메서드를 Element객체에게 양보하게 되었다. 하위호환성을 감안해 호출은 될 수 있도록 Position 객체 내에서 해당 메서드의 선언부분은 남아있지만 정의부분은 모두 Element 메서드를 호출하는 코드로 바뀌었다.

추가하고자 하는 기능 중 기존 객체의 메서드로 추가하기 애매한 것이 있으면 일단 새로운 객체로 분리해 발전시키고, 일정 기간 두고 본 후에 해당 객체가 더 이상 발전할 가능성이 안 보이고 다른 객체의 메서드로 대체가 가능하다고 판단되면 병합하는 과정을 거친다. 특정 버전의 프로토타입을 관찰하는 것도 의미가 있고, 버전 간의 차이를 관찰하는 것도 의미가 있다.

프로토타입 1.5.0 버전은 몇 번 훑어봤지만 1.6.0은 그 상당한 코드량 때문에, 약간의 변경 사항만 파악하고 있고, 구체적인 부분은 좀 더 시간을 두고 살펴봐야겠다. 저번 글에서도 이야기했지만, 개인적으로는 프레임워크를 사용하는 것 보다는 프레임워크를 뜯어보는 것을 더 중요하게 생각한다. 뜯어봐서 이해할 수 있게 되기 전 까지는 물론 사용하는 것으로 만족해야겠지만.

TRACKBACK :: http://flyingmate.net/trackback/32 관련글 쓰기

댓글을 달아 주세요


프로토타입이란 말은 특히 웹 프로젝트에서 다양한 용도로 많이 사용된다. 프로덕트 기획단계에서 사용하는 페이퍼 프로토타입도 있고, 사업성과 구현 가능성을 검토해보기 위해 알파/베타 버전 이전에 만들어보는 시제품을 프로토타입이라 한다. 이 글에서 말하려는 프로토타입은 prototype.js 자바스크립트 프레임워크이다. 본래는 자바스크립트에서 객체를 확장하는 prototype 프러퍼티와 구분하기 위해 prototype.js라고 영문 및 확장자를 모두 표기해주곤 하지만, 이 글과 이 다음 글에서는 prototype.js만을 언급하므로 편의상 prototype.js를 프로토타입이라고 바꿔서 칭하겠다.

프로토타입은 자바스크립트 프레임워크 중 가장 많이 쓰이고 있다. 특히 레일스에서는 프로젝트 생성과 동시에 프로토타입(1.5.0 버전)과 스크립타큘러스(중 일부) 파일을 프로젝트 안(#{RAILS_APP}/public/javascripts/...)에 함께 만들어내기 때문에, 사용하지 않으려면 그냥 냅두거나, 삭제하거나, 극단적인 사람이라면 생성 시에 Opt-out 시켜줄 수도 있다(아마도 Rake에서).

레일스는 RJS 덕분에 프로토타입을 프로젝트에 내장시킬 명분을 찾았다. 자바스크립트를 직접 건드리지 않아도 루비코드만으로 몇 가지 DOM 스크립팅과 AJAX 개발이 가능하다는 점은 자바스크립트에 익숙지 않은 서버 개발자들에게 매력적일 수 있다. 하지만 이런 정황 때문에 프로토타입이 RJS를 위한 모듈 정도로 전락한 것 같아 아쉽다. 프로토타입을 잘 알지 못할 때의 나 역시 그 정도로 생각했기 때문에.

ASP.NET AJAX 역시 이런 접근 방법으로 마케팅을 했다. ASP.NET AJAX 에서 제공하는 테그를 코드에 삽입하면 AJAX 인터페이스가 된다. 자바스크립트를 몰라도 된다. ASP.NET의 특성상 프리젠테이션과 비즈니스 로직, 데이터셋이 애매하게 결합되어 있고 컴파일 시에 분리되기 때문에 밑에서 일어나는 일은 더더욱 감추어진다. 감추어지기 때문에 매력적일 수 있지만, 감추어지기 때문에 아무 것도 알 수가 없다. ASP.NET AJAX에 익숙해질 수록 ASP.NET에 묶이게 된다. AJAX 튜토리얼이 아니라, ASP.NET AJAX 튜토리얼이 제공된다.

레일스 역시 자바스크립트 튜토리얼 대신 RJS 핼퍼 메서드 레퍼런스를 제공한다. 레일스 커뮤니티이니 자바스크립트 튜토리얼을 제공해줄 의무 보다는 자체 핼퍼 메서드 튜토리얼을 제공할 의무가 있었을 것이고, 이는 레일스 입문자가 자바스크립트 보다는 RJS에 익숙해지도록 유도할 가능성이 있다. 레일스 커뮤니티 내에서는 RJS에 대해 찬반 논란이 있겠지만, 논란을 접하지 않은 입문자가 느끼기에는 RJS가 AJAX의 가장 좋은 대안이라고 착각할 수 있다. 실상은 RJS만 가지고 할 수 있는 것은 정말 별로 없다.

프로토타입 프레임워크를 자바스크립트와 함께 직접 사용하고 코드 내부를 들여다보는 과정은 학습에 도움이 된다. 자바스크립트를 더 잘 이해하게 되고 객체지향적 사고를 하는데 도움을 준다. 반면 RJS 헬퍼 메서드를 외워서 익숙해진다 해도 자바스크립트에는 익숙해지지 못한다. 형태는 루비코드이지만 루비나 레일스의 구동과 상관이 없고 자바스크립트를 만들어내지만 자바스크립트의 형태와 철학과도 거리가 멀다. 변환기 또는 메타 프로그래밍의 역할만을 하는 변종 언어인 셈이다.

자바스크립트가 0과 1로 된 기계어도 아니고 어셈블리도 아닌데, 자바스크립트를 배우기 싫다고 루비와도 별 관계 없는 또 다른 변종 언어를 별도로 익히는 것은 현명하지 못하다. 자바로 자바스크립트를 만들어내는 구글의 웹툴킷이나 ASP.NET AJAX도 마찬가지이다. 이들의 흥미로운 접근에 대해 관심을 가질 필요는 있고 이들이 어떤 방식으로 어떤 자바스크립트 코드를 만들어내는지 파악해보는 것은 좋지만 그 이상의 애착은 좋지 않다.

이런 관점의 연장선상에서, 나는 레일스 RHTML에서 HTML 테그를 만들어내는 헬퍼 메서드도 별로 좋아하지 않는다. 레일스에서 제공하는 튜토리얼과 레일스 관련 서적에서는 링크나 폼 등의 테그에 대해 헬퍼 메서드를 기준으로 설명한다. 특히 remote가 포함된 헬퍼 메서드는 RJS와 쌍으로 언급된다. 교과서적인 구현 목표에 대해서는 순조롭지만, 만들고자 하는 것이 예제와 조금만 달라져도 막막해진다.

이런 상황에서는 고민한다고 해서 진행되지 않으며 헬퍼 메서드에 대한 레퍼런스를 찾아야만 하고 그것을 암기해야 한다. 자바스크립트 로직이나 DOM을 기준으로 생각하면 아무 것도 아닌데, RJS나 RHTML의 헬퍼 메서드를 기준으로 생각하다보면 그것의 정확한 옵션들과 세부 설정사항들을 알지 않으면 구현할 수 없다. remote_form_for나 link_to_remote는 여러번 써봐도 그 옵션들이 익숙해지지 않는다. 그냥 HTML 테그를 사용하고, 발생되는 이벤트를 이벤트 핸들러나 이벤트 리스너, 그리고 DOM 스크립트로 처리하는 게 좋다. 그래야 뭐가 어떻게 돌아갈지 알겠다.

뭔가를 학습하는 방식을 크게 '사고'와 '암기'로 나눈다면, 기존 헬퍼 메서드의 사용은 암기적인 학습을 요구한다. 차라리 자바스크립트 코어의 가장 원초적인 함수만 가지고 이리 저리 필요한 기능을 구현하는 것은 사고력에 도움이 된다. 만약 동일한 기능을 구현할 수 있는 좀더 저수준의 방법이 있고, 그것이 고수준의 것보다 특별히 어렵거나 복잡하지 않다면, 저수준을 직접 다루는 것이 낫다.

반복적인 요소에 대해 자신이 직접 헬퍼 메서드를 구현해 사용하는 것은, 이미 자바스크립트나 HTTP, 그리고 레일스에 대해 잘 파악하고 있는 것이므로 개인적인 사용 시에는 괜찮아 보인다. 하지만 협업 시에는 별도의 문서화나 커뮤니케이션이 필요하고 헬퍼 메서드 구현자가 아닌 다른 사람의 경우, 결국 헬퍼 메서드의 동작과 옵션을 익혀야 하므로 암기적 학습이 요구된다.

내부 구현을 잘 알고 사용하는 것이라면 헬퍼 메서드이건 라이브러리이건 프레임워크건 좋은 도구이자 좋은 학습 대상이 된다. 이런 관점을 RHTML, RJS보다 넓게 확장하면, 레일스 프레임워크와 프로토타입 프레임워크에도 적용해볼 수 있다.

RJS, RHTML, ASP.NET AJAX 등의 보조 기술, 그리고 프로토타입이나 레일스 등의  프레임워크는 모두, 초기 학습장벽을 낮춰준다는 이점이 있다. 지나치게 추종하면 불필요한 신앙심과 함께 그 기술에 묶일 가능성이 있지만 객관성을 유지하면서 접근한다면, 해당 기술이 가진 많은 것들을 구현해볼 수 있고 그 기술의 구현 방식을 잘 설계된 예제를 통해 학습할 수 있다.

다른 서버 프로그래밍 언어를 배우더라도, 그 언어의 대표적인 프레임워크에서 부터 접근해야겠다는 생각을 하게 되었다. 해당 언어가 가장 교과서적으로 설계된 프레임워크를 익히면 그 언어의 철학과 관습을 빨리 접할 수 있다. 처음에는 그것을 사용하게 될 것이고, 점차 그것에 익숙해져 내부 구현사항을 알아갈 것이고, 곧 그것을 직접 수정하거나 일부를 구현해 의존도를 낮추게 되어, 최종적으로는 직접 최적화된 프레임워크를 만들 수 있게 될 것이다. 즉 초반에는 적극적으로 프레임워크를 도입하되, 결국 프레임워크에 의지하지 않는 것이 최종 목표가 되는 것이다.

어떤 기술을 객관적으로 판단하려면 그 기술을 세밀하게 학습해야 한다. 학습하기 전에는 그것의 장단점을 제대로 판단할 수 없다. 이는 딜레마를 야기하는데, 기술을 객관적으로 평가하려면 감정적인 애착이 방해가 되지만 기술을 효율적으로 학습하려면 감정적인 애착이 도움이 된다. 나 같은 경우는 효율적으로 학습하기 위해 그 기술의 좋은 점들을 잔뜩 생각해서 스스로도 되뇌이고 주변에도 말하고 다닌다. 어느 정도 학습하고 나면 그 기술의 구린 면들을 알게 되니 기술의 단점들을 생각하고 말하기 시작한다. 나 스스로에게는 변덕쟁이가 되고 주위 사람들에게는 구라쟁이가 되어버리니 이것이 딜레마다.

레일스 마이그레이션, 프로토타입에 대해서도 이런 과정을 거치고 있고, 아마도 곧 전체 레일스 프레임워크에 대해서도 그렇게 생각하게 될 지 모른다. 마이그레이션도 RJS에서 느낀 바와 비슷하다. 쿼리문을 몰라도 루비로 된 데이터베이스 설계 코드를 작성할 수 있다니, 게다가 데이터베이스 설계별 버전까지 관리할 수 있다니 이 얼마나 멋져보이는 일인가. 나는 정말 착실하게 마이그레이션을 사용해왔다.(RJS처럼)

쿼리문을 직접 다루는 것에 비해 마이그레이션 코드로 할 수 있는 것이 별로 없고, 마이그레이션의 버전관리는 소스코드 버전관리처럼 명쾌하지도 치밀하지도 않아 마이그레이션 에러 한 방에 데이터베이스 전체가 엉킬 수 있다. 우선 고수준 보다는 저수준이 낫다는 관점과 연결되어 RJS보다 자바스크립트가 나은 것처럼 마이그레이션보다 쿼리문을 익히는 것이 더 낫다.


또 소스코드 버전관리는 안전성을 위해서 사용하지만 마이그레이션의 버전관리는 사람이 인지하고 생각하기 편하려고 사용하며 안전성을 돕기는 커녕 해칠 가능성이 크다.
새 애플리케이션을 개발하여 최초로 배치할 경우나, 프로토타입을 만드는 경우, 이런 저런 라이브러리의 예제를 신속하게 구현해 보거나 할 때 드물게 마이그레이션을 써볼 기회가 있을 것이다.

서버 프로그래밍 자체를 레일스를 통해 처음 접하는 사람은 RJS나 마이그레이션이 있기 때문에 그나마 단기간에 웹 페이지를 만들어낼 수 있었다. 이런 것들이 없었다면 웹 개발이란 게 대체 뭔지 상상하는 것 조차 힘겨웠을지 모른다. 레일스 덕분에 웹 개발의 대중화가 일어날 수 있었다. 이런 고수준의 처리 덕분에 웹 개발을 쉽게 시작하게 되었다면 이제 주머니 밖으로 나와 저수준을 공략해야 한다. RJS 대신 자바스크립트를, 마이그레이션 대신 데이터베이스 쿼리를, RHTML 헬퍼 메서드 대신 테그와 프러퍼티를 공략해야 한다.

개발자들이 보기에 너무 당연하고 유치한 글을 적은 것 같아 마음이 아프지만 나와 같은 과정을 겪고 있는 사람들에겐 공감이 될까 싶어 적어보았다. 다음 글엔 프로토타입 프레임워크의 장단점과 활용 방법 등에 대한 주관적인 글을 적어보려 한다.

TRACKBACK :: http://flyingmate.net/trackback/31 관련글 쓰기

댓글을 달아 주세요

  1. deepblue  댓글주소  수정/삭제  댓글쓰기

    RJS나 RHTML에 대해서 비스켓님 의견에 동의합니다. 그래도 어느 정도 AJAX의 진입장벽을 낮게 했다는 점에서 그 가치는 인정해야겠지요(저도 처음에는 와우~를 연신 외치며 열광했던 1인이라 ^^).

    그런데, 마이그레이션은 아직 어떤 단점이 있는지 모르겠습니다. 개발 중에는 모르겠으나 실제 서비스가 Production 환경에 올라가면, 스키마를 점진적으로 변화해가는 마이그레이션이 큰 도움이 되더군요. 그 전에는 서비스의 DB 스키마를 변경하는 일이 몇차례 회의를 거치고도 꽤 긴장해야하는 일이었는데, 마이그레이션을 통해 관리가 되는 느낌이 들고 또 개발환경, 스테이지에서 그 스크립트가 검증이 되서 부담이 좀 줄어들었습니다.

    아, SQL 대신 루비로 정의한 스키마가 안 좋은거라고 말씀하시는 거라면 저도 마이그레이션에서는 SQL을 직접 쓰는 일이 많습니다. 특히나 바뀐 스키마에 맞게 데이터도 변형해줘야하는 경우는 답이 없죠. 마이그레이션에서 모델 코드를 쓰는 것 또한 그리 추천할만한 방법은 아니더군요.

    재미있는 주제, 공감가는 내용이라 지나가다 글을 남겨봅니다 ^^

    2007/11/26 00:48
    • FlyingMate  댓글주소  수정/삭제

      deepblue님 안녕하세요! 마이그레이션에 대해서는 제가 생각이 짧았던 것 같습니다. 제가 개발환경(사용자 데이터가 쌓인 상황이 아닌)에서 마이그레이션의 업/다운을 빈번하게 사용하여 종종 마이그레이션이 실패하는 경우가 생겼는데, 그럴 땐 수정해가면서 마이그레이션을 완료시키기 보단 데이터베이스를 드롭하고 다시 만들어주곤 했었습니다.

      그러다보니 실전 환경에서 마이그레이션을 얼마나 신중하게 다룰지 미처 상상하지 못했던 것 같습니다. 쿼리를 개발DB가 아닌 실전DB에 날릴 때 필요한 신중함을 가지고 마이그레이션 파일을 작성하면 마이그레이션이 실패할 리가 없을 것 같습니다. 말씀하신데로 마이그레이션을 통해 스키마 변경 계획을 명시하고 검토해서, 쿼리를 직접 날리는 것보다 안전하게 관리할 수 있을 것 같네요. 개발 단계와 실전 단계에서 마이그레이션을 대하는 신중함의 차이가 중요한 변수인 것 같습니다.

      저 역시 마이그레이션을 너무 즐겁게 잘 사용해오고 있어서 좀 과격하게 이런 저런 단점을 생각해봤습니다. 마이그레이션을 'SVN처럼 빈번하고 가볍게 사용할 수 있는 버전관리 도구'라고 오해하지만 않으면 좋은 도구가 될 수 있을 것 같습니다. 저도 앞으로도 애용해야겠어요. deepblue님이 지적해주셔서 다행입니다. 루비 세미나에서 뵈요^-^

      2007/11/26 09:59
  2. 이노메이커  댓글주소  수정/삭제  댓글쓰기

    아..여기 고수분 두분이 있었네요..Flying Mate님의 글을 읽으면서 정말 공감했습니다. 지금 루비와 레일스를 동시에 공부를 하면서 뭔가를 만들어보겠다고 열심히 하고 있는데.. 마이그레이션은 정말 한번 뻑나면 수정하기가 힘들더군요.(개발모드에서) 아직 배포는 해본적이 없어서..그런지 모르겠습니다..
    하여튼 저 또한 처음에 RJS 정말 와우~~ 할 정도로 이거 편하네.. 그렇게 생각하고 사용을 했지만..실질적으로 적용할 수 있는 부분이 폭이 좁더군요. 자바스크립트 처럼 맘대로 사용할 수 없었습니다. 아직 제가 초보라서 그런지..

    루비에서 엑티브레코드에서 여러게 조인을 하는 경우는 정말.. sQL를 사용하는게 훨씬 편하더군요.

    어째든 루비에 대한 매력은 충분히 느끼고 있습니다.

    세미나에 참석해서 많은 배우고 싶은 욕심은 잔뜩 있지만, 여기는 부산이라. 가기가 싶지가 않네요..그리고 부산에서 루비를 하는 사람은 거의 없네요.
    전무하다..이말 딱 맞을 듯....

    다음에 또 들리도록 하겠습니다. 꾸벅 ^^

    2007/12/04 17:00
    • FlyingMate  댓글주소  수정/삭제

      이노메이커님 안녕하세요. deepblue님은 진정 고수이시지만 저는 열심히 쫓아가는 하수입니다. 저도 잘 부탁드립니다.

      2007/12/05 10:10

1 
Flying Mate

공지사항

카테고리

분류 전체보기 (45)
소소하지 않은 일상 (45)

믹시