(後編) 運営している家計簿サービスに新機能を搭載して大幅リニューアルしました

前編の記事では、リニューアル経緯や新機能の紹介を主にしました。後編ではSUMUMAで使われている技術の知識や、開発環境などについて紹介していきます。
技術知識や開発ノウハウのインプットとしてや、これから個人開発を考えている方など多くの方の役立てたらと思います。

前編をまだお読みになっていない方は、ぜひご覧ください！
[(前編) 運営している家計簿サービスに新機能を搭載して大幅リニューアルしました](https://qiita.com/nisyuu/items/4fc5b221c5b6466d4a1b)

前編で既に紹介済みですが、もう一度SUMUMAのリンクを共有させていただきます。

[SUMUMA](https://sumuma.com/lp/general/)
![スクリーンショット 2022-08-07 9.44.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243199/c102cadd-63a0-905e-df6d-108a1cc0135d.png)


# SUMUMA開発の技術スタック

## SUMUMA実行環境
SUMUMAは前身であったDAIFUKU時代からDjangoで開発されています。UIについては元々[Semantic UI](https://semantic-ui.com/)で実装していたのですが、途中から[Tailwind CSS](https://tailwindcss.jp/)へと移行しました。

サーバーは[ConoHa VPS](https://www.conoha.jp/vps/)を使用しており、Djangoの実行環境は自前で構築しています。以前noteにて手順を公開していたので、同じ通りに環境を立ち上げました。

https://note.com/nisyuu/n/n47f172912b7b

ConoHaはVPSサーバーだけでなく、メールサーバー、DBサーバーなども揃っています。どれもコスパが良くレンタルしやすいので、非常におすすめなホスティングです。UIも優れていてスマホアプリもあるところが非常にいいです。

[ConoHa](https://www.conoha.jp/)

## 開発環境
エディタはJetBrainsの[PyCharm](https://www.jetbrains.com/ja-jp/pycharm/)を使っています。PyCharmは有料のProfessional版と無料のCommunity版があるのですが、ウェブ開発やPythonウェブフレームワークをサポートしているProfessional版を購入して使用しました。
PyCharmであれば、Djangoなどのウェブフレームワークを簡単に実行する環境やPython Console、Djangoの管理コマンド実行環境まで開発を快適に進めるための機能が多く揃っています。

CI/CDはGitHub Actionsを使用し、開発体験も向上させています。
これまでデプロイはファイル共有ソフトを使って作業をしていました。エンジニアたるものけしからんですが、自動化ができていませんでした。今回はリニューアルと同時に自動デプロイの仕組みを構築したので、わざわざサーバーにファイルをアップロードしなくても`main`ブランチにマージを行えば自動でアップロードできます。デプロイにはGitHub Actionsを使っており、デプロイ後の`migrate`や`collectstatic`実行からミドルウェアの再起動までも自動で行うようにしています。
これにより、大きな修正も軽微な修正も比較的迅速に安全にデプロイすることができるようになりました。

# 開発Tips
今回のリニューアルでは、長期的な開発コストを下げることと、メンテナンス性の向上も焦点に開発をしました。これまでは、ソースコードのデプロイが自動化されていなかったことや、可読性の低いコードを書いてしまっていたことで開発体験を損なっていました。開発体験の低下は開発への意欲を下げ、コストの増加にもつながってしまいます。
SUMUMAになってから新しく導入したサードパーティや機能がいくつかあります。その他にも知っておくと便利なパッケージもあるので、SUMUMAで使われているものの一部をご紹介します。

## Poetry
Pythonのパッケージ管理は`pip`が一般的だったのですが、最近は[Poetry](https://python-poetry.org/)というパッケージ管理がよく使われるようになってきました。`pip`はパッケージの依存関係が維持できなくバージョン更新時にエラーが発生するということが起きやすかったのですが、`Poetry`は依存関係を考慮してくれるため、バージョンアップによるエラー発生を抑えることができます。

## キャッシュ
Djangoは独自のキャッシュ機構を備えており、RedisやMemcachedと連携させることもできますが、データベースにページのキャッシュをすることもできます。
SUMUMAでは[サイトのトップページ](https://sumuma.com/)と[LP](https://sumuma.com/lp/general/)でキャッシュを使用しており、データベースに保存しています。

### 設定方法
キャッシュをDjangoが使用するデータベースに保存する場合は、`settings.py`にキャッシュの設定と、下に続くコマンドで作成が可能です。

```py:setting.py
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
        'LOCATION': 'cache_table',
    }
}
```

```
python manage.py createcachetable
```

### 実装の仕方

#### 特定のページ
一部のページをキャッシュする場合は、`urls.py`のパスに`cache_page()`を追加することで可能になります。

```py:urls.py
from django.views.decorators.cache import 

urlpatterns = [
    path('', cache_page(60 * 15)(views.Top.as_view()), name='top'),
]
```

Djangoプロジェクト全体やテンプレートの一部だけをキャッシュすることもできます。
詳細はDjangoの公式サイトをご覧ください。

[Django’s cache framework](https://docs.djangoproject.com/en/4.0/topics/cache/)

## DjangoでTailwind CSSを使う方法
DjangoプロジェクトでTailwind CSSを使用するのに、非常に利便性の高いパッケージがあります。
[django-tailwind](https://django-tailwind.readthedocs.io/en/latest/installation.html)というもので、Tailwind CSSの環境を簡単に用意することができます。
インストール後の設定も簡単で扱いやすい印象でした。

## デザイン実装
画面を実装していく際に、どういったデザインにするか悩ましい種でもあります。個人開発ではなおさらではないでしょうか。
SUMUMAでは何度かお伝えしている通り、Tailwind CSSを採用しています。Tailwind CSSは最近ホットなCSSフレームワークの一つでもあるので、調べると参考になりそうなサイトやテンプレートデザインが豊富に出てきます。

実際に参考にしていたサイトをご紹介します。

- [tailwindcss](https://tailwindcss.com/)
    - Tailwind CSSの書き方を調べることができます
- [Tailwind Toolbox](https://www.tailwindtoolbox.com/)
    - テンプレートデザインやコンポーネント化されたデザインを参考にできます

## 環境変数
どのプロジェクトにもよくあることだと思いますが、git管理をしたくないようなシークレットな情報があります。そういった場合、Djangoには[django-environ](https://django-environ.readthedocs.io/en/latest/)というシークレット情報を環境変数として管理できるパッケージがあります。

## Notionの活用
お知らせページについては、Djangoプロジェクトに持たせずNotionで管理することにしました。

[お知らせページ](https://nisyuu.notion.site/d42d24d8f881422da25b420733924be5?v=d7d5d2f5831a45d9820c4e6d64a3962c)

利用規約やプライバシーポリシーなどもNotionで管理することで、開発コストを極力抑えられるようになっています。

# まとめ
以上で、前編と後編に分けてリニューアルしたSUMUMAをご紹介してきました。
**ただの家計簿で終わらせない、家計簿をもっと賢く美しく**というスローガンでまだまだ開発を続けていく所存ですので、どうぞよろしくお願いします。

Twitterにてお知らせを随時告知しているので、ぜひフォローをよろしくお願いします！
[SUMUMA 公式Twitterアカウント](https://twitter.com/sumumacom)

最後までご覧いただきありがとうございました:bow_tone2: