0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Go言語のサービス層設計 - DBコネクションの効率的な管理方法

Posted at

Goにおけるサービス層とデータベース接続の最適な設計パターン

こんにちは!フリーランスエンジニアのこたろうです。

サービス層の設計とデータベース操作について、実践で得た知見を共有します。

サービス層の責務

  • ユーザーリクエストのデータベース操作への変換
  • ビジネスロジックの実装
  • データベースから取得したデータのハンドラ層用整形

非推奨パターンと推奨パターン

非推奨:頻繁なDB接続

// 非推奨パターン
func (s *Service) GetPost(id int) (*Post, error) {
    db, err := sql.Open("postgres", "connection-string")
    if err != nil {
        return nil, err
    }
    defer db.Close()
    // ...
}

推奨:構造体でのDB保持

package services

import "database/sql"

// サービス構造体の定義
type MyAppService struct {
    db *sql.DB
}

// コンストラクタ
func NewMyAppService(db *sql.DB) *MyAppService {
    return &MyAppService{db: db}
}

// サービスメソッド
func (s *MyAppService) PostArticleService(article models.Article) (models.Article, error) {
    newArticle, err := repositories.InsertArticle(s.db, article)
    if err != nil {
        return models.Article{}, err
    }
    return newArticle, nil
}

設計のポイント

  1. sql.DBの接続は初期化時に1回のみ実行
  2. DBコネクションをサービス構造体で保持・再利用
  3. サービス層はデータ整形とビジネスロジックに集中
  4. コネクション管理の一元化

この設計により、保守性の高い効率的なアプリケーション構造を実現できます。

参考文献

-『Goで作るはじめてのWebアプリケーション改訂版』技術書典

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?