구분 | 데이터 중심 설계 (Database-Driven) | 트랜잭션 스크립트 (Transactional Script) | 액티브 레코드 (Active Record) | 도메인 주도 설계 (DDD) |
---|---|---|---|---|
중심 개념 | DB 스키마 | 서비스/함수 흐름 | ORM 엔티티 | 도메인 모델 |
설계 방식 | 테이블 구조를 먼저 설계하고 코드가 이를 따름 | 각 기능을 절차적으로 서비스 함수 안에서 처리 | 엔티티 객체에 데이터와 로직을 함께 포함 | 도메인 전문가 언어를 반영한 모델 중심 설계 |
장점 | 단순, 빠른 구현 | 빠른 개발, 이해하기 쉬움 | 프레임워크 친화적, 직관적 | 복잡성 관리, 유지보수성/확장성 뛰어남 |
단점 | 규칙이 흩어지고 유지보수 어려움 | 로직 중복, 복잡성 증가 시 스파게티화 | 엔티티 비대화, 복잡성 증가 시 한계 | 학습 비용 큼, 단순 서비스에는 과함 |
예시
Database-Driven: 전통적인 기업 내부 레거시 시스템, MyBatis/JDBC 직접 사용 프로젝트
Transactional-Script: 회원가입 → DB insert, 로그인 → DB select
Active-Record: User.save()
, Order.calculateTotal()
Domain-Driven: 결제, 주문, 배송 같이 규칙이 많고 상태 변화가 중요한 도메인
도메인 내부
// 참가자를 루트(Meeting)을 통해서 변경
public class Meeting {
...
public void removeMeetingParticipant(MeetingParticipant participant) {
this.currentParticipantsCount--;
this.participants.remove(participant);
}
}
도메인 외부