Both annotations expose Apex to non-Apex callers, but they target different consumers.
`@AuraEnabled` — exposes Apex to Lightning components (Aura and LWC).
apex @AuraEnabled(cacheable=true) public static List<Account> getAccounts() { ... }
LWC: import getAccounts from '@salesforce/apex/AccountController.getAccounts'; then bind with @wire. cacheable=true allows client-side caching (required for @wire).
`@InvocableMethod` — exposes Apex to Flow Builder as a callable Apex Action.
apex @InvocableMethod(label='Get Accounts') public static List<List<Account>> getAccounts(List<Id> accountIds) { ... }
Bulk pattern is mandatory: List in, List out.
Differences: caller (LWC vs Flow), bulk (single vs list), caching (cacheable=true vs N/A), discovery (import vs Action element). You can have both annotations on the same method.
