This blog documents my hands-on experience logs
rodoの技術的な話
目次 はじめに 使用した技術スタック一覧 アプリケーション ディレクトリ構成 golang 1.ルーティング(main.go) 2.アプリケーション機能(handler.go) 3.データベース(mysql.go) サービス基盤 Docker kubernetes おわりに はじめに 前回の[ルーム型To-Doアプリを作ってみた]の技術スタックについてまとめていきます。 以下はRodoのgithubリポジトリになります。 https://github.com/szakky/rodo 使用した技術スタック一覧 使用言語: Go, HTML DB: MySQL インフラ: docker ,kubernetes ,cloudflare アプリケーション ディレクトリ構成 ├── db/ │ └── mysql.go ├── templates/ │ ├── room.html │ └── top.html ├── docker-compose.yml ├── dockerfile ├── handler.go └── main.go golang 1. ルーティング(main.go) ここでは、アプリケーション機能をどのようにしてルーティングしているか説明していきます。 package main import ( "database/sql" "log" "net/http" "todo-api/db" _ "github.com/go-sql-driver/mysql" ) var conn *sql.DB func main() { var err error conn, err = db.Connect() if err != nil { log.Fatal("db error:", err) } defer conn.Close() //kill db connect if err = conn.Ping(); err != nil { log.Fatal("db error:", err) } log.Println("db connected") log.Println("ready") http.HandleFunc("/", topPage) http.HandleFunc("/room/", roomPage) http.HandleFunc("/add", add) http.HandleFunc("/update", updateTask) http.HandleFunc("/delete", deleteTask) http.HandleFunc("/delete-all", deleteAll) log.Println("waiting for requests...") http.ListenAndServe(":8080", nil) } todo-api/db パッケージは次のmysql.go をインポートしています。グローバル変数conn は、*sql.DB dbの接続情報が入っています。todo-api/db パッケージを使って、データベースと接続し、結果として接続情報(conn)と、エラー(err)を受け取ります。db.Connect() が成功しても、ネットワークの問題で通信ができないこともあるので、conn.Ping() で通信ができるかチェックします。http.HandleFunc()は、URLのパスに対して、どの関数を実行させるか設定しています。これでhandler.go のアプリケーション機能を呼び出しています。そして、http.ListenAndServe() でポート番号8080 番のサーバーを起動させ、アクセスを待つ状態にします。 ...
ルーム型To-Doアプリを作ってみた
目次 はじめに 開発経緯 具体的な使い方 トップページとルーム作成 ルームページとタスクの追加 タグとメモ入力 その他の活用事例 実装とアプリケーション基盤 Dockerによるイメージ化 Kubernetesでのデプロイ 開発で苦労した点と学び おわりに はじめに こんにちは。今回、個人開発で作成したルーム型To-Doアプリ"Rodo"について紹介していきます。 RodoのURL: https://rodo.yashiro.org 開発経緯 一般的なTo-doアプリは、個人を識別するためにアカウントの作成・認証が必要になります。 サクッと複数人でタスク管理したい場合は、アカウントの作成・認証に時間がかかり不便と感じることが多くありました。 そこで、ルーム名を入力するだけで「早く」「簡単に」「誰でも」作って共有できるTo-Doアプリを開発しようと考えました。 チームメンバーや他の人にルーム名を共有し、チームでのプロジェクト管理や、複数人でのタスク管理にも有用です。 具体的な使い方 本アプリは、シンプルかつ迷わず使えるUIを意識して設計しています。 トップページとルーム作成 トップページにはルーム名を設けています。 ここで入力した文字列がそのまま「ルーム名」となり、新しいルームが作成されます。次回以降も同じ文字列を入力するだけで、すぐに同じルームにアクセスできる手軽な仕組みにしました。これにより面倒なユーザー登録なしで、すぐに使い始められます。 ルームページとタスクの追加 ルームに入ると、共有されているタスク一覧が表示されます。 「読書」や「運動」など毎日の作業を、直感的な操作でどんどん追加していくことができます。 タグとメモ入力 単にタスク一覧を表示するだけでなく、それぞれのタスクに「タグ」と「メモ」を追加できるようにしています。 これにより、タスクのジャンル分け(例:「日課」「家事」など)や、メモにちょっとした備忘録を残すことができます。 その他の活用事例 以下のように学校のグループワークをする際に作業分担を管理する時にも有用です。 実装とアプリケーション基盤 バックエンドからフロントエンドまで、できるだけシンプルな構成を目指しました。 アプリケーション基盤は、dockerやkubernetesを活用して構築しています。 Dockerによるイメージ化 開発に使っているPC上で docker build を行い、アプリケーションのコンテナイメージを作成しています。イメージは、そのまま Docker Hub 上に push して保管しました。 Kubernetesでのデプロイ 用意したマニフェストファイル(DeploymentやServiceなど)をkubectl apply -f コマンドでデプロイしています。 詳しい実装とアプリケーション基盤に関しては別の記事で紹介する予定です。 開発で苦労した点と学び 今回の開発を通して苦労した点は「Goにおけるルーティング(URL)の設計」です。 開発の初期段階では、トップページを /topPage、ルーム画面を /roomPage といった具合に、画面の種別に依存したURL設計をしていました。しかし、実装を進めるうちに「もっと自然で直感的なURL構造にすべきだ」と考え、トップページを / に、ルーム画面を /room/(設定したルーム名) となるように設計を変更しました。これにより、URLを見ただけでどのルームにいるのかが分かる直感的なURL設計に改善できました。 さらにデータの扱い方も見直しました。。Go側で .Query().Get(“room_id”) を使用してリクエストからルーム名を取得し、それをキーにしてMySQLからタスクや情報を取得するように実装しています。URL設計からデータベースとの連携まで、初期段階から大きくコードを改善できたのは個人的にも良い経験になりました。 ...