MVC 모델을 DB에서 느슨하게 연결 유지 하시겠습니까?


9

필자는 코드를 테스트 가능하게 유지하고 현재 MVC 프레임 워크에 대한 Dependency-Injection 전략을 사용하기로 결정했습니다.이 전략은 느슨하게 결합 된 코드, 테스트 가능성 및 모듈성을 보장하는 훌륭한 방법으로 입증되었습니다.

그러나 디자인 패턴의 마스터와는 거리가 멀어 가능한 한 데이터베이스 커넥터 클래스에서 모델을 느슨하게 연결하는 좋은 방법을 찾는 데 어려움을 겪고 있습니다.

어떻게 할 수 있습니까?
이 질문과 함께 실제 코드를 제공하지 않았으므로 위의 문제를 이해하는 방향으로 안내 할 수있는 논리 / 코드 예제 또는 정보에 감사드립니다.


이 질문은 코드에서 구현하는 것보다이 주제에 대한 구조 및 사고에 관한 것이기 때문에 Software Engineering 에 속합니다 .
Lasse V. Karlsen

답변:


6

한 가지 방법은 데이터베이스를 설계하기 전에 모델을 설계하는 것입니다. 모델을 설계 할 때 문제 영역 내에서 비즈니스 논리와 의미를 포착하는 데 중점을 둡니다. 이는 엔터티 및 데이터 필드 이상의 것을 포함하여 비즈니스에 적합한 방식으로 캡처되어야합니다. 일부 데이터 요소는 다른 데이터 요소로 해석되고 일부는 다른 요소에 따라 결정됩니다. 또한 특정 요소가 특정 값으로 설정된 경우 개체가 내부적으로 응답하는 방식과 같이 필요한 모든 기본 논리를이 모델에 추가합니다.

데이터를 유지하는 방식과 90 % 이상 동일한 결과를 초래할 가능성이 큽니다. 괜찮아. 결합하지 않고 완전히 동일 할 수 있습니다.

또한 진정한 지속성 무지의 안개 속에서 도메인을 모델링하는 것은 소프트웨어 디자인에있어 성가신 일입니다. 할 수 있다면 환상적입니다. 그러나 문제 도메인이 전혀 중요하지 않고 복잡한 경우에도 도메인 모델링에서 때때로 물러나지 않도록 데이터 지속성에 대한 온 전성 검사를 수행하는 것이 좋습니다. 구석으로 자신을.

다양한 구성 요소의 실제 역할을 기억하고 디자인 할 때 해당 역할을 분리하십시오. 주어진 디자인 결정에 대해 해당 역할 중 어느 것이 위반되는지 스스로에게 문의하십시오.

  1. 데이터베이스-데이터를 저장하고, 데이터 무결성을 유지하며, 데이터를 유휴 상태로 유지합니다.
  2. 모델-비즈니스 로직을 포함하고, 문제 영역을 모델링하며, 데이터를 이동 상태로 유지하고, 비즈니스 레벨 이벤트에 응답하는 등
  3. 보기-사용자에게 데이터를 제공하고 사용자 측 논리를 수행합니다 (모델에서 실제 유효성 검사가 수행되기 전의 기본 유효성 검사 등).
  4. 컨트롤러-사용자 이벤트에 응답하고, 모델에 제어를 전달하고, 요청을 라우팅하고 응답을 반환합니다.

안녕 데이비드. 답장을 보내 주셔서 감사합니다. 높은 수준의 느슨한 결합을 유지하면서 모델을 데이터베이스 커넥터와 어떻게 연결 하시겠습니까?
Industrial

1
@Industrial : 모델을 지속성에 연결하는 방법에는 여러 가지가 있지만, 지금까지 내가 분리 된 관심사를 충족시키고 자하는 유일한 방법은 DAL에 의해 외부에서 구현되는 저장소 인터페이스를 도메인에 보유하는 것입니다. 리포지토리 메서드는 도메인 모델을 수락하고 반환하며 해당 모델과 생성 된 데이터베이스 엔터티간에 내부적으로 변환합니다. (솔직히 말해서, PHP에서는별로하지 않았습니다.) 따라서 DAL 프레임 워크를 사용하여 모든 DB CRUD 등을 자동 생성 한 다음 저장소와 해당 항목과 모델 간의 인터페이스로 저장소를 작성할 수 있습니다.
David

@Industrial : 예를 들어 ORM을 사용하는 경우 해당 ORM은 DAL (도메인 모델과 분리됨)에 의해 참조되고 그에 따라 모델을 데이터 액세스로 변환합니다. 또는 수동 SQL을 사용하여 데이터베이스에 직접 액세스하는 경우 DAL의 리포지토리 방법에서이를 수행하고 SQL 쿼리 결과를 도메인 모델로 변환 한 다음 반환합니다.
David

@Industrial : 리포지토리 메소드는 CRUD 일 필요는 없습니다. 많은 지능이 그 코드에 구워 질 수 있습니다. 더 복잡한 것들은 데이터베이스에서 데이터를 변환하는 많은 내부 코드를 가질 수 있습니다. 또는 복잡한 것들이 데이터베이스로의 많은 트립을 수반하는 경우, 성능 향상을 위해 논리를 저장 프로 시저에 넣고 DAL 방법은 해당 프로 시저를 통과하여 결과를 모델로 변환합니다.
David

안녕 데이비드! 이 답변에 다시 한번 감사드립니다. 확실히 내가 StackExchange에서받은 최고 중 하나입니다!
Industrial

2

두 가지를 원합니다.

  1. 모델 (DBAL에 접근하고 대부분의 앱 로직 수행)
  2. "도메인 모델"(일명 데이터 엔티티)은 사용자, 게시물, 제품 등과 같은 시스템의 엔티티를 나타냅니다.

    class PPI_Model_User {
    
        protected $_conn = null;
    
        function __construct(array $options = array()) {
            if(isset($options['dsnData'])) {
                $this->_conn = new PPI_DataSource_PDO($options['dsnData']);
            }
        }
    
        function getAll() {
            $rows = $this->_connect->query("SELECT .....")->fetchAll();
            $users = array();
            foreach($rows as $row) {
                $users[] = new PPI_Entity_User($row);
            }
            return $users;
        }
    
    }

사용 코드

    $model = new PPI_Model_User(array('dsnData' => $dsnData));
    $users = $model->getAll();
    foreach($users as $user) {
        echo $user->getFirstName();
    }

거기에 도메인 모델 (엔티티)을 생성하고 MVC 모델이 DB 연결 및 데이터 조작을 수행하는 방법이 있습니다.

PPI가 무엇인지 궁금하다면 Google에서 "PPI 프레임 워크"를 찾으십시오.

당신의 검색에 행운을 빕니다.

감사합니다. Paul Dragoonis.


1

MVC는 스몰 토크에서 발생하여 모든 객체에 대해 자동 지속성을 갖습니다. 따라서 MVC 패턴은 모델 / 지속성 분리를위한 솔루션을 규정하지 않습니다.

데이터베이스에서 Model 개체를 만들고 Model 개체를 데이터베이스에 저장하는 방법을 알고있는 "Repository"개체를 선호합니다. 그런 다음 모델은 지속성에 대해 아무것도 모릅니다. 일부 사용자 작업은 저장을 트리거해야하므로 컨트롤러가 리포지토리에 대해 알고있을 것입니다. 일반적으로 컨트롤러가 리포지토리에 연결되지 않도록 일종의 종속성 주입을 사용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.