보안적인 문제로 인해 그냥 일지 자체를 중단했었는데
지나간 코드를 블로그에 검색할 수 없어서 예전에 해결한 문제와 비슷한 경우 다시 시간이 걸리는 단점이 생겨버렸고
이로 인해 보안적으로 문제가 되는 부분들은 지워버리고 세일즈포스적인 부분만 남겨서 참고하기로 했다.
(변수명, 변수값 정도만 지운다는 이야기)
하지만 프로젝트를 들어가면서 조금 더 세밀하게 일정과 기록이 관리될 필요성을 느끼는데
보안적인 문제가 있어서 옵시디언을 사용해야 할 수도 있을 것 같고
만약 옵시디언으로 정리하게 된다면 일기는 몰라도 회고의 필요성이 점점 줄어든다는 생각이 든다.
1.배치 200 -> 1로 줄여서 여러개 테스트해보기
2.배치 넘길 때 Database.Query 말고 다른 방식 찾아보기(Iterable<String>)
3.스케쥴러를 익명함수가 아닌 클래스로 추가해서 배치 작동시키기
1.배치 생성 완료
public class LeadProcessor implements Database.Batchable<sObject>, Database.Stateful {
public Integer recordsProcessed = 0;
public Database.QueryLocator start(Database.BatchableContext bc) {
return Database.getQueryLocator(
'SELECT ID, Company FROM Lead'
);
}
public void execute(Database.BatchableContext bc, List<Lead> scope) {
// process each batch of records
List < Lead > leads = new List < Lead > ();
for (Lead lead : scope) {
lead.Company = lead.Company + '1';
leads.add(lead);
// increment the instance member counter
recordsProcessed = recordsProcessed + 1;
}
update leads;
}
public void finish(Database.BatchableContext bc){
System.debug(recordsProcessed + ' records processed. Shazam!');
AsyncApexJob job = [SELECT Id, Status, NumberOfErrors,
JobItemsProcessed,
TotalJobItems, CreatedBy.Email
FROM AsyncApexJob
WHERE Id = : bc.getJobId()];
// call some utility to send email
EmailUtils.sendMessage(job, recordsProcessed);
}
}
2.배치 생성 후 원하는 값 start -> execute 전달은 Database.Query가 되지 않음 Iterable<String>으로 해결
3.배치 생성 후 api 가져오기 Too many callouts 문제 Database.AllowsCallouts으로 해결
4.배치 200 -> 1로 줄여서 실행해보기 ApiBatchProcessor batchClass = new ApiBatchProcessor(); Database.executeBatch(batchClass,1); 형태로 , num 형태일 경우 해당 수치만큼 쪼개진다.
5.배치 endpoint 미등록 setting -> Security -> Remote Site Settings -> New Remote Site 등록 후 진행 성공
배치
public class ApiBatchProcessor implements Database.Batchable<String>, Database.AllowsCallouts {
public Iterable<String> start(Database.BatchableContext bc) {
// 여기서는 외부 API를 호출하여 데이터를 가져옵니다.
String requestBody = //보안상 입력 형태 삭제
HttpRequest request = new HttpRequest();
request.setEndpoint('<https://url>' //보안상 입력 형태 삭제);
request.setMethod('POST');
request.setHeader('Content-Type', 'application/json');
request.setBody(requestBody);
Http http = new Http();
HttpResponse response = http.send(request);
List<String> cardNames;
if (response.getStatusCode() == 200) {
// API에서 가져온 데이터를 가공하여 List<Object> 형태로 보관합니다.
Map<String, Object> jsonResponse = (Map<String, Object>) JSON.deserializeUntyped(response.getBody());
List<Object> apiData = (List<Object>) jsonResponse.get('result');
XXXXs = new List<String>();
// API에서 가져온 데이터를 가공하여 XXXX 값을 추출합니다.
for (Object data : apiData) {
Map<String, Object> dataMap = (Map<String, Object>) data;
String xxxx = (String) dataMap.get('XXXX');
XXXXs.add(xxxx);
}
// 가공된 데이터를 반환합니다.
return XXXXs;
} else {
return null; // API 호출에 실패한 경우, 처리할 데이터가 없으므로 null을 반환합니다.
}
}
public void execute(Database.BatchableContext bc, List<String> scope) {
// execute 메서드에서는 가공된 데이터를 사용하여 처리 작업을 수행합니다.
List<Lead> leads = new List<Lead>();
System.debug(scope);
for (String xxxx : scope) {
System.debug(xxxx);
leads.add(new Lead(LastName = 'test', Company = xxxx));
}
System.debug(leads);
insert leads;
}
public void finish(Database.BatchableContext bc) {
// 배치 작업이 완료된 후에 추가적인 마무리 작업을 수행합니다.
}
}
6.스케쥴러로 배치를 작동하지 않고 implements Schedulable를 배치에 추가해 진행 => 실패 스케쥴러 생성 후 스케쥴러 내부 배치 실행 방식으로 변경 후 성공
public class ApiBatchScheduler implements Schedulable {
public void execute(SchedulableContext sc) {
ApiBatchProcessor batchClass = new ApiBatchProcessor();
Database.executeBatch(batchClass, 1);
}
}
String jobName = '배치 실행 스케줄러';
String cronExpression = '0 0 * * * ?';
ApiBatchScheduler batchScheduler = new ApiBatchScheduler();
System.schedule(jobName, cronExpression, batchScheduler);
7.클래스 추가 후 클래스 내부에서 작동시키기
public class ApiBatchScheduler implements Schedulable {
public void execute(SchedulableContext sc) {
ApiBatchProcessor batchClass = new ApiBatchProcessor();
Database.executeBatch(batchClass,1);
}
public static void registerScheduler() {
String jobName = '배치 실행 스케줄러';
String cronExpression = '0 30 * * * ?';
ApiBatchScheduler batchScheduler = new ApiBatchScheduler();
System.schedule(jobName, cronExpression, batchScheduler);
}
}
익명함수에서 ApiBatchScheduler.registerScheduler();로 작동
로그쌓기 진행하기(하단 미공개)
내일 모레가 당장 시험이라 노션에서 복사해서 옮기는게 조금엉망진창으로 정리된 느낌이지만
이것도 많이 무리한 것 같은데 아마 내일 회고록은 문제만 올라오고 수정되거나
그냥 기존처럼 수정없이 문제만 있을 수 있을 것 같다.
(1).백준 17944번 퐁당퐁당 1은 사람들이 모였을 때 주어진 사람 숫자의 2배만큼의 숫자까지 오르락 내리락하는 게임이었다.
처음 생각으로는 간단하게 사람 수를 기준으로 게임을 %처리해 쉽게 해결할 수 있을 것 같았는데
2n이라는 것을 가볍게 읽고 넘어가버려서 n 기준으로 작성하고 코드가 꼬여서 수정하는데 조금 헷갈렸다.
결과적으로는 1~2n까지의 증가 후 다시 1까지 감소해야 하는데
1은 새로운 시작이라고 보면 1~2n -> 2까지로 2n으로 4n번이 아닌 4n-2번 이동한다는 것을 확인해야 했고
그걸 다시 n이 아닌 2n을 기준으로(people * 2) 처리해야 하는 것을 깜빡하지만 않는다면 쉽게 해결할 수 있는 문제였다.
n 기준으로는 금방 풀 수 있을 것 같은데
2n으로 설정되고 -2처리까지 붙었다고 10분 가까이 걸려서 조금 당황했다.
const [people, game] = `5 20`.split(' ').map(Number)
const oneCycle = 4 * people - 2
console.log(game % oneCycle > 2 * people ? 2 * people - (game % oneCycle) % (2 * people) : game % oneCycle)