- 며칠전 solnic이 rails를 더이상 쓰지 않는 이유를 썼다.
- 이 글과 관련 토론을 최근 재밌게 읽었다.
- 그리고 내 느낀점만 짧게 남겨야 겠다고 생각했다.
- 일단 나는 ruby와 rails를 좋아한다.
- 그리고 solnic의 rails에 대한 비판에 공감하는 부분이 많다.
- solnic의 글은 한 마디로 Rails의 tight-coupling 을 지적하고 있다.
- 좀 더 자세히는 Rails 에 대해 아래 3가지를 비판하고 있다고 생각한다.
- 매우 복잡한 로직을 “쉬운” 인터페이스 뒤에 숨긴다.
- 앱의 도메인 로직들이 Rails core features 에 tight-coupling 된다.
- ActiveSupport 는 나쁘다.
- 지적에 공감하지만 나는 여전히 Rails가 좋다.
- 그리고 오히려 Rails의 장점으로 생각하는 부분이 있다.
- solnic 은
User.create(params[:user])
- 이 코드가 “쉬운 인터페이스 뒤에 복잡한 로직이 숨겨져 있다.” 고 지적한다.
- Rails의 ORM인 ActiveRecord는 지적한 데로
- 매우 많은 일을 하고,
- 여러곳에 의존하고,
- 심지어 web form 데이터 까지 AR에 전달한다.
- 결벽스러운 소프트웨어 공학자들이 비명을 지를 것이다.
- domain logic과 framework가 loose-coupling 할 수록 더 좋은 소프트웨어가 맞다.
- 하지만 (내가 이해하는) Rails way 는 loose-coupling 을 지향하지 않는다.
- Rails 는 simple 보다 ease-of-use 를 지향한다.
- (tight-coupling 한 결정이라도, 그것이 쉽고 편하다면 Rails는 그것을 선택한다.)
- 물론 나도 simple 한 모듈들을 조합하는 방식이 이상적이라고 생각한다.
- 하지만 매우 loose-coupling 하고, 모듈화된 프레임워크가 장점만 있지 않았다.
- 프로그래머 별로 조합하는 방식에 일관성이 없고,
- 여러사람의 손을 거치면 오히려 복잡해지고, 유지보수가 힘들었다.
- 그래서 나는 Rails way 를 좋아하고, 개인 프로젝트는 Rails 를 사용한다.
User.create
는 framework 와 내가 만드는 app 사이의 (일종의) API 이다.
- API가 사용하기 쉽고, 내부에 복잡한 일을 한다는 건 중요한 문제가 아니라고 생각한다.
- DB엔진 내부가 복잡하고 자세히 몰라도 우리는 SQL 이라는 인터페이스로 쉽게 조회를 한다.
- 문이 어떻게 열리는지 내부 구조를 몰라도 우리는 손잡이를 돌려 문을 연다.
- 중요한 문제는 내부 구조를 확장할 정도로 내가 만드는 앱이 복잡해졌을 때 이다.
- 예를 들면 MySQL 의 내부구조를 전혀 모르고 SQL 인터페이스로 사용만 해오다가.
- SELECT 문에 특정 기능을 추가해야 한다면?
- MySQL 내부구조를 연구해서, 쪼개고, 직접 수정할 것인가?
- Rails 는 이러한 상황에 우아한 해결책을 주는가?
- 내 생각에도 Rails 는 이것을 고려해서 만들지도, 또 중요하게 생각하지 않는 것 같다.
- 내 경험에 한정하면
- Rails의 내부 구조를 쪼개서 기능 변경을 해야할 정도로 비즈니스 로직이 복잡해 진다면.
- 일단 내 설계를 의심해왔고, 해결되지 않는 문제는 아직 없었다.
ActiveRecord.suppress
와 ActiveSupport
는 나쁜 접근이라는 점에 동의한다.
- 나도 가능한 안 써야 한다고 생각한다.
- (다들 쓴다는 점에서 조금 우울하지만…)
- 나는 무엇보다 사용자가 필요한 기능을 빨리 만들고 변경하는 것을 중요하게 생각한다.
- MVC, SOLID, 디자인 패턴, DDD 등에 의해 완벽한 소프트웨어를 만드는건 나중에 해도 된다.
- 나는 quick and dirty 로 사용자가 원하는 것을 구현하고 나중에 리팩토링 하는 길을 선호한다.
- quick and dirty 에 최적화된 언어는 PHP 이다.
- 그게 Facebook, Tumblr 등이 성공한 이유다.
- 하지만 PHP는 더러운 코드가 유지될 가능성이 높다는 결정적인 단점이 있다.
- 그런 면에서 Rails 를 사용하며 만족하고 있다.
- 사실 Rails 를 쓰는 가장 큰 이유는 테스트 코드 작성이 쉽다는 점이다.
- 난 Java 진영에서 직업으로서의 프로그래밍을 오랫동안 해오면서
- Java 로 작성된 제대로된 테스트 코드를 본 적이 없다.
- 사람들은 쉬우면 하고 어려우면 하지 않는다.
- 대중은 어려운 방향으로 수렴하지 않는다.
- 테스트 코드 없이는 리팩토링도, 반복된 로직을 줄이는 일도 매우 어렵다.
- (한 발 더 나가,
- 요즘엔 테스트 코드 작성과 기존 로직의 “변경”이 어려운 언어/프레임워크를 쓰는 서비스는 실패한다는 편견도 생겼다.)