PHpullh
학습 라이브러리/Go/리포지토리 패턴

GO · 구조체/인터페이스

리포지토리 패턴

데이터 접근 로직을 추상화하는 리포지토리 패턴. 저장소 교체와 테스트가 용이합니다.

구조체/인터페이스고급repositorypatterninterfacedata-access

핵심 설명

데이터 접근 로직을 추상화하는 리포지토리 패턴. 저장소 교체와 테스트가 용이합니다.

Go code

package main

import (
	"errors"
	"fmt"
)

type User struct {
	ID   int
	Name string
}

// 리포지토리 인터페이스
type UserRepository interface {
	FindByID(id int) (*User, error)
	Save(user *User) error
	FindAll() ([]*User, error)
}

// 인메모리 구현
type memoryUserRepo struct {
	users map[int]*User
	seq   int
}

func NewMemoryUserRepo() UserRepository {
	return &memoryUserRepo{users: make(map[int]*User)}
}

func (r *memoryUserRepo) FindByID(id int) (*User, error) {
	u, ok := r.users[id]
	if !ok { return nil, errors.New("사용자 없음") }
	return u, nil
}

func (r *memoryUserRepo) Save(u *User) error {
	if u.ID == 0 { r.seq++; u.ID = r.seq }
	r.users[u.ID] = u
	return nil
}

func (r *memoryUserRepo) FindAll() ([]*User, error) {
	all := make([]*User, 0, len(r.users))
	for _, u := range r.users { all = append(all, u) }
	return all, nil
}

func main() {
	repo := NewMemoryUserRepo()
	repo.Save(&User{Name: "Gopher"})
	repo.Save(&User{Name: "Rustacean"})
	users, _ := repo.FindAll()
	for _, u := range users { fmt.Printf("%+v\n", *u) }
}

학습 팁

리포지토리 인터페이스는 소비자 측(서비스 계층)에서 정의하세요. 실제 DB 구현은 별도 패키지에 둡니다.

주의할 점

리포지토리에 비즈니스 로직을 넣으면 계층 분리가 깨집니다. 리포지토리는 순수한 CRUD만 담당하세요.

자주 묻는 질문

리포지토리 패턴란 무엇인가요?

데이터 접근 로직을 추상화하는 리포지토리 패턴. 저장소 교체와 테스트가 용이합니다.

리포지토리 패턴 학습 시 주의할 점은 무엇인가요?

리포지토리에 비즈니스 로직을 넣으면 계층 분리가 깨집니다. 리포지토리는 순수한 CRUD만 담당하세요.