Table of Contents
- 연혁
이 모델은 다양한 모델과 모델의 조합으로 구성되어 있습니다. 이 모델은 다양한 모델과 모델의 조합으로 구성되어 있습니다. 이 모델은 다양한 모델과 모델의 조합으로 구성되어 있으며, 모델은 다양한 모델과 데이터와 비즈니스 논리에 대한 책임이 있는 레이어가 병목이 됩니다. Poorly 구조 모델은 단단한 커플링, 복제 논리 및 변경에 대한 코드베이스로 이어졌습니다. Achieving 확장성에는 deliberate, 훈련 모델 디자인이 필요합니다. 이 모델은 MVC의 종합적인 모델에 대한 포괄적인 모델의 개념을 제공합니다.
MVC 패턴 이해
MVC 패턴은 3 개의 상호 연결 구성 요소로 응용 프로그램을 분리합니다.
- Model: data, business rule, persistence logic을 관리합니다. 이 응용 프로그램의 도메인에 대한 진실의 단일 소스입니다.
- View: 는 모델의 데이터 읽기에 의해 사용자 인터페이스를 렌더링합니다 (또는 그의 프리젠 테이션 중심 표현).
- Controller: 은 모델과 전망 사이의 사용자 입력, 관현악을 처리하고, 따라 상태를 업데이트합니다.
보기 및 컨트롤러가 중요하지만, 모델은 지적 복잡성 측면에서 가장 중요한 곳입니다. 잘 구조 모델은 새로운 요구 사항에 적응할 수 있으며 트래픽을 처리하고 여러 인터페이스를 지원할 수 있습니다 (예 : 웹, API, 모바일) 캐스케이드 변경없이.
Scalable Models의 핵심 원리
특정 패턴으로 다이빙하기 전에 몇 가지 기초 원칙을 내부화하는 것이 필수적입니다.
- 단일 책임: 각 모델 또는 클래스는 변경할 수 있는 한 가지 잘 정의된 이유가 있어야 합니다. 예를 들어, 사업 유효성에 대한 별도의 데이터 액세스.
- Concerns의 분리: 응용 프로그램의 다른 측면 (인출, 검증, 알림, 등)는 , 느슨하게 결합 층에서 실행되어야한다.
- Don’t repeat Yourself (DRY):] 여러 모델이나 컨트롤러에 있는 중복 논리는 유지 보수 악몽으로 이어집니다. 대신, 재사용 가능한 서비스 또는 트레잇에 일반적인 행동을 추출합니다.
- Dependency Inversion:고수준 모듈은 콘크리트 구현이 아닌 추상(interfaces)에 따라야 한다. 이로 인해 데이터베이스, 캐싱 제공업체, 또는 외부 서비스를 재작성하지 않고도 교환할 수 있다.
도메인 구동 디자인 (DDD)
Eric Evans의 Domain-Driven Design는 모델 확장성에 가장 효과적인 접근법 중 하나입니다. DDD는 기술적인 우려보다 핵심 비즈니스 도메인 주변 모델을 구성하는 개발자를 격려합니다.
Ubiquitous 언어
개발자, 도메인 전문가 및 이해 관계자가 공유하는 일반적인 어휘를 설치하십시오. 코드, 문서 및 대화에서 동일한 용어를 사용하십시오. 예를 들어 전자 상거래 응용 프로그램은 실제 주문 행동을 반영하는 클래스가 있어야하며 일반적인 ]가 있어야합니다.
Bounded 컨텍스트
대부분의 경우, 이 웹 사이트는 귀하가 웹 사이트를 탐색하는 동안 귀하의 경험을 향상시키기 위해 쿠키를 사용합니다. 이 쿠키들 중에서 필요에 따라 분류 된 쿠키는 웹 사이트의 기본적인 기능을 수행하는 데 필수적이므로 브라우저에 저장됩니다. 이러한 쿠키는 귀하의 동의하에 만 브라우저에 저장됩니다. 이러한 쿠키 중 일부를 선택 해제하면 검색 환경에 영향을 미칠 수 있습니다.
의정부
의 골수는 단일 단위로 치료 된 도메인 객체의 클러스터입니다. 루트 엔티티티티는 일관성을 보장합니다. 예를 들어, 골수는 ]과 엔티티티티를 포함 할 수 있습니다. 이 패턴은 복잡한 관계와 단순화 된 거래를 감소시킵니다.
더 깊은 다이빙을 위해 ]Martin Fowler의 소개를 DDD에 참조하세요.
층별 건축
레이어화된 아키텍처는 모델의 특정 계층으로 구성하여 더 분리된 문제를 분리합니다.
- Domain Layer: 비즈니스 엔티티티티, 가치 객체 및 도메인 서비스를 포함합니다. 이 레이어는 인프라에 의존하지 않습니다.
- Application Layer: Orchestrates 사용 사례, 좌표 도메인 객체, 트랜잭션을 관리합니다. 그것은 도메인 레이어에 따라 다릅니다.
- Infrastructure Layer: persistence, messaging, External API 호출 및 기타 기술적인 우려 구현. 그것은 도메인 및 응용 프로그램에 따라 달라집니다.
- Presentation Layer: 인터페이스를 통해 응용층과 상호 작용하는 컨트롤러 및 레이아웃.
이 분리는 데이터베이스 기술, 캐싱 전략, 또는 UI 프레임 워크가 핵심 비즈니스 논리를 통해 잔액하지 않도록합니다. 또한 데이터베이스를 모는없이 쉽게 테스트 할 수 있습니다.
Repositories 및 서비스
2개의 본은 청소하고 확장할 수 있는 모형을 지키기를 위해 특히 귀중합니다:
Repository 패턴
저장소는 데이터 액세스 논리를 캡슐화, 도메인 객체에 in-memory 컬렉션 같은 인터페이스를 제공. 대신 플러그인 데이터베이스 쿼리를 스포크링 대신, 당신은 호출 ]. 이 요약은 데이터 소스를 스왑 할 수 있습니다 (예 : MySQL에서 PostgreSQL 또는 최소 충격으로 테스트를위한 인 메모리 저장소).
서비스 층
서비스는 단일 법인에 속하는 비즈니스 논리를 포함합니다. 예를 들어, ]는 주문할 때 유효성, 가격 및 재고 확인을 조정할 수 있습니다. 서비스는 저장소 및 도메인 엔티티티에 의존하지만 데이터베이스의 임신을 남깁니다. 이 분리는 컨트롤러, 배경 작업 및 API를 통해 재사용을 촉진합니다.
더 읽기를 위해 Fowler의 저장소 패턴 설명]를 참조하십시오.
데이터 전송 개체 (DTOs) 및 모델보기
보기 레이어 또는 외부 API 클라이언트에 전체 도메인 모델을 노출 꽉 커플 링을 만들고 종종 불필요한 내부 세부 사항을 노출. 대신, DTO를 사용하여 데이터를 정확히 입력 할 수 있습니다. 이점은 다음과 같습니다 :
- Decoupling: 도메인 엔트리에 변경은 API 클라이언트를 자동으로 깨지 않습니다.
- Security: Sensitive 필드 (예: 내부 ID, 감사 타임스탬프)는 부패 될 수 있습니다.
- Performance: DTOs는 특정 엔드포인트에 의해 필요한 필드만 포함하도록 맞춤화 될 수 있으며, 페이로드 크기를 줄입니다.
보기 모델은 발표 층에 대한 유사한 목적을 제공, 데이터 만 포함 전망 렌더링 필요 ( 포맷 된 날짜 또는 계산 된 총과 같은 표시 논리를 따라).
Scalability에 대한 데이터베이스 액세스 최적화
가장 깨끗한 모델 아키텍처는 데이터베이스 액세스가 비효율적 인 경우 실패합니다. 주요 전략은 다음과 같습니다.
의논하기
, ], ] 항목에 쓰이는 열에 색인을 생성한다. 과 인덱스는 쓰기를 느리게 할 수 있으므로 측정 및 모니터.
Query 캐싱
Redis 또는 Memcached와 같은 메모리 저장소 저장소를 사용하여 비싼 쿼리의 결과를 캐시합니다. 귀하의 도메인 (시간 기반, 이벤트 구동 또는 수동)에 적합한 캐시 유효성 검사를 실시하십시오.
질과 게으름 로딩
메모리에 큰 데이터셋을로드하지 마십시오. 커서 기반 또는 오프셋 pagination을 사용하십시오. ORMs에서는 어린이 관계에 게으른 로딩을 가능하게하지만 필요한 경우 N+1 쿼리 문제의 cautious가되고 eager 로딩 (예 : ] ActiveRecord 또는 ] SQL에서 사용하십시오.
Lazy 로딩 대 Eager 로딩
정확한 로딩 전략을 선택하면 성능에 대한 중요한 요소입니다.
- Lazy 로딩: 관련 데이터는 접근할 때만 로드됩니다. 이것은 단일 엔티티티 운영에 효율적이지만 루프에서 성능이 향상될 수 있습니다 (Dreaded N+1 문제).
- Eager 로딩: Single 쿼리에 필요한 모든 관계들을 로드합니다. 보기 또는 서비스를 알 때 사용은 관련 데이터가 필요합니다. 많은 ORMs 지원 명시된 eager 로딩 또는 투사.
의향적인 접근법은 알려진 경로에 대한 eager 로딩과 거의 접근 협회에서만 게으른 로딩을 사용한다. 실제 부하에서 데이터베이스 쿼리를 프로파일하여 올바른 균형을 찾을 수 있습니다.
수평 확장을위한 계획
애플리케이션이 단일 서버를 넘어 성장할 때, 모델 레이어는 배포를 지원해야 합니다.
- Stateless Models:는 모델 인스턴스에서 사용자 세션 또는 요청 특정 데이터를 저장하지 않습니다. stateless 서비스를 제공하기 위해 의존성 주입을 사용하십시오.
- Efficient Serialization: 네트워크 (예를 들면, JSON API를 통해)를 통해 여행하는 모델은 빠른 직렬화/세동화를 위해 설계되어야 합니다. 원형 참조를 가진 복잡한 객체 그래프 보다는 DTOs를 사용하세요.
- Database Sharding: 매우 큰 데이터셋을 위해, 여러 데이터베이스에 걸쳐 파티션 데이터를 분할한다. 저장소 레이어는 골반 루트를 기반으로하는 라우팅 전략과 함께 sharding 논리를 요약해야합니다.
- Eventual Consistency: 분산 시스템에서 서비스 전반에 걸쳐 리소스를 잠금하는 분산 트랜잭션을 방지합니다. 대신 이벤트와 메시지 큐와 같은 이벤트 구동 패턴을 사용하여 이벤트 일관성을 무시합니다.
더 많은 모범 사례
힘 주입
repository 및 서비스 의존성을 해결하기 위해 의존성 사출 용기를 사용하십시오. 이 분리 모델 구조는 콘크리트 구현에서 설계되었으며 테스트 또는 스케일링에 대한 구성 요소를 교환하는 데 트리 바이알을 만듭니다.
Immutability의 특징
가능한 한, 디자인 값 객체를 immutable로. immutable ] 클래스는 별칭과 통화와 관련된 버그를 감소. 또한, immutable 모델은 테스트 및 캐시가 더 쉽습니다.
고립에 있는 시험
서비스 및 도메인 논리에 대한 단위 테스트는 데이터베이스 또는 프레임 워크 부트 스트랩이 필요하지 않습니다. 의 시뮬레이션 또는 메모리 구현을 사용하십시오. 통합 테스트는 실제 데이터베이스에 대한 지속적 행동을 확인할 수 있지만 대상을 유지하십시오.
반대로 부식 층
기존 시스템 또는 외부 API와 통합할 때, 모델과 외부 시스템의 모델 사이에 번역하는 안티-corruption 레이어를 구축합니다. 이것은 귀하의 도메인에 누출하여 외부 변경을 방지합니다.
문서 및 코드 리뷰
모델 구조는 종종 시간이 지남에 따라 불투명이됩니다. 건축 결정 기록 (ADR) 유지 및 코드 리뷰 통해 일관성을 시행합니다. 새로운 팀 구성원을 내장하거나 모듈 개월을 나중에 다시 수정할 때 잘 문서화 된 모델은 배당금을 지불합니다.
관련 기사
MVC 패턴의 확장성 모델은 한 번 디자인 운동이 아니라 진행되는 분야가 아닙니다. DDD 및 계층 구조 적용, 현명하게 저장소, 서비스 및 DTO를 사용하여 문제의 분리와 같은 원칙에 따라 응용 프로그램을 성장할 수있는 모델 레이어를 만듭니다. 적합한로드 전략을 선택하고, 수평 스케일링을위한 계획은 부하 아래 수행 유지. 모든 결정은 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 아웃렛, 콜, 콜, 콜, 콜, 콜, 콜, 콜, 콜, 콜, 콜, 콜, 콜, 콜, 콜, 콜
더 탐험을 위해 Evans’ Domain-Driven Design book과 ]Redis 캐싱 패턴을 공부하는 것을 고려하십시오. 이 리소스는 여기에 논의 된 패턴에 대한 깊은 통찰력을 제공합니다.