맨위로가기

액티브 레코드 패턴

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

액티브 레코드 패턴은 데이터베이스 테이블을 객체로 표현하고, 객체의 메서드를 통해 데이터베이스 작업을 수행하는 소프트웨어 디자인 패턴이다. 이 패턴은 데이터베이스의 각 행을 클래스의 인스턴스로, 각 열을 인스턴스 변수로 매핑한다. 액티브 레코드 패턴은 Ruby on Rails와 같은 프레임워크에서 구현되어 데이터베이스 레코드의 생성, 조회, 수정, 삭제(CRUD)를 쉽게 할 수 있도록 돕는다. 하지만 데이터베이스 상호 작용과 애플리케이션 로직의 결합으로 인해 테스트의 어려움, 단일 책임 원칙 및 관심사 분리 위반, 파일 크기 증가, 분산 시스템에서의 문제점 등의 비판을 받기도 한다.

더 읽어볼만한 페이지

  • 아키텍처 패턴 - 서비스 지향 아키텍처
    서비스 지향 아키텍처(SOA)는 기능들을 독립적인 서비스 단위로 분리하여 느슨하게 결합함으로써, 네트워크를 통해 접근 가능한 서비스를 재사용하고 결합하여 응용 프로그램을 구축하는 소프트웨어 아키텍처이다.
  • 아키텍처 패턴 - 제어 반전
    제어 반전은 프로그램의 제어 흐름을 프레임워크나 컨테이너가 관리하도록 하는 프로그래밍 원칙으로, 코드 결합도를 낮추고 유연성을 높이지만, 복잡성을 증가시킬 수 있다는 비판도 존재한다.
  • 소프트웨어 디자인 패턴 - 모델-뷰-컨트롤러
    모델-뷰-컨트롤러(MVC)는 소프트웨어 디자인 패턴으로, 응용 프로그램을 모델, 뷰, 컨트롤러 세 가지 요소로 분리하여 개발하며, 사용자 인터페이스 개발에서 데이터, 표현 방식, 사용자 입력 처리를 분리해 유지보수성과 확장성을 높이는 데 기여한다.
  • 소프트웨어 디자인 패턴 - 스케줄링 (컴퓨팅)
    스케줄링은 운영 체제가 시스템의 목적과 환경에 맞춰 작업을 관리하는 기법으로, 장기, 중기, 단기 스케줄러를 통해 프로세스를 선택하며, CPU 사용률, 처리량 등을 기준으로 평가하고, FCFS, SJF, RR 등의 알고리즘을 사용한다.
액티브 레코드 패턴

2. 구현

액티브 레코드 패턴은 다양한 프로그래밍 환경과 프레임워크에서 구현되어 사용된다.

예를 들어, 데이터베이스에 `name` (문자열 형식) 및 `price` (숫자 형식) 열이 있는 `parts` 테이블이 있고, `Part` 클래스에 액티브 레코드 패턴이 구현된 경우, 다음의 의사 코드는 지정된 값으로 `parts` 테이블에 새로운 행을 생성한다.

```ruby

part = new Part()

part.name = "Sample part"

part.price = 123.45

part.save()

```

이는 대략 다음의 SQL 명령과 동일하다.

```sql

INSERT INTO parts (name, price) VALUES ('Sample part', 123.45);

```

반대로, 클래스를 사용하여 데이터베이스를 쿼리할 수 있다. 다음 코드는 `name` 열의 값이 "gearbox"인 `parts` 테이블에서 일치하는 첫 번째 행을 기반으로 새로운 `Part` 객체를 찾는다.

```ruby

b = Part.find_first("name", "gearbox")

```

사용된 SQL 명령은 데이터베이스의 SQL 구현 세부 사항에 따라 다음과 유사할 수 있다.

```sql

SELECT * FROM parts WHERE name = 'gearbox' LIMIT 1; -- MySQL 또는 PostgreSQL

```

액티브 레코드는 데이터베이스에서 데이터를 읽어오는 접근 방식이다. 데이터베이스 테이블 또는 뷰의 한 행이 하나의 클래스로 래핑되며, 객체의 인스턴스는 해당 데이터베이스의 한 행에 결합된다. 이 클래스는 데이터베이스 접근의 캡슐화도 수행한다[3]。 객체가 생성된 후, 저장 메서드를 통해 새로운 행이 데이터베이스에 추가된다. 객체가 갱신되면, 데이터베이스의 해당 행도 또한 갱신된다. 래퍼 클래스는 테이블 또는 뷰의 각 열에 대한 액세서 메서드를 구현한다[3]

