earthkingman / 42Swim

42서울 QnA 서비스
14 stars 3 forks source link

TypeORM 패턴 결정 #1

Closed earthkingman closed 2 years ago

earthkingman commented 3 years ago

Active Record Pattern 모델 그 자체에 쿼리 메소드를 정의하고, 모델의 메소드를 사용하여 객체를 저장, 제거, 불러오는 방식

Data MapperPattern 분리된 클래스에 쿼리 메소드를 정의하는 방식 Repository를 이용하여 객체를 저장, 제거, 불러오는 방식

어떤 방식을 사용할지 정합시다.

hainho commented 3 years ago

고려할 사항

구축 중인 애플리케이션 유형

  1. CRUD 기반 응용 프로그램 CRUD 기반 애플리케이션은 코드가 데이터베이스에 깔끔하게 매핑되는 곳입니다. 일반적으로 엔티티를 생성, 읽기, 업데이트 및 삭제합니다. 또한 모델 간에 관계가 있을 수 있지만 대부분의 경우 이러한 관계를 적용하는 방법에 대한 엄격한 규칙은 없습니다. Active Record를 사용하면 작업 중인 응용 프로그램을 빠르고 쉽게 시작하고 실행할 수 있습니다.

  2. 도메인 기반 응용 프로그램 비즈니스 Domain별로 나누어 설계한 응용프로그램 데이터 매퍼 패턴은 데이터 처리 및 지속성에 대한 특정 제한을 적용하고 엔터티 내에서 이러한 비즈니스 규칙을 캡슐화할 수 있도록 합니다.

애플리케이션 및 구축 중인 환경

새로운 시장을 테스트하기 위해 최소 실행 가능한 제품 응용 프로그램을 구축하는 경우 Active Record 패턴을 사용하는 것이 더 합리적

비즈니스 작동 방식에 대한 규정과 절차가 있는 시장에 진입 하는 경우 데이터 매퍼 패턴을 사용하면 비즈니스의 도메인 규칙을 캡슐화할 수 있으므로 애플리케이션 작업이 명확하고 직관적

그렇다면

규모가 크지 않고 crud 기반이며 도메인 별로 나누어 설계할 정도의 사이즈가 아니므로 active record가 적합할거 같습니다.

hainho commented 3 years ago

data mapper 패턴 사용시

ddd vs cqrs

ddd (Domain Driven Design) 데이터 관련된 코드들을 기능을 기준으로 나누어 설계하는 방식

cqrs (Command and Query Responsibility Segregation) 커맨드 (insert, update, delete)와 쿼리(select)로 나누어 설계하는 방식

cqrs 사용시

일반 vs 프리미엄 vs 디럭스

일반 데이터 접근 방식만 나누어 설계하는 방식 데이터 베이스는 하나를 사용하기 때문에 성능상 이점은 없음

프리미엄 데이터 베이스도 분리하고 이 둘을 broker를 통해 data 동기화 처리 하는 방식 성능 향상 가능 하지만 동기화 처리를 위한 broker의 가용성과 신뢰도가 보장되어야함

디럭스 이벤트 소싱을 적용한 구조 (이벤트 스트림을 별도의 데이터베이스에 저장하는 방식) 이벤트 소싱의 이벤트 스트림은 오직 추가만 가능하고 이를 필요로 하는 시점에서 구체화 단계를 거친다 이런 처리 구조가 cqrs의 모델 분리 관점과 상당한 시너지가 있어 대부분 cqrs 패턴 적용시 이벤트 소싱이 적용된 구조를 선택한다

earthkingman commented 3 years ago

https://github-wiki-see.page/m/boostcamp-2020/Project12-B-Slack-Web/wiki/TypeORM 참고해서 현재 작성된 Active Record 패턴에서 Data Mapper 패턴으로 바꾸겠습니다.