A ←→ B 양방향 인터페이스가 진행될 때
A에서 수신 후 업데이트가 되면 B로 전송하는 update 트리거에 대해 이야기가 나왔는데
결국 A에서 B를 바꿔주면 B가 바뀌니 A로 재전송하고 A는 다시 B로 재전송하는 무한루프가 될 수 있지 않냐는 질문을 받았고
Flag를 사용한다고 해도 해당 값을 변경할 때 update가 일어나기 때문에 내부 감지 구분이 불가능했다.
이 부분에 대해서 이전에도 문제가 있어야 했는데 왜 문제가 없을까 생각하다가
Before Trigger에서 작동할 경우 DML 작업이 일어나지 않기 때문에 문제가 없다는걸 알 수 있었는데
아래와 같은 테스트 결과 flag 값(임시)인 SAP_Type__c 필드에 postman으로 skb로 발송할 경우
‘수신’이라는 디버그가 찍히면서 값은 sk로 되어있고 그 이후 update가 1회 작동한 다음
sk로 변경된 것에 대한 ‘발송’로직은 돌아가지 않는 것을 볼 수 있었고
내부에서 ‘sk’로 변경하는 경우 ‘발송’로직은 1회 탄 다음 update가 1회 작동하지만
당연히 ‘skb’가 아니라 수신이 찍히지도 않고 ‘sk’로 변경되었다고 update가 재작동하지도 않았기 때문에
무한루프 트리거 문제는 update 등인 경우 after가 아닌 before를 사용해야 하는 것으로 정리할 수 있었다.
trigger TestObjectTrigger on TestObject__c (before insert, before update, after insert, after update) {
new TestObject_tr().run();
}
public with sharing class TestObject_tr extends TriggerHandler {
public List<TestObject__c> newObjList {get; set;}
public Map<Id, TestObject__c> oldObj {get; set;}
public TestObject_tr() {
this.newObjList = (List<TestObject__c>)Trigger.new;
this.oldObj = (Map<Id, TestObject__c>)Trigger.oldMap;
}
public override void beforeInsert() {
handleBefore();
}
public override void beforeUpdate() {
handleBefore();
}
public override void afterInsert() {
System.debug('■ afterInsert 작동');
}
public override void afterUpdate() {
System.debug('■ afterUpdate 작동');
}
private void handleBefore() {
for (TestObject__c so : newObjList) {
if (so.SAP_Type__c == 'skb') {
so.SAP_Type__c = 'sk';
System.debug('■ 수신');
} else if (so.SAP_Type__c == 'sk') {
System.debug('■ 발송');
}
}
}
}
(1).백준 34125번 래환이의 아이브 콘서트 이야기는 콘서트 자리 최적화 문제로
뭔가 이런건 실제로 파이썬으로 프로그램을 만들어서 티케팅을 할 수도 있을 것 같다는 생각은 들었다.
일단 최적화는 신경쓰지 않고 최소값을 전부 구해준 다음
최소값인 경우 해당 값을 출력해주는 방식으로 진행했는데
이 부분은 따로 함수를 빼서 쓰는게 가독성 면에서는 더 좋을 것 같다.
const input = `4 5
0 0 0 0 0
1 0 1 0 0
0 0 0 0 0
1 0 0 0 0`.split('\n').map(el => el.split(' ').map(Number))
const [x,y] = input.shift()
let min = Infinity
let result = -1
for(let i = 0 ; i < x ; i++){
for(let j = 0 ; j < y ; j++){
if(!input[i][j]){
min = Math.min(min, (i+1) + Math.abs((y+1)/2 - (j+1)))
}
}
}
for(let i = 0 ; i < x ; i++){
for(let j = 0 ; j < y ; j++){
if(!input[i][j] && ((i+1) + Math.abs((y+1)/2 - (j+1))) == min){
result = `${i+1} ${j+1}`
}
}
}
console.log(result)'회고' 카테고리의 다른 글
| [개발일지] - 800 (0) | 2025.09.11 |
|---|---|
| [개발일지] - 799 (0) | 2025.09.10 |
| [개발일지] - 797 (0) | 2025.09.08 |
| [개발일지] - 796(주말) (0) | 2025.09.07 |
| [개발일지] - 795(주말) (0) | 2025.09.06 |
