feature image

2021年12月25日 | ブログ記事

Go初心者が「アプリ作っちゃうか〜」ってなった時に悩むやつ(バックエンドディレクトリ構造)

この記事はtraP Advent Calendar 2021 28日目の記事です。

この記事では、わかりやすさを重視しているため、正確性に欠けることがあります。

あなたは誰? : いろり(@irori).sysAd班,グラフィック班
できること : golang(歴1年弱)
できないこと : フロントエンド全般

はじめに

言語を理解するためには、何か一つアプリを作るといいと言われます。
しかし、初心者がアプリを作る上で壁になるのが「どういう(ディレクトリ)構成にすればいいんですか」問題です。

分からないからといって、ググってもよく分からないのが事実。(ググり方が分からないのもある)
ので、この記事では手取り早く開発に移れるように、最低限のディレクトリ構造を説明していきますよ~

構成

(私が見聞きした限り)こういう感じになります

├model
├router
├.gitignore
├readme.md
├go.mod
 └go.sum
├main.go
└README.md

解説

私がtraPのハッカソンのレポジトリーを見て回った限り、「軽くアプリを作ってみよう」というレベルでは、router/modelに分けることが多いようです。ハッカソンで行われる一週間徹夜限界開発が「軽く」にあたるのかは諸説あり、です。

router

apiリクエストを書きます。
加えてapiで叩かれたデータが構造的に正しいか確認したり、データを加工して、modelに書かれている関数を呼び出します。

model

DBを操作して、データを参照したり、挿入したりする関数を書きます。この関数はrouterで呼び出されます。
またdb.goを置きます。ここにdbとの接続をする関数を書き、main.goで呼び出します。

main.go

golangのmain関数が入っています。
main関数が最初に実行されます。リポジトリの他のコードや関数は、main関数の中で呼び出されるに過ぎません。

.gitignore

githubでリポジトリを作るときに、add .gitignoreにチェックを付け、templateで使用する言語を選択します。(ex..gitignore template :go)
すると生成時に勝手に作成してくれます。

リポジトリを作成する際にチェックを入れ忘れた場合は、golangで書かれているバックエンドのレポジトリにあるものをコピペしてこれば良いと思います。
書式は難しくありませんが、どれを.gitignoreに加える/加えないのかの判断は初心者には難しいと思うので、素直にコピペするのが楽です。

readme.md

これもgithubでリポジトリを作成する際に、add README.mdにチェックをつけると自動で作成されます。

リポジトリの説明をMarkdownで書きます。readme.mdをプロジェクトのルートに置いておくと、githubでいい感じに表示してくれます。↓こんな感じ

これはtraQのreadme.md。かっこいい!

Markdownの説明はここにあります。手軽にそこそこ整っているページを作れるのでよく使われています。情報系に進むなら、書けるようになって損はないと思います。

go.mod

リポジトリのルートで

$go mod init

を打ちます
すると

go mod tidy

を打ってくれ、と言われるので打ちます。go.modというファイルが自動で生成されます

go.sum

gormとかを使いたくなった時に、先ほどと同じくリポジトリのルートで

$go get ライブラリ

を打ちます
(gormの場合はgo get gorm.io/gorm)といった具合です
このgorm.io/gormは「go get 名前(gormとか)」でググったら出てくると思います

これをしないと、いくらimport文に書いても、エラーが出ると思います。

そして最後に

$go mod tidy

を打ちます。すると自動でgo.sumのファイルが作成されます。定期的に、go mod tidyをすると、勝手にいい感じに編集してくれるので便利です。

余談

こういうの(traQ)を最初から真似しようとすると痛い目をみます(私)
ディレクトリ構造を極めようとすると、アーキテクチャの勉強が関わってきますが、初心者にはハードルが高いと聞きました。最近よく聞くクリーンアーキテクチャはこのページに詳しく載っています(英語)。

いかがでしたか

次のSwanさんの記事はこちらです

irori icon
この記事を書いた人
irori

SysAd班、アルゴリズム班(Kaggle)とグラフィック班で活動しています

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

2021年8月12日
CPCTFを支えたWebshell
mazrean icon mazrean
2021年5月19日
CPCTF2021を実現させたスコアサーバー
xxpoxx icon xxpoxx
2023年3月13日
GoでWebSocketのテスト書く
Ras icon Ras
2022年4月5日
アーキテクチャとディレクトリ構造
mazrean icon mazrean
2021年12月8日
C++ with JUCEでステレオパンを作ってみた【AdC2021 26日目】
liquid1224 icon liquid1224
2021年5月16日
CPCTFを支えたインフラ
mazrean icon mazrean
記事一覧 タグ一覧 Google アナリティクスについて