Apexにおける主なアノテーション

## **Salesforce Apexにおけるアノテーションとは？**  
Apexのアノテーション（Annotation）は、`@` 記号で始まる特別なマークで、クラスやメソッド、プロパティの振る舞いを制御するために使用されます。主に以下の目的で使われます。  

- メソッドの実行権限の指定  
- 特定の処理を有効化  
- 設定の簡略化  

Javaのアノテーションと似ていますが、Salesforce特有のものも多くあります。

---

## **主なアノテーション一覧**
できるだけ多くのアノテーションを紹介し、それぞれの意味とコード例を示します。

---

### **① @AuraEnabled**
**意味:**  
Lightningコンポーネント（Aura・LWC）からApexメソッドを呼び出せるようにする。

**使い方:**  
- `@AuraEnabled` だけ: フロントエンド（Aura/LWC）から参照可能なメソッド・プロパティ  
- `@AuraEnabled(cacheable=true)`: メソッドの結果をキャッシュ可能にし、パフォーマンスを向上させる

**コード例:**  
```apex
public with sharing class AccountController {
    @AuraEnabled(cacheable=true)
    public static List<Account> getAccounts() {
        return [SELECT Id, Name FROM Account LIMIT 10];
    }
}
```
この `getAccounts` メソッドは、LWC から呼び出してアカウント情報を取得できます。

---

### **② @Future**
**意味:**  
時間のかかる処理を非同期（バックグラウンド）で実行する。

**ポイント:**  
- `@future` を付けたメソッドは `static` でなければならない。  
- DML操作や外部APIコールに適している。  

**コード例:**  
```apex
public class FutureExample {
    @future
    public static void updateAccounts() {
        List<Account> accs = [SELECT Id, Name FROM Account];
        for (Account acc : accs) {
            acc.Name += ' (Updated)';
        }
        update accs;
    }
}
```
このメソッドを実行すると、Apex の非同期キューに入れられ、すぐには実行されません。処理負荷の分散に役立ちます。

---

### **③ @InvocableMethod**
**意味:**  
フローやプロセスビルダーから実行可能なメソッドを定義する。  

**ポイント:**  
- `static` メソッドに適用する必要がある。  
- `List<T>` 型のパラメータを受け取ることが多い。  

**コード例:**  
```apex
public class AccountHelper {
    @InvocableMethod(label='Update Account Names' description='Updates account names')
    public static void updateAccountNames(List<String> accountIds) {
        List<Account> accs = [SELECT Id, Name FROM Account WHERE Id IN :accountIds];
        for (Account acc : accs) {
            acc.Name += ' (Processed)';
        }
        update accs;
    }
}
```
これをフローから呼び出せば、指定したアカウント名を一括更新できます。

---

### **④ @InvocableVariable**
**意味:**  
フローやプロセスビルダーで参照できるクラス変数を定義する。

**コード例:**  
```apex
public class AccountWrapper {
    @InvocableVariable
    public String accountId;
    
    @InvocableVariable
    public String accountName;
}
```
このクラスをフローで利用し、データをやりとりできます。

---

### **⑤ @TestMethod (または @isTest)**
**意味:**  
テストメソッドやテストクラスを定義する。  

**ポイント:**  
- `@isTest` はクラス・メソッドのどちらにも使える。  
- `@TestMethod` はメソッド専用（推奨されていない）。  

**コード例:**  
```apex
@isTest
private class AccountTest {
    @isTest
    static void testAccountCreation() {
        Account acc = new Account(Name='Test Account');
        insert acc;
        
        System.assert(acc.Id != null);
    }
}
```
Salesforce ではコードカバレッジのためにテストを書くことが必須です。

---

### **⑥ @ReadOnly**
**意味:**  
SOQL のクエリ制限を一時的に緩和し、50,000行以上のレコードを取得可能にする。

**コード例:**  
```apex
public class ReadOnlyExample {
    @ReadOnly
    public static void fetchLargeData() {
        List<Account> accounts = [SELECT Id, Name FROM Account];
        System.debug('Total Accounts: ' + accounts.size());
    }
}
```
バッチ処理や大規模データ分析に使われます。

---

### **⑦ @RemoteAction**
**意味:**  
Visualforce（VFページ）から JavaScript 経由で Apex メソッドを呼び出す。

**コード例:**  
```apex
public class AccountRemoteController {
    @RemoteAction
    public static List<Account> getAccounts() {
        return [SELECT Id, Name FROM Account LIMIT 10];
    }
}
```
Visualforce から `sforce.apex.execute()` を使って呼び出します。

---

### **⑧ @NamespaceAccessible**
**意味:**  
パッケージ開発時に、異なる名前空間のクラスやメソッドを呼び出し可能にする。

**コード例:**  
```apex
@NamespaceAccessible
public class PublicUtility {
    public static String getMessage() {
        return 'Hello from Managed Package!';
    }
}
```
このクラスは、パッケージ外からも利用できます。

---

### **⑨ @Deprecated**
**意味:**  
将来的に削除される可能性があるメソッドやクラスをマークする。

**コード例:**  
```apex
public class SampleClass {
    @Deprecated
    public static void oldMethod() {
        System.debug('This method is deprecated.');
    }
}
```
将来削除予定のメソッドに使い、新しいメソッドを用意しておく。

---

## **まとめ**
| アノテーション | 用途 |
|--------------|------|
| `@AuraEnabled` | LWC/Aura から呼び出し可能にする |
| `@Future` | 非同期処理を実行する |
| `@InvocableMethod` | フローやプロセスビルダーから実行可能にする |
| `@InvocableVariable` | フローで使用するクラス変数を定義 |
| `@isTest` | Apex テストクラス・メソッドを定義 |
| `@ReadOnly` | SOQL のレコード取得上限を緩和 |
| `@RemoteAction` | Visualforce から JavaScript 経由で呼び出す |
| `@NamespaceAccessible` | パッケージ外からアクセス可能にする |
| `@Deprecated` | 非推奨メソッドを示す |

Apex のアノテーションを適切に使うことで、パフォーマンスの最適化や開発効率の向上ができます。