【ITニュース解説】🚀 Updating and Deleting Tasks in Our .NET + PostgreSQL Todo API
2025年10月02日に「Dev.to」が公開したITニュース「🚀 Updating and Deleting Tasks in Our .NET + PostgreSQL Todo API」について初心者にもわかりやすく解説しています。
ITニュース概要
.NETとPostgreSQLで開発中のTodo APIに、タスクの更新(PUT)と削除(DELETE)機能を追加した。これにより、APIがデータの作成・読み込み・更新・削除(CRUD)を完全に実行できるようになった。具体的なコード例とPostmanでの動作確認方法を解説。また、データベースの接続情報はセキュリティのため環境変数で管理すべきだと述べた。
ITニュース解説
この解説では、これまで作成してきたタスク管理API(アプリケーションプログラミングインターフェース)に、既存のタスクを更新する「Update」と、不要なタスクを削除する「Delete」の機能を追加する方法について詳しく見ていく。これにより、タスクを作成(Create)し、読み込む(Read)だけでなく、更新と削除も可能になり、APIは「CRUD」(Create, Read, Update, Delete)という基本的なデータ操作のすべてを実行できるようになる。システム開発において、CRUDはデータ管理の根幹をなす非常に重要な概念だ。
本題に入る前に、セキュリティに関する重要な注意点がある。これまでの開発で、データベース接続のためのユーザー名やパスワードといった認証情報を、appsettings.jsonという設定ファイルに直接書き込んでいたが、これは決して推奨される方法ではない。もしこのファイルをバージョン管理システム(GitHubなど)に公開してしまうと、誰でもデータベースにアクセスできる情報が漏洩してしまう危険性があるためだ。この問題への対処法として、データベースの認証情報を「環境変数」として管理する方法も合わせて解説する。これにより、重要な情報を安全に保ちながら開発を進めることができるようになる。
まず、タスクを更新する「Update」機能の実装から始めよう。更新とは、すでに存在するタスクのタイトルや完了状態といった情報を変更することだ。例えば、「牛乳を買う」というタスクのタイトルを「特売の牛乳を買う」に変更したり、完了していないタスクを完了済みにしたりする操作がこれにあたる。
APIでは、PUTというHTTPメソッドを使って更新処理を行う。具体的なコードの例は、C#のASP.NET Coreというフレームワークを使って書かれている。app.MapPut("/api/tasks/{id}", ...)という部分が、APIのエンドポイントを定義している。これは、「/api/tasks/の後にタスクのIDが続くURLにPUTリクエストが送られたら、この処理を実行する」という意味だ。例えば、/api/tasks/3というURLにリクエストを送ると、IDが3のタスクが対象となる。
この処理の中では、まずデータベースから更新したいタスクを探し出す必要がある。コードではawait db.Tasks.FindAsync(id);という部分がその役割を担っている。dbはデータベースへのアクセスを管理するオブジェクトで、Tasksはタスクの集合を表している。FindAsync(id)は、指定されたIDに合致するタスクをデータベースから非同期に検索するメソッドだ。もし指定されたIDのタスクが見つからなかった場合、APIはResults.NotFound()を返して、タスクが見つからなかったことをクライアントに伝える。これは、HTTPのステータスコードで言うと「404 Not Found」に相当し、リクエストされたリソースが存在しないことを意味する。
タスクが見つかったら、次にそのタスクの情報を更新する。toBeUpdated.Title = updatedTask.Title;やtoBeUpdated.IsComplete = updatedTask.IsComplete;という行で、リクエストで送られてきた新しい情報(updatedTask)を、データベースから取得した既存のタスク(toBeUpdated)のプロパティに代入している。これで、タスクのデータがメモリ上で更新された状態になる。
最後に、この変更をデータベースに永続化する必要がある。await db.SaveChangesAsync();というメソッドを呼び出すことで、メモリ上で行われた変更が実際にデータベースに反映される。この一連の処理によって、既存のタスクが正常に更新されることになる。更新が成功した場合、APIはResults.Ok(toBeUpdated);を返して、更新されたタスクの情報をクライアントに送り返す。これはHTTPのステータスコード「200 OK」を意味し、リクエストが正常に処理されたことを示す。
次に、タスクを削除する「Delete」機能の実装を見ていこう。削除は更新よりもシンプルな処理で、特定のタスクをデータベースから完全に消去する機能だ。
削除機能もDELETEというHTTPメソッドを使って実装する。app.MapDelete("/api/tasks/{id}", ...)という部分が、そのAPIエンドポイントを定義している。更新の場合と同様に、/api/tasks/の後にタスクのIDが続くURLにDELETEリクエストが送られると、この処理が実行される。
削除処理の中では、まず削除したいタスクをデータベースから探し出す。ここでもawait db.Tasks.FindAsync(id);が使われ、指定されたIDのタスクを検索する。もしタスクが見つからなければ、更新の場合と同様にResults.NotFound()を返して、タスクが見つからなかったことを伝える。
タスクが見つかったら、それをデータベースから削除する。db.Tasks.Remove(task);という行で、見つかったタスクオブジェクトをデータベースの集合から削除するよう指示する。この時点ではまだメモリ上の操作であり、実際にデータベースからデータが消えたわけではない。
最後に、ここでもawait db.SaveChangesAsync();を呼び出すことで、削除の変更をデータベースに反映させる。これにより、指定されたタスクはデータベースから完全に除去される。削除が成功した場合、APIはResults.Ok(new { message = $"Task {id} deleted" });を返し、タスクが削除されたことを示すメッセージをクライアントに送る。
これらの更新と削除の機能が正しく動作するかは、「Postman」のようなAPIテストツールを使って確認できる。例えば、タスクを更新する際には、http://localhost:5001/api/tasks/1というURLに対してPUTリクエストを送り、リクエストボディに更新したいタスクのタイトルと完了状態を含める。同様に、タスクを削除する際には、同じURLに対してDELETEリクエストを送るだけでよい。これらの操作を実行すると、APIがデータベースのタスクを適切に更新したり、削除したりする様子を確認できるだろう。
そして、先ほど触れたデータベース認証情報の安全な管理について、具体的な方法を説明する。appsettings.jsonに直接記述する代わりに、Program.csというアプリケーションの初期設定を行うファイルで、環境変数を読み込むように設定する。具体的には、builder.Services.AddDbContext<AppDbContext>(options => options.UseNpgsql(Environment.GetEnvironmentVariable("PG_CONNECTION")));という記述を使うことで、PG_CONNECTIONという名前の環境変数からデータベースの接続文字列を取得するようになる。
この環境変数は、アプリケーションを実行するシェル(コマンドプロンプトやターミナル)で事前に設定しておく必要がある。例えば、LinuxやmacOSのシェルであればexport PG_CONNECTION="Host=localhost;Database=todo_db;Username=postgres;Password=supersecret"といったコマンドを実行する。Windowsであれば、設定方法が異なるが、同様に環境変数を設定できる。このようにすることで、ソースコードや設定ファイルに直接機密情報を書き込むことなく、アプリケーションにデータベース接続情報を提供できるため、GitHubなどの公開リポジトリに誤ってパスワードを漏洩させてしまうリスクを回避できる。これは、実際のシステム開発において非常に重要なセキュリティ対策の一つだ。
今回の開発によって、タスク管理APIはデータの作成、読み込み、更新、削除という基本的な機能のすべてを備えることになった。これは、あらゆるWebアプリケーションやサービスを構築する上で不可欠な要素であり、システムエンジニアとして最初の一歩を踏み出す上で非常に価値のある経験となるだろう。さらに、データベースの認証情報を安全に管理する方法を学んだことで、よりセキュアなアプリケーション開発への理解も深まったはずだ。もし、これらの断片的なコードだけでなく、完成したアプリケーション全体のコードや、それに連携するフロントエンド(ユーザーインターフェース)のコードを見てみたい場合は、記事に示されているGitHubリポジトリを参照すると、より実践的な学びが得られるだろう。