"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Golang에서 Google 드라이브 다운로더 구축(1부)

Golang에서 Google 드라이브 다운로더 구축(1부)

2024-11-08에 게시됨
검색:983

Building a Google Drive Downloader in Golang (Part 1)

소개

이 튜토리얼에서는 Google 드라이브 및 기타 클라우드 제공업체에서 파일을 다운로드할 수 있는 강력한 다운로더를 구축하겠습니다. Golang의 효율적인 동시성 패턴을 사용하면 여러 다운로드를 동시에 관리하고, 대용량 파일을 스트리밍하고, 진행 상황을 실시간으로 추적할 수 있습니다. 몇 개의 작은 파일을 다운로드하든 대규모 데이터 세트를 처리하든 이 프로젝트에서는 여러 클라우드 플랫폼을 지원하도록 쉽게 확장할 수 있는 확장 가능하고 강력한 다운로더를 구축하는 방법을 보여줍니다.

대용량 파일 다운로드를 단순화하고 자동화하는 방법을 찾고 있다면 이 튜토리얼이 적합합니다. 결국에는 필요에 맞게 유연하고 사용자 정의 가능한 Go 기반 다운로더를 갖게 됩니다.

급하게?

이 다운로더를 UI와 함께 사용하려는 경우, 전체 기사 및 Go Downloader의 Github를 읽으려면 revolutionasdev.com을 방문하세요. 빠르게 실행하는 데 필요한 문서를 찾을 수 있습니다.

당신이 배울 내용

  • Go 동시성 패턴:
    고루틴, 채널 및 뮤텍스를 사용하여 여러 동시 파일 다운로드를 효율적으로 처리하는 방법을 알아보세요.

  • 대량 다운로드 스트리밍:
    메모리와 시스템 리소스를 효과적으로 관리하면서 대용량 파일을 스트리밍하는 방법을 알아보세요.

  • 동시 파일 다운로드:
    파일을 동시에 다운로드하여 프로세스 속도를 높이고 성능을 향상시키는 방법을 이해합니다.

  • 실시간 진행 업데이트:
    다운로드 상태에 대한 실시간 피드백을 제공하기 위해 진행 상황 추적을 구현합니다.

  • 중단 및 취소 처리:
    진행 중인 다운로드 하나 또는 모두를 정상적으로 취소하는 방법을 알아보세요.

참고: 이 튜토리얼에서는 핵심 다운로드 논리에만 중점을 둡니다.

환경설정

무슨 일을 하기 전에 먼저 환경을 올바르게 설정하여 향후 잠재적인 버그를 방지하세요.

전제 조건

  • Go 설치
  • AIR 자동 재로드용
  • Makefile 복잡한 명령 실행
  • PostgreSQL 마이그레이션을 위한 Goose

Makefile 구성

다음을 사용하여 프로젝트 루트에 makefile을 만듭니다.

# Load environment variables from .env file
include ./.env

# To run the application
run: build
    @./bin/go-downloader

# Build the application
build:
    @go build -tags '!dev' -o bin/go-downloader

# Database migration status
db-status:
    @GOOSE_DRIVER=postgres GOOSE_DBSTRING=$(DB_URL) goose -dir=$(migrationPath) status

# Run database migrations
up:
    @GOOSE_DRIVER=postgres GOOSE_DBSTRING=$(DB_URL) goose -dir=$(migrationPath) up

# Roll back the last database migration
down:
    @GOOSE_DRIVER=postgres GOOSE_DBSTRING=$(DB_URL) goose -dir=$(migrationPath) down

# Reset database migrations
reset:
    @GOOSE_DRIVER=postgres GOOSE_DBSTRING=$(DB_URL) goose -dir=$(migrationPath) reset

상위 수준 폴더 구조 개요

go-downloader/
├── api
├── config
├── migrations
├── service
├── setting
├── store
├── types
├── util
├── .env
├── .air.toml
├── Makefile
├── go.mod
├── go.sum
└── main.go

환경 변수 설정

루트에 .env 파일을 생성하거나 원하는 대로 환경 변수를 처리합니다. joho/godotenv 패키지를 사용하겠습니다.

GOOGLE_CLIENT_ID
GOOGLE_CLIENT_SECRET
SESSION_SECRET=something-super-secret
APP_URL=http://localhost:3000
POSTGRES_USER
POSTGRES_PASSWORD
POSTGRES_DB

웹 서버 생성

이제 들어오는 모든 요청을 처리할 웹 서버 생성을 시작하겠습니다.

주의하세요! 이 가이드의 주요 부분은 여기에서 시작됩니다. 뛰어들 준비를 하세요!

API 레이어

시작하려면 api 폴더 api.go 및 Route.go 내에 다음 파일을 만듭니다.

Route.go 파일 설정

모든 API 경로가 여기에 정의됩니다. env 구성을 사용하는 NewRouter 구조체를 생성하여 모든 경로와 핸들러가 환경 변수에 액세스할 수 있도록 합니다.

package api

import (
    "github.com/gofiber/fiber/v2"
    "github.com/nilotpaul/go-downloader/config"
)

type Router struct {
    env       config.EnvConfig
}

