Salesforce

Salesforce ApexClass @AuraEnabled(cacheable=true) , @wire

박성하하 2023. 11. 30. 16:55
728x90
반응형

1. @AuraEnabled

 

- ApexClass의 method를 Component에서 호출가능하게 해준다.

 

 

2. (cacheable = true)

 

- 메서드 결과를 cache에 저장(?)한다.
- 동일한 레코드에 대한 다수의 요청이 있을 때 서버에 다시 쿼리를 보내지 않고 캐시된 결과를 사용할 수 있다.
  이렇게 서버 캐싱을 활용하면 네트워크 비용을 최소화하고 더 나은 성능을 얻을 수 있다

 

3. TMI

import { LightningElement , wire} from 'lwc';
import findAccList from '@salesforce/apex/AccController.findAccList';
export default class BindImperativewithParam extends LightningElement {
    searchKey = '';
    accounts;
    error;

    handleOnchange(event){
        this.searchKey = event.target.value;
    }

    handleClick(){
        findAccList({keyword:this.searchKey})
        .then((result) =>{
            this.accounts = result;
            this.error = undefined;
        })
        .catch((error)=>{
            this.error = error;
            this.accounts = undefined;
        });
    }

    // @wire(findAccList,{keyword : '$searchKey'})
    // wiredAccList({data,error}){
    //     if(data){
    //         this.accounts = data;
    //         this.error = undefined;
    //     } else if(error){
    //         this.accounts = undefined;
    //         this.error = error;
    //     }
    // }

}

- then과catch를 사용하는 imperative call(명령형 호출)의 경우에는 findAccList Method를 사용할때
   catchable = true가 필요하지않지만,
   @wire를 사용하는 function 방식에는 catchable = true가 되어있지않으면 오류가 발생한다.

@AuraEnabled(cacheable=true)를 사용한 Apex 메서드와 LWC의 연결 메서드는 실제로 괜찮습니다.
Wire 어댑터는 브라우저 캐시를 사용하여 @wire에서 오는 레코드 데이터를 저장하기 때문입니다. 기본적으로 @AuraEnabled는 @AuraEnabled(cacheable=false)입니다. 이는 서버 측 메서드(apex 메서드)가 유선 어댑터로 호출될 수 없음을 의미하므로 LWC는 이 오류로 인해 apex 메서드 실행을 거부했습니다.
그러나 @AuraEnabled(cacheable=true) 없이 apex 메서드에 대한 명령형 호출이 가능합니다.
명령형 호출은 수신된 데이터를 저장하기 위해 브라우저 캐시를 사용하지 않습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형