Apex에서의 Wrapper 클래스는 여러 변수(primitive data)를 담아 하나의 객체로 만들어주는 클래스 속 클래스입니다. 쉽게 말하자면 원하는 구조를 만들때 사용됩니다.
개요
Wrapper 클래스는 기본 자료형(Primitive), 컬렉션 자료형(Collections), Salesforce 객체(sObjects)를 멤버로 받을 수 있습니다. Wrapper 클래스를 사용하는 이유는 크게 두 가지입니다.
- 첫째, Wrapper 클래스는 파라미터로 받은 JSON 문자열을 객체 타입으로 변환하여 매번 파싱하고 맵핑하는 과정을 생략할 수 있게 해줍니다.
- 둘째, 이는 데이터 관리 측면에서 효율적입니다. 객체를 쉽게 변환하고 조작할 수 있기 때문입니다.
이전 포스트(https://loitering.tistory.com/54) 에서 설명한 바와 같이, Lead 생성을 위해 string 타입의 JSON을 받아 deserializeUntyped를 사용하여 Map 타입으로 변환했습니다. 변환한 후에는 각각의 변수에 get 메서드를 사용하여 할당했습니다.
Map<String, Object> jsonData = (Map<String, Object>) JSON.deserializeUntyped(leadInfo);
String firstName = (String) jsonData.get('FirstName');
String lastName = (String) jsonData.get('LastName');
String email = (String) jsonData.get('Email');
String phone = (String) jsonData.get('Phone');
String howKnowUs = (String) jsonData.get('HowKnowUs');
String recordTypeId = (String) jsonData.get('RecordTypeId');
Wrapper 사용법
클래스 정의
public class LeadCreateWrapper{
@AuraEnabled public String firstName {get; set;}
@AuraEnabled public String lastName {get; set;}
@AuraEnabled public String email {get; set;}
@AuraEnabled public String phone {get; set;}
@AuraEnabled public String howKnowUs {get; set;}
@AuraEnabled public String recordTypeId {get; set;}
}
- 각각의 변수에 @AuraEnabled를 적어주어야 합니다. @AuraEnabled가 없는 경우 에러가 발생하지는 않지만 Lwc에서 데이터를 받을 때 해당 변수가 보이지 않아 데이터를 받을 수가 없습니다.
LWC에서 Apex로 데이터 넘기기 (LWC to Apex)
JSON.deserialize 파싱 및 매핑
파싱한 JSON을 LeadCreateWrapper 인스턴스 타입으로 바꾸어줍니다.
이전에 jsonData.get()을 통해 JSON속 데이터를 하나씩 파싱하며 맵핑해주었지만 deserialize를 통해 Wrapper 클래스의 인스턴스로 자동으로 맵핑까지 됩니다.
@AuraEnabled
public static String createLeadRecord(String leadInfo){
if(String.isEmpty(leadInfo)) return null;
List<LeadCreateWrapper> deserializedWrapper = (List<LeadCreateWrapper>) JSON.deserialize(leadInfo, List<LeadCreateWrapper>.class);
LeadCreateWrapper leadWrapper = deserializedWrapper[0];
Lead sLead = new Lead();
sLead.FirstName = leadWrapper.firstName;
sLead.LastName = leadWrapper.lastName;
sLead.Email = leadWrapper.email;
sLead.Phone = leadWrapper.phone;
sLead.HowDidYouFindOutAboutUs__c = leadWrapper.howKnowUs;
sLead.RecordTypeId = leadWrapper.recordTypeId;
try{
insert sLead;
}catch (DmlException ex){
return ex.getMessage();
}
return sLead.Id;
}
LWC 수정
saveRecord에서 leadRecord의 타입을 Array로 수정해주어야 합니다.
[Before]
let leadRecord = {
FirstName: this.firstName,
LastName: this.lastName,
Email: this.email,
Phone: this.phone,
HowKnowUs: this.isBusinessLead ? this.leadChannel : null,
RecordTypeId: this.recordTypeId
};
[After]
let leadRecord = [{
FirstName: this.firstName,
LastName: this.lastName,
Email: this.email,
Phone: this.phone,
HowKnowUs: this.isBusinessLead ? this.leadChannel : null,
RecordTypeId: this.recordTypeId
}];
테스트 및 결과 확인
leadWrapper >> LeadCreateWrapper:[email=wrapper@class.com, firstName=Wrapper, howKnowUs=null, lastName=Class, phone=012340987, recordTypeId=0125h000001ZOKnAAO]
마무리
Apex와 LWC에서 Wrapper 클래스를 활용하는 방법을 알아 보았습니다. Wrapper 클래스 속 각 변수에 @AuraEnabled가 붙어야 하며, JSON.deserialize를 사용하여 JSON 문자열을 그대로 객체로 변환할 수 있습니다. 개인적으로 구조가 복잡하지 않고 사이즈가 작은 데이터의 경우 굳이 Wrapper를 만들 필요없이 기존처럼 하는 방법도 괜찮다고 생각됩니다. 다만, 주고받는 구조가 조금 복잡해지고 Lwc와 Apex 개발자가 다른 경우 wrapper를 적극 활용하시는걸 추천합니다.
'Salesforce > 개발_한국어' 카테고리의 다른 글
세일즈포스 LWC로 lightning-map 활용한 지도 구현 가이드 (2부) (0) | 2024.08.19 |
---|---|
세일즈포스 LWC로 lightning-map 활용한 지도 구현 가이드 (1부) (0) | 2024.07.24 |
세일즈포스 커스텀 레코드 생성 만들기 4 - lwc:if 및 Save 구현 (0) | 2024.06.30 |
세일즈포스 커스텀 레코드 생성 만들기 3 - LWC에서 handler 연결 및 Picklist 값 가져오기 (2) | 2024.06.02 |
세일즈포스 커스텀 레코드 생성 만들기 2 - 모달 속 LWC 구현 및 컨트롤러 연결 (0) | 2024.05.26 |