테이블과 클래스가 일대일로 연결되기 때문에 매우 단순한 구조를 갖는 것이 특징이며, Ruby on Rails에서는 데이터베이스 정의로부터 거의 자동으로 CRUD 연산을 갖춘 클래스를 생성하는 것을 실현하고 있다. 반면에 그 성질상, 복잡한 설계의 데이터베이스와는 상성이 좋지 않다[3]

2. 1. Ruby on Rails

Ruby on Rails 프레임워크의 액티브 레코드는 이 패턴의 대표적인 구현 사례 중 하나이다. Rails에서는 데이터베이스 테이블과 모델 클래스를 1:1로 매핑하여, 모델 객체를 통해 데이터베이스 레코드를 생성, 조회, 수정, 삭제(CRUD)할 수 있다.

예를 들어, `id` 열(시리얼 주 키), `name` 열(varchar 형), `price` 열(money 형 또는 double 형)을 가진 `parts` 테이블이 있다면 다음과 같은 코드를 사용한다.

```ruby

a = Part.new

a.name = "Sample part"

a.price = 123.45

a.save

```

위의 코드는 주어진 값으로 새로운 행을 데이터베이스에 생성한다. 이는 다음 SQL 명령과 거의 동일하다.

```sql

INSERT INTO parts (name, price) VALUES ('Sample part', 123.45);

```

반대로, 데이터베이스를 검색하기 위해 이 클래스를 사용할 수도 있다.

```ruby

widgetname = "gearbox"

b = Part.where(:name => widgetname).first

```

이 코드는 `name` 열이 Ruby 변수 `widgetname`의 값과 일치하는 첫 번째 행을 가져와 객체를 생성한다. 이는 다음 SQL 명령과 유사하다.

```sql

SELECT * FROM parts WHERE name = 'gearbox' LIMIT 1;

```

다른 방법으로, 위의 코드는 다음과 같이 짧게 할 수도 있다.

```ruby

b = Part.find_by_name("gearbox")

3. 비판

액티브 레코드 패턴은 편리하지만, 데이터베이스 설계가 복잡할 경우 잘 맞지 않는다는 단점이 있다.[3]

3. 1. 테스트 용이성

활성 레코드 패턴을 사용하면 데이터베이스 상호 작용과 애플리케이션 논리가 결합되어, 데이터베이스 없이 활성 레코드 객체를 단위 테스트하기가 어려워진다. 이러한 문제는 모킹이나 종속성 주입 프레임워크를 사용하여 실제 데이터 계층을 시뮬레이션된 계층으로 대체하여 완화할 수 있다.

3. 2. 단일 책임 원칙 및 관심사 분리

액티브 레코드 패턴은 데이터베이스 상호작용과 애플리케이션 로직이 강하게 결합되어 있어 단일 책임 원칙관심사 분리를 따르지 않는다는 비판을 받는다. 이는 이러한 방식을 제대로 다루는 다중 계층 아키텍처와 대조적이다.[3] 이러한 이유로 액티브 레코드 패턴은 CRUD 기능을 갖춘 폼-데이터 기반의 단순한 애플리케이션이나 아키텍처의 일부로만 사용되는 경우가 가장 많으며, 여러 ORM(객체 관계 매핑)이 이 패턴을 구현하는 이유이기도 하다.

3. 3. 대규모 파일

데이터와 데이터베이스 접근 방식이 같은 파일에 위치하므로 파일 크기가 커질 수 있다.

3. 4. 분산 시스템

레코드 기반 패턴은 특히 동시성이 보장되지 않는 분산 시스템 환경(예: 오프라인)에서는 제대로 동작하지 않을 수 있다. 즉, 두 업데이트 모두 올바른 필드 하나를 가질 수 있지만 두 레코드 중 하나만 이길 수 있다.[1]

4. 같이 보기

참조

[1] 웹사이트 P of EAA Catalog - Active Record https://martinfowler[...]
[2] 서적 Patterns of enterprise application architecture https://books.google[...] Addison-Wesley
[3] 웹사이트 デザインパターンから見たActive Record https://www.techscor[...] TECHSCORE 2012-05-23
[4] 웹사이트 Data Mapper https://martinfowler[...] 2024-09-06
[5] 웹사이트 P of EAA Catalog - Active Record https://martinfowler[...]
[6] 서적 Patterns of enterprise application architecture https://books.google[...] Addison-Wesley



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com