PHpullh
학습 라이브러리/Go/클린 아키텍처

GO · 패턴

클린 아키텍처

계층 분리로 테스트 가능하고 유지보수하기 좋은 구조를 만듭니다. 도메인 → 유스케이스 → 인프라 순서로 의존합니다.

패턴고급clean-architecturelayersusecasedomain

핵심 설명

계층 분리로 테스트 가능하고 유지보수하기 좋은 구조를 만듭니다. 도메인 → 유스케이스 → 인프라 순서로 의존합니다.

Go code

package main

import "fmt"

// 도메인 계층 (의존성 없음)
type User struct {
	ID   int
	Name string
}
type UserRepository interface {
	FindByID(id int) (*User, error)
}

// 유스케이스 계층 (도메인에만 의존)
type GetUserUseCase struct {
	repo UserRepository
}
func (uc *GetUserUseCase) Execute(id int) (*User, error) {
	return uc.repo.FindByID(id)
}

// 인프라 계층 (모든 곳에 의존 가능)
type MemoryUserRepo struct{ data map[int]*User }
func (r *MemoryUserRepo) FindByID(id int) (*User, error) {
	u, ok := r.data[id]
	if !ok { return nil, fmt.Errorf("사용자 %d 없음", id) }
	return u, nil
}

// 조립 (main 또는 DI 컨테이너)
func main() {
	repo := &MemoryUserRepo{data: map[int]*User{
		1: {ID: 1, Name: "Gopher"},
	}}
	uc := &GetUserUseCase{repo: repo}
	user, _ := uc.Execute(1)
	fmt.Printf("사용자: %+v\n", *user)
}

학습 팁

의존성 방향은 항상 안쪽(도메인)을 향해야 합니다. 도메인 계층은 어떤 외부 패키지도 import하지 않습니다.

주의할 점

유스케이스 계층에서 HTTP, DB 등 인프라 세부사항에 직접 의존하면 테스트와 교체가 어렵습니다. 인터페이스로 추상화하세요.

자주 묻는 질문

클린 아키텍처란 무엇인가요?

계층 분리로 테스트 가능하고 유지보수하기 좋은 구조를 만듭니다. 도메인 → 유스케이스 → 인프라 순서로 의존합니다.

클린 아키텍처 학습 시 주의할 점은 무엇인가요?

유스케이스 계층에서 HTTP, DB 등 인프라 세부사항에 직접 의존하면 테스트와 교체가 어렵습니다. 인터페이스로 추상화하세요.