깨끗하고 성능이 뛰어난 Go에서 데이터 접근 마스터링: Repository 패턴과 sqlc (2)
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
웹 개발, DevOps
대상자
Go 및 PostgreSQL 기반의 백엔드 개발자, 특히 마이크로서비스 아키텍처를 사용하는 팀
핵심 요약
Repository
패턴은 산재된 SQL 쿼리 문제를 해결하고 테스트 가능성과 유지보수성을 향상시킴pgx/v5
를 활용한 PostgreSQL 인프라 구현에서context.Context
와*models.User
포인터 사용이 핵심 설계 원칙- 수동 구현의 단점(쿼리 문자열 중복,
Scan()
호출의 오류 가능성, 오류 처리 복잡성)으로sqlc
도입의 필요성 강조
섹션별 세부 요약
1. 도메인 모델 정의
models/user.go
에서User
구조체 정의:
- ID
, Name
, Email
, CreatedAt
, UpdatedAt
필드 포함
- json
태그는 API 직렬화, binding
태그는 검증 라이브러리와 연동
- 도메인 모델은 비즈니스 로직에 집중, 데이터베이스 관련 문제는 분리
2. Repository 인터페이스 정의
domain/repositories/user_repository.go
에서UserRepository
인터페이스 정의:
- Create
, GetByEmail
, GetByID
메서드 포함
- context.Context
사용으로 요청 범위 값 및 시간 제한 관리
- *models.User
포인터 사용으로 DB 생성 시간 필드 자동 업데이트
- (*models.User, error)
반환 형식으로 nil
리턴 시 도메인 특정 오류 처리
3. PostgreSQL 기반 Repository 구현
infrastructure/persistence/postgres/pgx_user_repository.go
에서pgxUserRepository
구현:
- pgxpool.Pool
사용으로 연결 풀 관리
- Create
메서드: INSERT
쿼리로 사용자 생성 후 Scan()
으로 ID 및 타임스탬프 반환
- GetByEmail
/GetByID
: SELECT
쿼리로 사용자 조회, pgx.ErrNoRows
처리로 ErrUserNotFound
리턴
- ErrUserEmailExists
등 도메인 특정 오류 정의 및 PostgreSQL 에러 코드 23505
매핑
4. 수동 구현의 한계
- 쿼리 문자열 중복: SQL 문자열은 런타임 오류만 검출
Scan()
호출의 정확성: 열 순서 및 수량 불일치 시 런타임 오류 발생- 오류 처리 복잡성:
pgx.ErrNoRows
및 유니크 제약 위반 처리 필요 - 반복적 보일러플레이트: 쿼리 실행, 스캔, 오류 매핑 코드 중복
결론
sqlc
도입으로 수동 구현의 반복적 코드와 오류 처리 복잡성을 줄일 수 있음Repository
패턴은 테스트 가능성, 유지보수성 향상에 기여하지만,sqlc
사용을 통해 더욱 효율적인 구현이 가능pgx/v5
와pgxpool
을 활용한 PostgreSQL 연결 풀 관리가 핵심 인프라 구성 요소