Rails는 MVC(Model-View-Controller) 아키텍처를 완벽하게 구현하며, 컨트롤러와 뷰를 위한 Action Pack, 모델을 위한 Active Record를 포함합니다. 풀스택 프레임워크로서 모든 레이어가 원활하게 연동되도록 설계되어 있어, 개발자는 ‘Don’t Repeat Yourself (DRY)’ 원칙을 준수하며 템플릿부터 제어 흐름, 비즈니스 로직까지 모든 것을 Ruby 언어로 작성할 수 있습니다. 특히, Rails는 DRY 준수를 위해 설정 파일이나 어노테이션 대신 리플렉션과 런타임 확장을 선호합니다. 이는 코드로 이미 설명된 내용을 다시 XML 파일로 기술하는 비효율성을 없애고, 컴파일 단계 없이 변경 사항을 즉시 확인할 수 있도록 합니다. 메타데이터는 프레임워크가 처리하는 구현 세부 사항으로 간주됩니다.
Active Record는 비즈니스 객체와 데이터베이스 테이블을 연결하여 논리와 데이터가 통합된 지속 가능한 도메인 모델을 생성하는 ORM(Object-Relational Mapping) 패턴의 구현체입니다. Martin Fowler가 정의한 바와 같이, 데이터베이스 테이블 또는 뷰의 행을 감싸고 데이터베이스 접근을 캡슐화하며 해당 데이터에 도메인 로직을 추가합니다. Active Record는 기존 ORM 패턴의 문제점이었던 연관 관계 및 상속 문제를 해결하는 데 크게 기여했습니다. 간단한 도메인 언어와 같은 매크로를 통해 연관 관계를 기술하고, Single Table Inheritance 패턴을 통합하여 데이터 매퍼와 Active Record 방식 간의 기능적 격차를 줄였습니다.
Action Pack은 웹 요청에 대한 응답을 컨트롤러 부분(로직 수행)과 뷰 부분(템플릿 렌더링)으로 분리합니다. 이 두 단계 접근 방식은 ‘액션’으로 알려져 있으며, 일반적으로 모델 부분(종종 데이터베이스)에 대한 생성, 읽기, 업데이트, 삭제(CRUD) 작업을 수행한 후 템플릿을 렌더링하거나 다른 액션으로 리디렉션합니다. Action Pack은 이러한 액션을 Action Controllers의 공개 메서드로 구현하고, Action Views를 사용하여 템플릿 렌더링을 수행합니다. Action Controllers는 애플리케이션의 특정 부분과 관련된 모든 액션을 처리하며, 이는 일반적으로 하나의 모델 객체(또는 소수)를 중심으로 한 목록 및 CRUD 액션으로 구성됩니다. 예를 들어, ContactController는 연락처 목록, 생성, 삭제, 업데이트를 담당할 수 있습니다. Action View 템플릿은 HTML 내에 임베디드 Ruby 태그를 사용하여 작성되며, 템플릿이 코드로 복잡해지는 것을 방지하기 위해 폼, 날짜, 문자열 등에 대한 공통 동작을 제공하는 헬퍼 클래스들이 제공됩니다. 애플리케이션이 확장됨에 따라 특정 헬퍼를 쉽게 추가하여 분리된 구조를 유지할 수 있습니다.