■ Intro
DB 데이터 변경을 감지해야할 일이 있다. 서버의 어떤 동작이 외부 설정데이터에 영향을 받기 때문에 변경을 감지해서 동작을 수정해야 하는 상황이다. 그래서 일반적인 방법들을 정리해보고자 한다. (참고: 프론트엔드 부분은 제외하고 이야기한다.)
먼저 확인보자면 여기에서는 "실시간 데이터 처리와 변경 감지는 많은 비즈니스 애플리케이션에서 중요한 요구 사항으로 자리잡고 있습니다. 데이터베이스에서 특정 테이블이나 데이터를 감시하는 방법은 다양하지만, 전통적으로 트리거를 활용한 방식이 가장 많이 사용되었습니다." 라고 말한다. (그래서 뭘 해야하는데? 이 글에서 알아볼 것이다.)
앞으로도 데이터 변경 감지를 적절한 방법으로 해내기 위해서, 다양한 변경 감지 방법들을 알고 있도록 하자. 변경 감지는 두종류로 분류할 수 있는데, 하나는 실시간 감지고, 하나는 계속 변경체크하는 비 실시간 감지다. 실시간 '이벤트' 기반이며, 실시간이 아닐 경우 '폴링' 방식이다. 이쯤 하고 더 자세히 알아보자.
■ 감지 방법 결정하기
변경 감지 기능이 필요한 상황에서 실시간 감지가 중요할 수도 있고, 조금 늦게 감지하고 반영해도 괜찮은 경우가 있다. 실시간 감지는 이벤트 발생을 재빨리 감지해야 할 것이고, 그런 게 아니라면 꾸준히 요청해서 확인하면 되는데 그것을 폴링 방식이라고 한다.
*폴링: 상태가 변경되었는지, 새로운 데이터가 있는지 확인을 위해 정기적으로 요청을 보내는 행위이다. Poll의 투표하다/의견을 묻다라는 뜻이기 때문에, 폴링이라는 단어는 '지속적으로 물어보는 방식'이라는 특징을 잘 담아낸다.
이벤트 방식의 경우, DB 및 WAS에 추가 작업이 필요하다. MQ를 새로 도입해야 할 수도 있다.
- 트리거의 경우, 트리거를 등록해야 한다. 만약 특정 플러그인이 필요하면 설치가 필요하다. (예를 들어 api 호출하려면 sys_exec 함수를 사용하기 위해 lib_mysqludf_sys를 설치해야 함)
- CDC의 경우, DBMS에 binlog를 ON으로 켜야한다. 확인 방법은 SHOW VARIABLES LIKE 'log_bin'으로 볼 수 있고, 기본값은 OFF다. 이 외에도 다른 값도 설정해야 한다. 또한 DB뿐 아니라 이 binlog를 감지할 CDC 플랫폼인 Debezium(기본값으로 kafka 출력)를 사용해야 하며, 서버에서도 해당 리스너를 작성해야 한다. 즉 MQ를 새롭게 도입해야할 수도 있다.
최대한 내 담당 영역 바깥부분은 건들지 않아야 하는 상황이라,
이벤트 방식 말고 간단히 폴링을 적용하여 변경감지하기로 결정했다.
■ 감지 방식 분류
DB 데이터 변경감지를 하는 방식은 실시간이냐 아니냐로 나뉜다.
각각의 예시와, 현상황에서 고려해볼 부분을 알아보자.
□ 이벤트 방식
- 수동적으로 이벤트 발생을 기다리다가, 감지하고, 즉시 처리한다.
- 조건이 충족된 데이터만 푸시되므로, 조건문같은 별도 로직이 필요 없다.
- DB나 메시지 브로커와 같이 이미 동작 중인 시스템상의 최적화된 내부 프로세스에서 변경사항을 관리하고 있어서 요청/응답으로 감지하는 작업은 필요가 없으며, 생성된 변경사항 데이터를 읽기만 하면 된다.
[예시]
- DB의 트리거는 DB 엔진 내부에서 데이터 변경시 자동으로 실행되는 것이다.
- CDC(Change Data Capture) 는 데이터베이스의 변경 로그를 실시간으로 읽어서 이벤트를 스트리밍하는 것인데, 로그는 이미 DB가 생성하고 있는 트랜잭션 이벤트를 활용하는 것이다. 그저 로그스트림을 읽으면 된다.
[고려할 점]
- 트리거: DBMS에 등록해야 한다. 또한 DBMS에서 api를 날리려면 추가기능 설치가 필요하다.
- CDC: DBMS에 추가 설정이 필요하다. 또한 MQ를 사용하는 구조여야 한다.
□ 폴링 방식
- 기다리지 않고 주기적으로 직접 검사하는 방식이다.
- 실시간성이 중요하지 않은 경우 사용하며, 보편적이고, 간단하다.
- 변경사항이 없어도 항상 요청/응답 리소스를 소모한다.
- 변경감지를 위한 별도의 검색 리소스 소모한다. (ex: DB 커넥션 및 쿼리날리기)
- 변경여부 조건문 등으로 CPU 시간을 소모한다.
[예시]
- 직접 DB를 조회, 또는 API 호출하여 변경을 감지한다.
[고려할 점]
- 성능을 위해서 적절한 스케줄링 주기를 고민해보자.
.
.
Ref.
[Execute external program on Mysql] https://tech-diary.tistory.com/2
[Trigger 관련] https://okky.kr/questions/1136977
[데이터 변경감지 방법] https://www.namutech.co.kr/sqldependency%EB%A1%9C-%EC%8B%A4%EC%8B%9C%EA%B0%84-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B3%80%EA%B2%BD%EC%9D%84-%ED%9A%A8%EC%9C%A8%EC%A0%81%EC%9C%BC%EB%A1%9C-%EA%B0%90%EC%A7%80%ED%95%98%EB%8A%94-%EB%B0%A9/#
[Springboot 실시간 DB 변경 감지] https://okky.kr/questions/1019659
'Database' 카테고리의 다른 글
MSA에서 분산트랜잭션 (0) | 2024.05.22 |
---|---|
[상속관계 매핑] 싱글 테이블 전략을 선택한 이유 (0) | 2024.05.16 |
[MySQL + JPA] field 'mark_id' doesn't have a default value | 그리고 auto increment (0) | 2024.05.11 |
컬럼 수 적절성에 대한 고민 및 테이블 분할 (0) | 2024.04.15 |
Docker Mysql Container의 sql 파일 꾸준히 백업: crontab 사용 (0) | 2024.01.04 |