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

+ Recent posts