func NewRouter(env config.EnvConfig) *Router {
    return &Router{
        env:      env,
    }
}

func (h *Router) RegisterRoutes(r fiber.Router) {
    r.Get("/healthcheck", func(c *fiber.Ctx) error {
        return c.JSON("OK")
    })
}

api.go 파일 설정

여기서 서버를 시작하기 전에 CORS, 로깅 등 필요한 모든 미들웨어를 추가하겠습니다.

type APIServer struct {
    listenAddr string
    env        config.EnvConfig
}

func NewAPIServer(listenAddr string, env config.EnvConfig) *APIServer {
    return &APIServer{
        listenAddr: listenAddr,
        env:        env,
    }
}

func (s *APIServer) Start() error {
    app := fiber.New(fiber.Config{
        AppName:      "Go Downloader",
    })

    handler := NewRouter()
    handler.RegisterRoutes(app)

    log.Printf("Server started on http://localhost:%s", s.listenAddr)

    return app.Listen(":"   s.listenAddr)
}

주요 진입점

이것은 전체에 대한 진입점 역할을 하는 main.go 파일의 메인 패키지입니다.

func main() {
    // Loads all Env vars from .env file.
    env := config.MustLoadEnv()

    log.Fatal(s.Start())
}

서버를 시작하고 테스트하기에 충분합니다.

서버 시작

air

그게 다야.?

테스트

curl http://localhost:3000/healthcheck

상태 200에서는 응답이 정상이어야 합니다.

공급자 저장소 만들기

필요한 경우 여러 클라우드 제공업체에 대한 지원을 추가하기 위한 확장 가능한 솔루션을 구현해야 합니다.

공급자 레지스트리 작업 중

// Better to keep it in a seperate folder.
// Specific only to OAuth Providers.
type OAuthProvider interface {
    Authenticate(string) error
    GetAccessToken() string
    GetRefreshToken() string
    RefreshToken(*fiber.Ctx, string, bool) (*oauth2.Token, error)
    IsTokenValid() bool
    GetAuthURL(state string) string
    CreateOrUpdateAccount() (string, error)
    CreateSession(c *fiber.Ctx, userID string) error
    UpdateTokens(*GoogleAccount) error
}

type ProviderRegistry struct {
    Providers map[string]OAuthProvider
}

func NewProviderRegistry() *ProviderRegistry {
    return &ProviderRegistry{
        Providers: make(map[string]OAuthProvider),
    }
}

func (r *ProviderRegistry) Register(providerName string, p OAuthProvider) {
    r.Providers[providerName] = p
}

func (r *ProviderRegistry) GetProvider(providerName string) (OAuthProvider, error) {
    p, exists := r.Providers[providerName]
    if !exists {
        return nil, fmt.Errorf("Provider not found")
    }

    return p, nil
}

ProviderRegistry는 모든 OAuth 공급자를 보유하는 중앙 지도 역할을 합니다. 공급자를 초기화할 때 공급자를 이 맵에 등록합니다. 이를 통해 서비스 전반에 걸쳐 등록된 제공업체의 기능에 쉽게 액세스할 수 있습니다.

이 작업은 나중에 표시됩니다.

공급자 저장소 초기화

제공된 환경 변수를 기반으로 공급자를 등록합니다.

func InitStore(env config.EnvConfig) *ProviderRegistry {
    r := NewProviderRegistry()

    if len(env.GoogleClientSecret) != 0 || len(env.GoogleClientID) != 0 {
        googleProvider := NewGoogleProvider(googleProviderConfig{
            googleClientID:     env.GoogleClientID,
            googleClientSecret: env.GoogleClientSecret,
            googleRedirectURL:  env.AppURL   "/callback/google",
        }, env)

        r.Register("google", googleProvider)
    }

    return r
}

여기에서 전체 기사를 읽어보세요.

마무리

우리는 프로젝트 구조 설정, Google OAuth 처리, 향후 확장을 위한 기반 마련과 같은 주요 구성요소를 다루면서 Go에서 Google 드라이브 다운로더의 토대를 마련했습니다. 그 과정에서 우리는 몇 가지 중요한 주제를 다루었습니다:

  • Goose를 통한 데이터베이스 마이그레이션으로 원활하고 확장 가능한 데이터 관리가 보장됩니다.
  • 향후 추가 클라우드 스토리지 제공업체에 대한 지원을 쉽게 확장할 수 있도록 제공업체 레지스트리를 구축합니다.
  • 향후 더욱 복잡한 로직을 쉽게 처리할 수 있는 유연한 아키텍처를 설계합니다.

글이 꽤 길어져서 포스팅 하나면 충분합니다! 2부에서 다시 돌아와 작업을 마무리하고 주요 다운로드 기능을 다루겠습니다.

그때까지는 내 GitHub에서 현재 구현을 자유롭게 살펴보고 다음 단계를 계속 지켜봐 주시기 바랍니다. 즐거운 다운로드 되세요!

릴리스 선언문 이 기사는 https://dev.to/evolvedev/building-a-google-drive-downloader-in-golang-part-1-3fmk?1에 복제되어 있습니다. 침해가 있는 경우에는 [email protected]으로 문의하시기 바랍니다. 그것을 삭제하려면
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3