Go Repository Pattern & sqlc로 데이터 접근 성능 향상
AI Store에서 AI코딩으로 만들어진 앱을 만나보세요!
지금 바로 방문하기

깨끗하고 성능이 뛰어난 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/v5pgxpool을 활용한 PostgreSQL 연결 풀 관리가 핵심 인프라 구성 요소