【Java】基本のおさらい

# はじめに
アクセスしていただきありがとうございます。
本記事は、某SESに入社して初めて案件の面談を受けた際の質疑で、自分が答えられなかった内容を覚えておく備忘録として投稿します。

 
#### 投稿者の職務状況（念のため）
* 社会人5年目
* SE歴5年目
* 自社開発パッケージの導入2年
* 自社開発パッケージの開発2年
* 主に利用しているプログラミング言語：Java
* 基本情報、応用情報保持

# 質問内容
## アノテーションとは？（Springフレームワークを絡めて）
Javaにおけるアノテーション（annotation）は、コードにメタデータを追加するための機能です。アノテーションは、コードの実行時やコンパイル時に特定の処理を行うために使われます。たとえば、コードの意味を補足したり、特定のフレームワークやライブラリがコードを正しく処理できるようにするために利用されます。

アノテーションは、@ 記号で始まり、クラス、メソッド、フィールドなどに付加できます。以下はアノテーションのいくつかの例です：

* @Override：メソッドがスーパークラスのメソッドをオーバーライドしていることを示します。
* @Deprecated：メソッドやクラスが推奨されなくなったことを示します。
* @SuppressWarnings：コンパイラに特定の警告を無視するよう指示します。
* @Entity（JPAなどのライブラリで使用）：クラスがデータベースのエンティティであることを示します。


アノテーションは、特定のフレームワークやツールによって利用されることが多く、その処理や振る舞いはアノテーションを解析するためのリフレクションを使って実行されます。アノテーション自体は、コンパイラやランタイムに対する指示であり、コードの動作を変えるものではありません。


Springフレームワークではアノテーションが非常に重要な役割を果たしています。Springは、Javaのアプリケーションを構築するためのフレームワークであり、アノテーションを使って設定や依存関係の注入（DI）、トランザクション管理などを簡素化します。以下はSpringでよく使用されるアノテーションのいくつかです：

* @Component：クラスがSpringのコンポーネントであることを示し、Springによって自動的に管理される対象になります。
* @Service：@Componentの特殊化で、ビジネスロジックを提供するサービス層のクラスであることを示します。
* @Repository：@Componentの特殊化で、データアクセス層のクラスであることを示し、例外の変換などを行います。
* @Controller：MVCパターンにおけるコントローラクラスを示します。
* @RestController：@Controllerと@ResponseBodyを組み合わせたもので、RESTful Webサービスのコントローラを定義します。
* @Autowired：依存関係の注入を行うために使用され、Springが必要な依存オブジェクトを自動的に注入します。
* @Value：プロパティファイルから値をインジェクトするために使用します。
* @Configuration：クラスがSpringの設定クラスであることを示し、@Beanアノテーションを使ってBeanを定義します。
* @Transactional：メソッドやクラスにトランザクション管理を適用します。


これらのアノテーションを使うことで、SpringはXML設定ファイルの必要がなくなり、コードベースで設定を管理できるようになります。

## ドメイン駆動設計書
ドメイン駆動設計（DDD）は、ソフトウェアの設計と開発をビジネスの内容（ドメイン）に合わせて行う方法です。つまり、システムを設計する際に、まずビジネスの要件や問題を深く理解し、それに基づいてソフトウェアを作り上げるアプローチです。以下に、DDDの主要な概念と要素を説明します。

1\. ドメインとモデル
- **ドメイン**: ソフトウェアが解決しようとしているビジネスの領域や問題。
- **ドメインモデル**: ドメインの重要な概念やルールを図や図式で表現したもの。

2\. エンティティ
一意のID（識別子）を持つオブジェクトで、例えば「ユーザー」や「注文」など、状態や属性が変わるもの。

3\. 値オブジェクト
一意のIDを持たず、値が重要なオブジェクト。例えば「住所」や「色」など、値そのものが意味を持つもの。

4\. アグリゲート
関連するエンティティや値オブジェクトの集まりで、一貫した状態を保つための単位。例えば「カート（カート内の商品）」など。

5\. リポジトリ
データを保存したり取り出したりする役割を持つ、データベースとの仲介役。例えば「ユーザーリポジトリ」など。

6\. サービス
ビジネスロジックを提供するサービス。エンティティや値オブジェクトの操作を行うもの。

7\. ファクトリー
オブジェクトの生成を担当する役割。複雑な作成プロセスを隠蔽します。

8\. ユビキタス言語
ビジネス担当者と開発者が共有する共通の用語や言葉。これにより、全員が同じ意味でコミュニケーションできます。

9\. バウンデッドコンテキスト
特定の範囲や領域におけるドメインモデルの有効範囲。異なる範囲では異なるモデルが使われることがあります。

### ドメイン駆動設計書の内容
- **ドメインの概要**: ビジネスの背景や目標を説明
- **ドメインモデル**: 重要なエンティティや値オブジェクトを説明
- **ユビキタス言語**: 用語や概念の定義
- **アーキテクチャの設計**: システム全体の構造やデータ管理の方法
- **サービスとファクトリーの設計**: 役割や作成方法の説明
- **データベース設計**: データの保存方法やテーブルの構造

DDDは、ビジネスの要件を反映させるために、ソフトウェアの設計をビジネスの内容に合わせて行うことを目指しています。


## オブジェクト指向とは？
オブジェクト指向（OOP）は、ソフトウェアを「オブジェクト」という部品で組み立てる考え方です。これにより、プログラムをより理解しやすく、管理しやすくすることができます。以下は、オブジェクト指向の基本的な概念を簡単に説明します：

1\. オブジェクト
データ（情報）とそのデータを操作するための機能（メソッド）を一つにまとめたもの。例えば、「犬」というオブジェクトは、「名前」や「年齢」というデータと、「吠える」や「走る」といった機能を持っています。

2\. クラス
オブジェクトの設計図やテンプレート。クラスは、どんなデータと機能を持つオブジェクトを作るかを定義します。例えば、「犬」というクラスは、全ての「犬」オブジェクトが持つべきデータや機能を定義します。

3\. 継承
既存のクラスを基にして、新しいクラスを作ること。例えば、「動物」というクラスから「犬」や「猫」などの新しいクラスを作り、「動物」クラスの基本的な機能を受け継ぎつつ、特定の機能を追加できます。

4\. ポリモーフィズム
同じ操作が、異なるオブジェクトで異なる結果を生むこと。例えば、「鳴く」という操作が「犬」では「ワンワン」、「猫」では「ニャー」となるように、同じメソッドがオブジェクトによって異なる動作をします。

5\. カプセル化
オブジェクトの内部のデータや詳細を隠して、外からはそのオブジェクトが提供する機能だけを使えるようにすること。これにより、オブジェクトの内部が変更されても、外部の使用方法には影響がありません。

6\. 抽象化
重要な部分だけを取り出し、細かい詳細は隠すこと。例えば、「動物」という抽象的なクラスには「鳴く」という基本的な機能だけを定義し、「犬」や「猫」ではその具体的な鳴き方を実装します。

### オブジェクト指向のメリット
- **再利用**: 一度作ったクラスやオブジェクトを何度でも使えるため、同じコードを書く手間が省けます
- **管理しやすい**: オブジェクトが独立しているため、プログラムの各部分を個別に管理しやすくなります
- **柔軟性**: 新しい機能を追加したり変更するのが容易で、プログラムの変更に強くなります

オブジェクト指向は、プログラムを部品ごとに分けて考えることで、より効率的にソフトウェアを作る方法です。

# おわりに
最後までお読みいただきありがとうございます。
ChatGPTにて生成した文章を含んでいるため、違反等ございましたら、ご指摘お願いいたします。