Rust의 웹 응용 프로그램으로 Dependency inversion

7161 단어 Rusttech
클린 어치텍처와 같은 계층 구조를 실현하기 위해서는 의존 관계를 역전시킬 필요가 있다.이 글에서는 계층 구조 자체에 대한 설명은 설명하지 않고, Rust의 웹 응용에서 의존 관계를 어떻게 전환하는지에 대해 설명하였다.
샘플 코드는 비동기적으로 뉴스를 얻습니다.Usecase, Gateway 및 Port라는 개념을 사용하여 설명합니다.Usecase에는 응용 프로그램 논리를, Gateway에는 외부 API와 데이터 저장소 등에서 되돌아오는 값을 Domain으로 바꾸는 논리를 쓴다.Port는 디테일을 실현하는 추상적인 층에 달려 있다.아래 그림에서 보듯이 Usecase는 Port에 의존하고 Gateway도 Port에 의존한다.

다음은 각 층에 대해 설명한다.

Use case


news_get_usecase에서 뉴스의 ID 일람표를 얻었는데 이 ID를 바탕으로 최신 뉴스 100개를 얻는 응용 프로그램 논리가 기재되어 있다.Usecase는 Gateway의 구체적인 실시 방식을 모르고 실시포트의 일부 존재만 알고 있다.
pub async fn execute(news_port: impl NewsPort) -> Result<NewsList, Error> {
    let news_ids = news_port.find_news_ids().await?;
    news_port.find_news(news_ids.take_latest(100)).await
}

Port


Usecase와 Gateway가 의존하는 추상 계층입니다.Port 설치는 Gateway 에서 수행합니다.
#[async_trait]
pub trait NewsPort {
    async fn find_news(&self, ids: NewsIds) -> Result<NewsList, Error>;
    async fn find_news_ids(&self) -> Result<NewsIds, Error>;
}

Gateway


Port 설치를 수행하는 레이어입니다.다음 샘플 코드는 외부 API와 데이터 저장소 등 반환값을 변환하는 논리가 적힌 Gateway를 생략했습니다.이 층 덕분에 역 논리와 응용 프로그램 논리는 응용 프로그램의 외부에 의존하지 않는다.
#[derive(Debug, Copy, Clone)]
pub struct NewsGateway;

#[async_trait]
impl NewsPort for NewsGateway {
    async fn find_news(&self, ids: NewsIds) -> Result<NewsList, Error> {
        // convert a data format received from external systems to a particular Domain object
    }

    async fn find_news_ids(&self) -> Result<NewsIds, Error> {
        // convert a data format received from external systems to a particular Domain object
    }
}
이러한 실현을 통해 의존 관계를 역전시킬 수 있다.
전체 코드

최후


다른 API와 데이터 저장소 등 통신 대상이 늘어나면서 의존 대상을 늘리려 해도 Usecase 함수의 매개 변수를 늘리면 의존 관계 자체를 간단하게 유지할 수 있게 됐다.그래서 의존관계를 상당히 간단한 방법으로 역전시킬 수 있다고 생각한다.

좋은 웹페이지 즐겨찾기