오늘은 family를 추가하기 위해 메서드들을 순회하며
어디에 family가 들어가야 하는지 미리 주석을 다는 작업을 진행한 다음
Aorg의 ProductDataController, ProductDataControllerTest의 pmd를 처리했다.
Borg에는 BProductController, BOrgSchedulerController, BOrgSchedulerControllerTest가 있었고
스케줄 부분에서 CRON_EXP에서 pmd 두개가 발생했는데
대문자 사용 및 언더바 사용에 대한 경고 메세지였다.
분명 해당 기호는 다들 이렇게 사용하기 때문에 인식을 위해 대문자 + 언더바로 사용하는게 맞다고 생각했고
해결 방법을 모르겠던 찰나 지나가던 파이가 보여서 대문자 사용이 금지인지 물어보니
자바에도 자바스크립트처럼 상수 값을 선언하는 방법이 있다고 알려주셨고
아래와 같이 final 선언을 통해 상수 선언을 해서 pmd를 통과할 수 있었다.
private final static String CRON_EXP = '0 0 0 17 4 ? 2024';
이런 선언이 있다는 사실 자체를 몰랐기 때문에 접근할 수 없었던 내용인데
확실히 자바를 조금 알아야 진행이 되는 부분도 존재하는 것 같다.
BOrgSchedulerController, BOrgSchedulerControllerTest의 pmd는 다 잡았지만
BProductController의 마지막 두개인 ‘has a cyclomatic complexity of 11’를 처리하지 못했다.
코드 변경 전 잘 작동하는지 확인하려고 했는데 인증이 제대로 되지 않아서 당황했지만
A org의 토큰이 아닌 B org의 토큰을 발급받아서 생긴 문제였다.
원하는 인증에 매칭시키기 위해서는 원하는 org의 로그인이 제일 최신이어야 했기 때문에(다중 로그인 시)
ORGANIZER를 사용해 org의 로그인만 한번씩 더 진행해주면
빠르게 여러 인증 코드를 받을 수 있을 것 같았다.
인증 후 정상적으로 코드가 작동하는 것을 확인했기 때문에
BProductController의 복잡도 문제를 해결하기 위해
두 메서드의 공통된 처리 부분을 분리해 다른 메서드를 생성해보기로 했다.
처음에는 조금 당황했지만 생각보다 어렵지 않게 문제를 해결할 수 있었고
아래와 같이 처리한 다음 값을 할당해서 기존 처리와 유사하게 할 수 있었는데
재미있는 부분은 list를 중첩해서 사용해도 문제가 발생하지 않는다는 점이었다.
List<List<Product2>> dmlLists = responseHandler(response, bDatas);
insertList = dmlLists[0];
updateList = dmlLists[1];
deleteList = dmlLists[2];
테스트를 시작했는데 A org에서 B org로 데이터를 옮겨야 하고
그 기준점이 A org의 아이디였기 때문에 B org에서는 ParentId를 required로 설정했는데
그 부분에서 문제가 발생해 아이디를 만들려면 ParentId를 만들어줘야 하고
아무 값이나 id에 넣으면 id 비교 부분에서 올바른 id가 아니라고 터져버렸다.
pmd의 빨간줄을 보며 계속 고민하다가
이건 포기하는게 맞다는 생각이 들어서 천에게 물어보니
웬만한 pmd 에러는 해결하는게 맞고 해결할 수 있을거라고 말씀하셔서
우회할 방법을 생각해보니 생각보다 어렵지 않았다.
하드코딩을 우회할 product를 생성한 다음
해당 id만 뽑아먹고 버리면 되는 것이었다.
List<Product2> tempPds = new List<Product2>();
Product2 productA = new Product2(Name = 'Test 1', Stock__c = 1, ProductParentId__c = 'a');
Product2 productB = new Product2(Name = 'Test 2', Stock__c = 2, ProductParentId__c = 'b');
Product2 productC = new Product2(Name = 'Test 3', Stock__c = 3,ProductParentId__c = 'c');
tempPds.add(productA);
tempPds.add(productB);
tempPds.add(productC);
insert tempPds;
List<Product2> pds = new List<Product2>();
Product2 product1 = new Product2(Name = 'Test 1', Stock__c = 1, ProductParentId__c = tempPds[0].Id);
Product2 product2 = new Product2(Name = 'Test 2', Stock__c = 2, ProductParentId__c = tempPds[1].Id);
Product2 product3 = new Product2(Name = 'Test 3', Stock__c = 3,ProductParentId__c = tempPds[2].Id);
pds.add(product1);
pds.add(product2);
pds.add(product3);
insert pds;
delete tempPds;
Family 를 js코드 및 apex에 적용해야 여러 org를 사용할 수 있지만
하나가 잘못되면 코드가 와장창 고장나기 때문에 변경 전 기존 코드 위치는 다 주석 처리를 하고
모두 연계되어 있기 때문에 중간테스트는 없이 바로 작동 확인을 할 수 밖에 없었다.
꼼꼼히 확인해서 통과할 것 같았지만 역시 쉽게 통과시켜주지 않았고
메서드에서는 문제가 없었지만 lwc에서 터져버렸다.
원인을 확인해본 결과 wire는 우선순위가 2위로
constructor 다음이었기 때문에 wire에서 사용할 this.template이 없어서 터지는 것이었고
이를 해결하기 위해 방법을 찾아봤지만 constructor 사용 외에는 없었기 때문에
constructor 를 생성해 사용했지만 super를 가져오지 않으면 사용되지 않으며
get 메서드를 사용해서 가져와야만 적용이 됐기 때문에 아래와 같이 처리해서 정상 작동시킬 수 있었다.
@wire(getProducts, {family : '$family'})
wiredRecord(result) {
this.wiredData = result;
if (result.data) {
this.productList = JSON.parse(result.data);
} else if (result.error) {
console.log(result.error);
this.accounts = undefined;
}
}
get family() {
return this.showTemplate;
}
constructor() {
super();
this.showTemplate = 'leather';
}
또한 해당 내용을 적용시켜서 스케줄러에서도 family 값을 넘겨줘야 했는데
내부에 하나의 org를 고정시킨다면 ‘leather’로 처리할수 있지만
여러개의 회사에서 유통을 진행하기 때문에 변수를 가져올 필요성이 있었다.
결국 아래와 같이 컨스트럭터를 사용해서 해당 값을 먼저 만들고
그 값을 받아오게 사용할 수 있었다.
public class BOrgSchedulerController implements Schedulable{
private String family;
public BOrgSchedulerController(String family) {
this.family = family;
}
public void execute(SchedulableContext sc) {
BProductController.productUpdate(family);
}
}
//하단 스케쥴러 추가용 코드 사용 예시
String jobName = '19분 데이터 추가 확인 예정';
String cronExpression = '0 19 * * * ?'; // 매 시간마다 실행
BOrgSchedulerController schedulable = new BOrgSchedulerController('leather');
System.schedule(jobName, cronExpression, schedulable);
(1).백준 11520번 And Then There Was 5는 파이에 5가 있다는 내용을 주장하고 싶은 문제인데
결론적으로는 각 테스트케이스의 뒤에 있는 숫자와 5를 같이 출력해주면 되는 문제로
값을 nums로 받아준 다음 출력할 때는 템플릿 리터럴을 사용해 'num 5'형태로 출력했다.
const input = `4
3 2
123456 6
999999 8
765432 7`.split('\n')
const result = []
for(let i = 1 ; i < input.length ; i++){
const nums = input[i].split(' ').map(Number)[1]
result.push(`${nums} 5`)
}
console.log(result.join('\n'))
'회고' 카테고리의 다른 글
[수습일지] - 52 (0) | 2023.05.17 |
---|---|
[수습일지] - 51 (0) | 2023.05.16 |
[수습일지] - 49(주말) (0) | 2023.05.14 |
[수습일지] - 48(주말) (0) | 2023.05.13 |
[수습일지] - 47 (0) | 2023.05.12 |