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만 담당하세요.
Continue Learning
Go 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.