[바미] 트리거는 왜 사용할까?
회사의 Node프로젝트 중 트리거를 사용하는 프로젝트가 있었습니다.
그 트리거들은 특정 작업 전에 동작하거나 특정 작업 후에 처리되는 것들이였기 때문에 그 트리거들을 보면서
미들웨어라는 좋은 게 있는데 왜 트리거를 사용했을까?
라는 생각을 하게 되었습니다.
그러니까 아래와 같이 구성하면 되지 않나? 싶었죠.
app.use(async (req, res, next) => {
try {
const result = await someAsyncTask();
req.customData = result; // 비동기 작업 결과를 요청 객체에 저장
next(); // 다음 미들웨어 함수 호출
} catch (error) {
next(error); // 오류 처리를 위해 다음 미들웨어 함수 호출
}
});
그러다 GPT에게 물어봤으나
트리거는 데이터베이스에서 특정 이벤트가 발생할 때 자동으로 실행되는 것인데, 이것은 주로 데이터의 일관성을 유지하고
데이터베이스의 작업을 자동화하기 위해 사용됩니다. 예를 들어, 데이터베이스에 새로운 데이터가 추가되거나 수정될 때마다 다른 테이블의 데이터를 업데이트하거나 특정 작업을 수행하는 등의 작업을 트리거를 통해 자동으로 수행할 수 있습니다.
한 편, Node.js는 주로 외부 시스템과의 통합이나 비즈니스 로직을 처리하는 데 사용됩니다. 예를 들어, 웹 애플리케이션에서 API 호출 전에 특정 작업을 수행하거나 API 호출 후에 다른 작업을 수행하는 등의 작업을 Node.js를 사용하여 처리할 수 있습니다.
이런 대답 뿐이였습니다.
데이터베이스에 새로운 데이터가 추가되거나 수정될 때마다 다른 테이블의 데이터를 업데이트하거나 특정 작업 등의 로직을
실행하기 전 후 부분에 미들웨어를 추가하여 동작하도록 할 수 있기 때문에 미들웨어 단에서도 충분히 작업을 수행할 수 있어 제 의구심은 커져만 갔습니다.
그러다 알게 된 사실은 스케줄러와 같이 내부 API를 타지 않고 데이터가 조작될 때를 위해 사용한다는 점이였습니다.
예를 들어, 데이터베이스 관리 시스템(DBMS)의 내부 스케줄러, 외부 시스템에서의 직접적인 데이터 입력, 혹은 다른 데이터베이스에서의 데이터 이동과 같은 상황에서는, 미들웨어 레벨의 코드가 실행되지 않기 때문에 이러한 경우, 데이터의 추가나 수정이 발생해도
미들웨어 단에서는 이를 감지하거나 반응할 방법이 없어요.
이 때 트리거가 매우 유용하게 사용되는데 트리거는 데이터베이스 레벨에서 정의되므로, 데이터가 어떤 방식으로든 조작되었을 때 항상 실행되죠.이럴 때 데이터베이스의 무결성을 유지하는 데 필수적인 역할을 하며, 어플리케이션 로직의 복잡성을 줄이는 데에도 도움을 주게 되더군요.
따라서, 내부적으로 데이터가 조작될 때 이를 감지하고 자동으로 반응하는 메커니즘을 구축할 필요가 있을 때 트리거를 사용하였다는 걸 알았어요.