Validation rull을 수정해야 하는데
아래와 같이 작성했는데 정상적으로 작동하지 않아서 의아했는데
IBoolean__c && FieldName ≠ null
이전에 작성한 Validation rull을 확인하니 원인을 파악할 수 있었다.
&&는 AND, ||는 OR 그리고 is not null을 나타내는 것은 !ISNULL을 사용해야 했는데
검색 결과 ISNULL보다 ISBLANK가 더 좋다는 내용이 있었는데
생각해보면 null값을 싫어해서 ‘’형태로 값을 보내 공백이지만 값은 있는 경우가 있기 떄문에
진짜 null이 아닌 값이 없는 것을 체크하려면 ISBLANK가 더 맞긴 할 것 같았다.
AND(!IBoolean__c, !ISBLANK(FieldName))
세번째 프로젝트 진행 중
개발오그가 지나치게 느린 것에 오늘도 고통받고 있었는데
저번에도 한참 원인을 파악하며 네트워크등을 건드리다가
통으로 복사되어 없는 데이터를 가져오려는 메인 로고 부분을
운영서버로 가서 가져온 다음 넣어줬는데 그래도 해결되지 않았었다.
문득 어제 한참 시도하다가 포기했던 캐시 부분에서
“캐시를 org 단위로 없앨 수는 있지만 심각한 성능 저하가 발생할 수 있다”고 해서 포기했던게 떠올랐고
설정 → 보안 → 세션 설정 → 안전하고 지속적인 브라우저 캐싱을 통해 성능 개선을 보니
예상대로 해제되어 있는 것을 볼 수 있었다.
설정을 다시 켜고 재접속을 해도 큰 차이는 느낄 수 없었는데
원인을 다시 파악해보니 시작 부분에 무슨 대시보드만 수십개가 깔려있었기 때문에
해당 부분들 로딩 문제로 느려지는 것 같았다.
그래도 다행히 내용물이 별로 없는 탭으로 빠르게 이동하면 딜레이가 거의 없었는데
이전에는 내용이 하나도 없는 탭도 5~10초가 걸리던 것에 비하면 상당히 만족스러웠다.
다음 작업을 진행하다가 스케줄을 걸어줘야 했는데
이전까지는 스케줄이 아닌 배치라고 착각하고 배치를 만들다가
뭔가 이상함을 느끼고 다시 스케줄로 방향을 선회했다.
Global with sharing class IF_EveryDay_BatchJob implements Schedulable {
//오전 1시 예정으로 테스트를 위해 주석처리
// Global static String cron = '0 0 1 * * ?';
//원하는 시간대 테스트용
Global static String cron = '0 45 16 * * ?';
Global static void runSchedule() {
System.schedule('MethodName EveryDay 01:00:00', cron, new IF_EveryDay_BatchJob());
}
Global void execute(SchedulableContext sc) {
IF_EveryDay_BatchJob.executeBatch(sc.getTriggerId());
}
Global static void executeBatch(Id jId){
ClassName.MethodName();
}
}
스케줄로 작동시키려고 시도하는데 자꾸 callout 문제가 발생했고
해당 문제를 해결하기 위해 배치 내부가 아닌 외부에 하려고 아래처럼 excuteBatch도 만들었지만
의미없이 넘어가버렸다.
결국 원인을 찾아본 결과 스케줄의 특성상 동기화로 작동되지 않는다는 문제였는데
이걸 해결하기 위해서는 비동기로 진행한다는 future를 사용해야 했고
@future를 사용했음에도 불구하고 callout 에러가 발생했는데
에러코드에 callout = true를 사용하라고 안내 메세지가 같이 있었기 때문에
아래와 같이 메서드 위에 future를 붙여 실행할 수 있었다.
public with sharing class ClassName{
@Future(callout=true)
public static void MethodName(){}
}
하지만 많은 데이터가 생길 경우 배치를 사용해야 하는데
지금 하루 평균 한두건의 데이터라고 해도 몇건이 될지 모르기 때문에
유지보수를 위해서는 배치로 해야 한다는 말씀이 있으셔서 다시 배치를 작성하기로 했다.
배치는 또 개체 관련 문제로 골치였는데
저번에 해결했던 경험을 살려서 확인해보니
리턴값과 받는 값의 타입은 List<Object>로 해버리고
for문 내부에서 다시 형변환을 해야 해결할 수 있었다.
Global without sharing class ClassName implements Database.Batchable<Object>,Database.AllowsCallouts {
Public List<Object> start(Database.BatchableContext BC) {
List<ObjectName> acList = [SELECT Id
, FieldName1
, FieldName2
, FieldName3
, FieldName4
, FieldName5
, FieldName6
FROM ObjectName
];
return acList;
}
Public void execute(Database.BatchableContext BC, List<Object> scope) {
for(Object asObj : scope){
ObjectName asset = (ObjectName)asObj;
System.debug(asset);
}
}
(1).백준 21146번 Rating Problems는 심사위원들의 평점을 구해야 하는 문제였다.
-3~3점까지의 점수를 줄 수 있고
n명 중 k명의 점수가 공개되었을 때
최고 및 최저 평점을 구해야 했기 때문에
점수가 밝혀진 위원들의 점수 합을 구한 다음
max에는 나머지 위원들의 점수를 3점으로 더하고
min에는 나머지 위원들의 점수를 3점씩 모두 제외했다.
점수는 평점이기 때문에 최종적으로 총 인원인 n으로 나눠 문제를 해결할 수 있었다.
const input = `5 2
1
2`.split('\n')
const [n, k] = input[0].split(' ').map(Number)
let point = 0
for(let i = 1 ; i < input.length ; i++){
point += Number(input[i])
}
const max = (point + 3 * (n - k)) / n
const min = (point - 3 * (n - k)) / n
console.log(min, max)
'회고' 카테고리의 다른 글
[개발일지] - 114(주말) (0) | 2023.10.22 |
---|---|
[개발일지] - 113(주말) (0) | 2023.10.21 |
[개발일지] - 111 (1) | 2023.10.19 |
[개발일지] - 110 (0) | 2023.10.18 |
[개발일지] - 109 (2) | 2023.10.17 |