컬렉션 회사 Go제 WebAPI의 포장 구성
9298 단어 Go
나는 당시의 상황을 돌아보면서 현황을 정리하고 싶다
결혼식
관리에 의존하여 dep를 사용합니다.(dep가 나오기 전까지glide를 계속 사용합니다.)
2년 전과 비교하면 여러 가지 물건이 편리해져 보통으로 사용할 수 있게 되었다.
당시에는 고1에 불과했다.5시죠...
주로 사용되는 라이브러리
아무튼 이런 느낌입니다.
아무튼 이런 느낌입니다.
https://qiita.com/kyokomi/items/dcd8384a0a042d72d22d
포장은 무엇을 구성하는가
DDD책에 나오는 레이어드 빌딩을 워낙 의식하다 보니 어느새 바람양파 구조처럼 변했다.
지금 나는 이런 형식이 내 마음속에서 가장 좋다고 생각한다.├── application
├── domain
│ ├── file
│ ├── friendship
│ └── user
├── infrastructure
│ ├── adapter
│ │ ├── auth
│ │ ├── aws
│ │ ├── cache
│ │ ├── firebase
│ │ └── rdbms
│ └── repository
└── presentation
├── controller
├── middleware
└── view
패키지 이름
대응하는 양파 구조의 명칭
설명
presentation/controller
User Interface
gooa에서generate의 controller (http의Handler) 를 사용합니다.여기서 애플리케이션 서비스 호출
presentation/middleware
Request Header 같은 Middleware 확인
presentation/view
User Interface
gooa에서 정의한response에 마핑 및 쓰기
application
Application Service
domain/xxxx Repository 인터페이스를 통해 도메인 객체 가져오기 및 업데이트
domain
Domain Model
상업 논리.특정 infrastructure나view에 의존하지 않는 순수한 규범을 정의합니다
infrastructure/adapter
Infrastructure에서 나간 부분의 adapter입니다.
RDB, Redis 등 Cache, 외부 API 등과 교환
infrastructure/repository
Infrastructure
domain/xxxx의 Repository 인터페이스를 구현하는 struct
호출 프로세스
그림이 되면 이런 느낌의 호출 절차.(기분 좋으면 등사
친구 관련 기능을 예로 들 수 있습니다.(글씨가 더러워...)
※ 그림은 분위기 속에서 그린 그림이기 때문에 UML 같은 좋은 것은 아니다
화살표는 기본적으로 데이터 흐름이지만 인프라 시설인friendShip Repository가 지역 서비스인friendShip Repository 인터페이스를 가리키는 화살표만 계승한다
주안점
├── application
├── domain
│ ├── file
│ ├── friendship
│ └── user
├── infrastructure
│ ├── adapter
│ │ ├── auth
│ │ ├── aws
│ │ ├── cache
│ │ ├── firebase
│ │ └── rdbms
│ └── repository
└── presentation
├── controller
├── middleware
└── view
맵퍼 정보
각 층의 데이터를 교환한 후 변환된 코드를 삐걱삐걱 쓰면 가독성이 떨어지기 때문에 마퍼를 적당히 쓴다
글로벌한 방법을 사용하면 사용 범위가 흐려지기 때문에 빈 struct를 만들어 방법의 생성과 정리를 해야 한다.(별도로 포장하지 않는 시스템)
type friendShipConvert struct {
}
var friendShipConverter = friendShipConvert{}
func (cnv friendShipConvert) toFollowTables(userID user.Identifier, followUsers friendship.Users) []*rdbms.UserFollowTable {
result := make([]*rdbms.UserFollowTable, len(followUsers))
for i := range followUsers {
result[i] = &rdbms.UserFollowTable{
UserID: userID.String(),
FollowUserID: followUsers[i].ID.String(),
}
}
return result
}
func (cnv friendShipConvert) toBlockTables(userID user.Identifier, blockUsers friendship.Users) []*rdbms.UserBlockTable {
result := make([]*rdbms.UserBlockTable, len(blockUsers))
for i := range blockUsers {
result[i] = &rdbms.UserBlockTable{
UserID: userID.String(),
BlockUserID: blockUsers[i].ID.String(),
}
}
return result
}
사내 공통 라이브러리
나는 보통
ClusterVR/go
이런 창고를 만들고 dep로vendoring을 한다.신중을 기하기 위해
rdbms/v1
이런 버전으로 바꿀 수 있는 디렉터리 파기 패키지명rdbms
같은 것들은 있지만 v2를 만드는 목표가 없기 때문에 지금 정말 필요한 것은 수수께끼├── goa
│ └── middleware
│ └── v1
├── kvs
│ └── v1
├── mqtt
│ └── v1
├── rdbms
│ └── v1
└── sentry
└── v1
굳이 불평을 한다면
각 층 간의 데이터의 마핑에서 매번 for문이나 근육으로 쓰기는 좀 번거롭다
덤
CI 정보
나는 CircleaCI->Wercker->CircleaCI 2.0의 역사를 찾고 있다.
워커는 가격이 비싸지만 멈추는 경우가 많아 부담이 컸지만, 써클씨아이 2.0 때는 도커 이미지를 활용할 수 있어 느낌이 좋아 옮겼다.
지금은 평화롭습니다
로컬 개발
docker-compose에 필요한 infrastructure와 마이크로 서비스화된 인터넷 알api 등을 모아 시작 확인 동작을 시작하는 느낌을 준다.
계속 작동하면 컴퓨터의 배터리가 급속히 줄어들어서 고민이에요...
감상
쓰고 싶었는데 안 쓰다가 2년 만에 이런 기분...
설치할 때domain/xxxx를 고려할 때 어떤 입도로 만들어야 합니까?등 주된 부분, 그 다음은 간단한 작업이기 때문에 설치가 바삭바삭하고 느낌이 좋습니다.
고민하지 않고 한꺼번에 만들어내고, 불협화음이 생기면 정리하고 팩스를 하는 절차가 좋다.
이상, 내년?어떻게 될지 기대가 되네요.
Reference
이 문제에 관하여(컬렉션 회사 Go제 WebAPI의 포장 구성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kyokomi/items/c93b656a66763ee18b98
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
쓰고 싶었는데 안 쓰다가 2년 만에 이런 기분...
설치할 때domain/xxxx를 고려할 때 어떤 입도로 만들어야 합니까?등 주된 부분, 그 다음은 간단한 작업이기 때문에 설치가 바삭바삭하고 느낌이 좋습니다.
고민하지 않고 한꺼번에 만들어내고, 불협화음이 생기면 정리하고 팩스를 하는 절차가 좋다.
이상, 내년?어떻게 될지 기대가 되네요.
Reference
이 문제에 관하여(컬렉션 회사 Go제 WebAPI의 포장 구성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kyokomi/items/c93b656a66763ee18b98텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)