Webアプリケーション作成のための10ステップ　3. バックエンド開発

# この記事を書いたきっかけ

この記事では、Webアプリケーションエンジニアに必要なスキルを具体的に解説し、その学び方を示します。

Webアプリケーション作成に必要なスキルを10個にまとめ、一つずつ学ぶ目的と手段を整理したいと思います。今回は**バックエンド開発**について書きます。

### この記事を書いた目的
- webアプリケーションエンジニアになりたい
- そのために、自分に足りないものは何かを知りたい
- すぐに行動に移すために、学ぶ目的と手段を具体化したい
- webアプリケーションエンジニアに必要なスキルを全て把握したい
- 今、自分はなんのために、何を学んでいるのか、見失わないようにしたい


***
こちらの記事が大変参考になります

https://qiita.com/poly_soft/items/fb649573c19b7a5c0227

# Webアプリケーション作成のための10ステップ
1. プログラミング言語の習得
1. フロントエンド開発
1. バックエンド開発
1. バージョン管理
1. 開発ツールと環境
1. セキュリティ
1. デプロイメントとクラウド
1. テスト
1. アーキテクチャの知識
1. ソフトスキル

# 3. バックエンド開発
バックエンドとは、データ処理とビジネスロジックを担当するサーバー側の仕組みを指します。一方、フロントエンドはユーザーインターフェース（UI）やユーザー側が直接操作する部分を担当します。この二つが連携することで、完全なWebアプリケーションが成り立ちます。
# バックエンド開発とは何か（What）
バックエンド開発では、Webアプリケーションのサーバーサイドの処理を実装します。サーバーサイドとは、WebアプリケーションやWebサービスにおいて、**ユーザーのリクエストに応じて処理を行うサーバー側のシステムやロジックのこと**を指します。


クライアントサイド（ユーザーが操作するブラウザなどの端末）からのリクエストを受け取り、必要な処理を行って結果を返す役割を担っています。例えば、データベースとのやり取りやビジネスロジックの実装、認証や認可、APIの提供などを行います。

### 知っておきたいサーバーサイドの流れ

**リクエストの受信**
ユーザーがブラウザから特定のURLにアクセスすると、そのリクエストがサーバーに送信されます。

**リクエストの処理**
サーバーは受信したリクエストを解析し、適切な処理を行います。この処理には、データベースへの問い合わせやビジネスロジックの実行が含まれます。

**レスポンスの生成**
処理が完了すると、その結果をもとにレスポンスを生成します。レスポンスは、HTMLやJSONなどの形式でクライアントに返されます。

**レスポンスの送信**
サーバーは生成したレスポンスをクライアントに送信します。クライアントは受信したレスポンスをもとに画面を更新します。


### バックエンド開発で使用される技術
**バックエンド言語**
- Python
- Ruby
- PHP
- JavaScript（Node.js）
- Java
- C#
- Go
- Rust

**フレームワーク**
- Django（Python）
- Ruby on Rails（Ruby）
- Laravel（PHP）
- Express（Node.js）
- Spring Boot（Java）
- ASP.NET Core（C#）
- Gin（Go）
- Actix（Rust）

**API開発**
- RESTful API：HTTPを使用したリソースベースのAPI設計
- GraphQL：クエリ言語を使用した柔軟なデータ取得と操作

# バックエンド開発を勉強する理由（Why）
バックエンド開発を学ぶのは、データの処理や管理、ビジネスロジックの実装、外部サービスとの連携を行うためです。これらのスキルを習得することで、効率的でスケーラブルなWebアプリケーションを構築することができます。

### 1. データ管理
ユーザー情報やアプリケーションのデータを効率的に管理・操作するために、データ管理を行います。

#### なぜデータ管理が重要か？
データはWebアプリケーションの基盤です。ユーザー情報、商品情報、取引履歴など、アプリケーションで扱うすべての情報がデータベースに保存されます。データの管理が適切でないと、アプリケーションとしての信頼性を失ってしまいます。また、パフォーマンスにも大きな影響を与えます。なので、データ管理の学習が必須になります。
#### 具体的な学び方
**リレーショナルデータベース（RDBMS）の習得**
MySQL、PostgreSQL、SQLiteなどのデータベースを学びます。SQL（Structured Query Language）を使ってデータの作成、読み取り、更新、削除（CRUD操作）を行います。

**NoSQLデータベースの習得（必要であれば）**
MongoDB、Firebaseなどのドキュメント指向データベースを学びます。NoSQLデータベースは拡張性に優れていて、大量のデータを効率的に扱うことができます。

**データベース設計**
データの正規化、ER図（エンティティリレーションシップ図）の作成、インデックスの設計などを学びます。効率的で拡張性のあるデータベースを構築するのに、データベース設計の技術が必要不可欠です。

### 2. ビジネスロジックの実装
ユーザーの操作に対する処理や計算を行うロジックをサーバーサイドで実装します。

