【GO/DDD】레이어드 아키텍처의 정리

이미 이미 자세한 기사가 여러 가지 있습니다만, 자신의 지식의 정리로서 써 갑니다.

계층화된 아키텍처



아래 그림의 구성이 됩니다.
Presentation 레이어(handler)→Application 레이어(usecase)→Domain 레이어(domain)→ Infrastructure 레이어(infrastructure)의 순서로 한 방향에 따라 구성되어 있습니다.
또한 각 레이어에 interface, struct를 정의합니다.



Presentation 레이어



http 통신 등을 씁니다.

애플리케이션 계층



CRUD를하는 장소.
MVC에서 말하는 View와 Controller 사이에 있는 녀석.

Domain 레이어



비즈니스 로직을 작성합니다.
구체적으로는 하기의 예를 알기 쉽다.
도메인 모델에서 실행해야 할 논리입니다.

・한정 공유 투고, 공개를 바꿀 수 있다(단, 한 번 공개한 기사를 비공개(=한정 공유)는 할 수 없다)
・최종 갱신일시로부터 1년 이상 경과하면 「이 기사는 최종 갱신일로부터 ○년 이상이 경과하고 있습니다.」라고 표시된다
도메인 모델, 도메인 로직이란 무엇인가를 코드를 섞어 생각해 본다 - Qiita 보다 인용

비즈니스 로직(business logic)이란?

인프라 레이어



DB, 메모리 조작을 작성합니다.
구체적으로는 SQL이군요.

MVC에서 말하면



Rails를 예로 들면 다음과 같이 보입니다.



레이어
이름


사용자 인터페이스 계층(View)
views view_objects

애플리케이션 계층(Controller)
controllers observers decorators parameters

도메인 계층(Model)
models mailers callbacks validators policies queries services value_objects factories


중간 규모 웹 개발을 위한 MVC 분할 및 레이어 아키텍처 - Qiita 보다 인용

이것도 엄청 도움이 되었다.
테메라의 Rails는 객체 지향이 아니야! 우선은 Callback 클래스, Validator 클래스를 활용하라! - Qiita

폴더 구성



현재 폴더 구성을 tree 명령으로 출력해 보았습니다.
├── app
│   ├── application
│   │   └── usecase
│   │       ├── user.go
│   ├── domain
│   │   ├── model
│   │   │   ├── user.go
│   │   ├── repository
│   │   │   ├── user.go
│   │   └── service
│   │       ├── user.go
│   ├── infrastructure
│   │   ├── database.go
│   │   └── persistence
│   │       ├── user.go
│   └── presentation
│       ├── handler
│       │   ├── request.go
│       │   └── response.go

용어 정리



도메인



도메인 모델이란, 지금 당신이 취급하고 있는 업무 도메인에 특화한, 소프트웨어 모델을 말한다.
도메인을 반영한 모델이란 도메인을 구성하는 물건, 개념, 행동, 관계성을 표현한 것입니다.
이해! 도메인 구동 설계 ~모치코짱의 대모험~【C91 신간】 - TechBooster - BOOTH 보다 인용

그리고이 레이어드 아키텍처는 DDD 내에서 전술 설계에 해당합니다.

종속성



위의 레이어드 아키텍처와 같은 구성을 도입하면 무엇이 기쁜지.
그것은 종속성이 단일 방향이 되고, 어느 한쪽의 변경으로 다른 한쪽이 망가지는 위험을 없애 줍니다.
즉 변경에 강해진다는 것에 집약된다고 생각합니다.

이상




프로그램 종속성 및 모듈 구성 - Qiita 보다 인용

개인적으로 주의할 것


  • 의존성이 큰 요소는 사용되는 장소를 국소적으로 한다
  • 의존성이 작은 요소는 많은 장소에서 사용되도록 한다
  • 각 계층에서도 종속성이 단일입니다.

    프로그램 종속성 및 모듈 구성 - Qiita 보다 인용

    인터페이스



    기능을 약속해주고, 다른 구조체(내용이 전혀 다르다고 해도)도 문제 없게 사용할 수 있습니다.
    Go의 인터페이스를 모르는 사람에게 - Qiita
    인터페이스 구현 패턴 #golang - Qiita

    기타 참고가 되는 기사



    Go package 구성 및 개발에 대한 모범 사례 - Tech Blog - Recruit Lifestyle Engineer
    레이어드 아키텍처 관점 - Qiita
    Golang API 레이어드 아키텍처를 사용해 보았습니다. - Qiita
    MVC, 3층 아키텍처에서 설계를 배우기 위한 기초 지식 - Qiita
  • 좋은 웹페이지 즐겨찾기