좋은 코드란 간결한 코드, 가독성이 좋은 코드 등 여러 가지가 있지만, 디자인 패턴에서는 설계적 관점에서의 좋은 코드를 말한다. 또한, 확장과 수정이 용이하고 설계 이후에도 추가적인 유지 보수에 비용이 적게 들어가는 코드를 말한다.
MVVM 패턴의 목표는 비즈니스 로직과 프레젠테이션 로직을 UI로부터 분리하는 것이다.
비즈니스 로직과 프레젠테이션 로직을 UI로부터 분리하면 유지 보수, 재사용, 테스트가 쉬워진다.
뷰 모델의 역할은 뷰가 사용할 메서드와 필드를 구현하고, 뷰에 상태 변화를 알리는 것이다. (뷰는 모델의 상태 변화를 옵저빙 한다.) 뷰 모델에서 제공하는 메서드와 필드가 UI에서 제공할 기능을 정의하고, 뷰가 이 기능을 어떻게 보여줄 것인지 결정한다.
뷰 모델과 모델은 일반적으로 One to Many의 관계를 형성한다. 뷰 모델은 뷰가 사용하기 쉽도록 모델의 데이터를 가공하여 뷰에게 제공한다. 뷰에서 서로 다른 두 모델의 데이터를 활용한 데이터가 필요하다면, 뷰에서 모델의 값을 조작하여 사용하는 것이 아니라 뷰 모델에서 두 모델의 데이터를 가공하고 뷰에서는 UI만 보이도록 한다.
프로젝트 관력 기록
1. domain/entity 폴더 안에 설정해 주었던 OrerList에 대한 Promise 객체를 interface로 export 하여 사용한다.
export interface OrderList {
list: Promise<OrderList>;
}
import { inject, injectable } from "inversify";
import { GetOrderList } from "domain/use-case";
import { OrderListRepository } from "domain/interactor/repository";
@injectable()
export default class GetOrderListImple implements GetOrderList {
private orderListRepository: OrderListRepository;
constructor(
@inject("OrderListRepository")
orderListRepository: OrderListRepository
) {
this.orderListRepository = orderListRepository;
}
execute(email: string) {
return this.orderListRepository.getOrderList(email);
}
}
export interfase OrderApi {
getOrderList():
}
- API -> Repo -> Domain(entity/usecase) -> ViewModel -> View의 파일 구조로 이루어진 프로젝트
ViewModel이 보여지는 페이지 단위를 말한다.
Veiw가 컴포넌트를 말한다 -> 우리가 아는 그 컴포넌트
inject()에 있는 것 inject.tx 안에 있는 것을 꺼내 오기 때문에 Api 이름을 똑같이 쓰는 것이 좋다.
바로 가져 오면 바깥 레이어의 내용을 아는 것이 되기 때문에 injector에 넣어 놓을 것을 가져 오는 것이다.
export interface Request {
id: number;
name: string;
src: string;
cost: number;
}
usecase/index.d.ts
export interface 해준다. 인자가 없으면 execute()로만 해주면 된다.
import에도 추가 해줘야 한다.
이렇게 MVVM 디자인 패턴 이론에 대해 공부하고, 실제 기업 협업을 하는 프로젝트에서 적용하면서 더 이해하도록 노력해야 할 것 같다.