#### なぜビジネスロジックが重要か？
ビジネスロジックは、アプリケーションの核となる部分です。ユーザーの操作に対する具体的な処理や計算を行うロジックをサーバーサイドで実装します。ユーザーが入力したデータを適切に処理し、期待する結果を返す処理を考えます。

#### ビジネスロジックの実装のために具体的に学ぶこと
**概念の理解**：[「ビジネスロジック」とは何か、どう実装するのか](https://qiita.com/os1ma/items/25725edfe3c2af93d735)
**プログラミング言語**：Python、Ruby、PHP、JavaScript（Node.js）などのサーバーサイド言語を習得します。
**フレームワーク**：Django（Python）、Rails（Ruby）、Laravel（PHP）、Express（Node.js）などのWebフレームワークを学びます。フレームワークはビジネスロジックの実装を効率化してくれます。
**設計パターン**：MVC（Model-View-Controller）パターンやその他のデザインパターンを学びます。

### 3. API
他のアプリケーションやサービスと連携するためのAPIを作成する技術もバックエンド開発には必要です。異なるソフトウェアシステム間でデータや機能をやり取りするためのインターフェースを設計・構築します。

#### APIとは何か？
API（Application Programming Interface）とは、異なるソフトウェアアプリケーション間でデータや機能をやり取りするためのインターフェースのことです。

#### なぜAPIが重要か？
APIのおかげで、開発者は他のシステムやサービスの機能を簡単に活用することができ、また自分のアプリケーションの機能を外部に提供することができます。

#### APIの提供の具体例
企業が自社のサービスに対してAPIを公開し、外部の開発者がそのAPIを使ってデータを取得したり、サービスを操作できるようにする。
例: Twitterが公開しているAPIを使って、外部のアプリケーションがツイートの投稿や取得を行う。

#### API連携の具体例
自社のアプリケーションが外部のAPIを利用して、追加の機能を実装する。
例: 自社のアプリケーションがGoogle Maps APIを利用して、地図表示やルート案内機能を提供する。

#### APIの利点
**抽象化**：複雑な内部処理を隠蔽し、シンプルなインターフェースを提供。
**再利用性**：一度作成したAPIは、他のプロジェクトやシステムで再利用可能。
**互換性**：異なるプラットフォームやプログラミング言語間での通信を容易にする。

#### API連携のために具体的に学ぶこと
**RESTful API**
RESTful APIとは、Webサービスを設計する際の一つのアーキテクチャスタイルで、HTTPメソッド（GET、POST、PUT、DELETE）を使ってリソースを操作します。データの作成、読み取り、更新、削除ができるようになります。

**GraphQL**
GraphQLとは、Facebookによって開発されたデータクエリ言語で、クライアントが必要とするデータを正確に取得するために使われます。APIの柔軟性と効率性が向上します。

**認証と認可**
認証と認可は、APIのセキュリティを確保するための技術です。認証はユーザーの身元確認を行い、認可はユーザーがどのリソースにアクセスできるかを制御します。

- **OAuth 2.0**：広く使われている認証フレームワークで、トークンベースの認証を提供します。ユーザーが他のサイトでログインしていることを証明し、APIにアクセスするためのトークンを発行します。
- **OpenID Connect**：OAuth 2.0の拡張で、認証とユーザー情報の取得を簡単にします。シングルサインオン（SSO）を実現できます。
- **JWT（JSON Web Tokens）**：ユーザー認証とデータの安全なやり取りに使われるトークン形式です。トークンには、署名されたユーザー情報が含まれており、セッション管理に使用されます。

# バックエンド開発に必要な技術を習得する方法（How）
### データ管理（データベース）の勉強
**基本概念**：データベースの基本的な構造や概念を学びます。テーブル、行、列、プライマリキー、外部キーなどの用語を理解します。
**SQLの習得**：SQL（Structured Query Language）を使ってデータベースを操作する方法を学びます。ローカル環境にデータベースをインストールして勉強することもできます。

### 1. バックエンド言語の習得
Python、Ruby、PHP、Node.jsなどのバックエンド言語を習得します。
**基本文法**：公式ドキュメントや入門書を使用して学ぶ。
**練習問題**：CodecademyやLeetCodeなど、プログラミング学習サイトで問題を解く。

### 2. フレームワークの習得
Django（Python）、Ruby on Rails（Ruby）、Laravel（PHP）、Express（Node.js）など、チュートリアルを試してみます。書籍を読みながらWebアプリ作成に挑戦してみると理解が早いです。

### 3. APIの習得
**RESTful API**
- 概念を学ぶ
    - [RESTful API とは](https://aws.amazon.com/jp/what-is/restful-api/)
    - [RESTful APIとは何なのか](https://qiita.com/NagaokaKenichi/items/0647c30ef596cedf4bf2)

**GraphQL**
- 概念を学ぶ
    - [GraphQL とは](https://www.redhat.com/ja/topics/api/what-is-graphql)
    - [GraphQL】今注目されているGraphQLって何? 【API】](https://qiita.com/kim_t0814/items/c6ef7e3c668007f920a6)

**認証と認可**
- 概念を学ぶ
    - [OAuthとOpenID Connectについて～仕組みや特徴など解説～](https://solution.kamome-e.com/blog/archive/blog-auth-20221108/)
    - [OAuthと認証と認可とOpenIDConnect](https://qiita.com/sgmryk/items/0f5734a2a6991a6a1873)

# 筆者が実際に勉強したこと（Try）
### 1. データ管理（データベース）
- Udemyでデータベース設計の講座を受講する（[はじめてのテーブル設計・データベース設計](https://www.udemy.com/course/hajimete-ronrisekkei/?couponCode=THANKSLEARNER24)）
- 基本情報技術者試験の「データベース」の勉強をする（書籍：[令和05年 イメージ＆クレバー方式でよくわかる 栢木先生の基本情報技術者教室 (情報処理技術者試験) ](https://www.amazon.co.jp/%E4%BB%A4%E5%92%8C05%E5%B9%B4-%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%EF%BC%86%E3%82%AF%E3%83%AC%E3%83%90%E3%83%BC%E6%96%B9%E5%BC%8F%E3%81%A7%E3%82%88%E3%81%8F%E3%82%8F%E3%81%8B%E3%82%8B-%E6%A0%A2%E6%9C%A8%E5%85%88%E7%94%9F%E3%81%AE%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85%E6%95%99%E5%AE%A4-%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%8A%80%E8%A1%93%E8%80%85%E8%A9%A6%E9%A8%93-%E6%A0%A2%E6%9C%A8/dp/4297131307)）
- 書籍を読む
    - [SQL 第2版: ゼロからはじめるデータベース操作](https://www.amazon.co.jp/SQL-%E7%AC%AC2%E7%89%88-%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%93%8D%E4%BD%9C-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%AD%A6%E7%BF%92%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E3%83%9F%E3%83%83%E3%82%AF/dp/4798144452)
    - [達人に学ぶDB設計徹底指南書: 初級者で終わりたくないあなたへ ](https://www.amazon.co.jp/%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6DB%E8%A8%AD%E8%A8%88-%E5%BE%B9%E5%BA%95%E6%8C%87%E5%8D%97%E6%9B%B8-%E5%88%9D%E7%B4%9A%E8%80%85%E3%81%A7%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%9F%E3%81%8F%E3%81%AA%E3%81%84%E3%81%82%E3%81%AA%E3%81%9F%E3%81%B8-%E3%83%9F%E3%83%83%E3%82%AF/dp/4798124702)
    - [図解まるわかり データベースのしくみ](https://www.amazon.co.jp/%E5%9B%B3%E8%A7%A3%E3%81%BE%E3%82%8B%E3%82%8F%E3%81%8B%E3%82%8A-%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E3%81%97%E3%81%8F%E3%81%BF-%E5%9D%82%E4%B8%8A-%E5%B9%B8%E5%A4%A7/dp/4798166057)

### 2.1 バックエンド言語
**Python**：paizaの講座を受講する（[Python入門講座一覧](https://paiza.jp/works/search_courses/2208)） → Webアプリを作成する → paizaで問題を解く（[レベルアップ問題集](https://paiza.jp/works/mondai)）
### 2.2 フレームワーク
**Django**：[公式チュートリアル](https://docs.djangoproject.com/ja/5.0/)をざっくり見る → paizaのDjango入門講座を受講する（[Webアプリ開発入門 Django編](https://paiza.jp/works/django/primer)） → Webアプリを作成する

### 3. API
自分の作成したWebアプリでWebAPIを外部から呼び出して利用しました。GoogleMapのAPIだったと思います。APIキーを使いました。

こちらの記事に近いことを実践しました。とても参考になります。
記事：[Google Maps API を使ってみた](https://qiita.com/Haruka-Ogawa/items/997401a2edcd20e61037)


# まとめ
バックエンド開発では、Webアプリケーションの重要な部分を開発しています。ただ、具体的に何をやっているかを説明することは難しいと思います。今回記事を書くことで、バックエンド側の技術がどういう類のものなのかを知ることができました。

Pythonなどのバックエンド言語を習得し、Djangoなどのフレームワークを使いこなすことだけでなく、データベース管理やAPI連携、認証機能など、多くの技術を組み合わせることで効率的なバックエンドシステムを構築できることがわかりました。

実務で必要となる技術は人それぞれなので、勉強する内容も人それぞれ変わりますが、
自分に足りない技術が、Webアプリのだいたいどの領域なのかを意識しながら、新しい技術についても勉強を進めていけるといいと思います。