
팀리뷰 : 매번 특정한 요청에 따라 부수효과의 형태로 따라오는 동작의 경우 코드 레벨에서 싱크 맞추기 보다는 trigger를 활용해 보는 것도 좋을 것 같아요. 실제 회사에서 로그를 남기는 방식도 trigger시에 레코드를 json으로 저장해서 로깅합니다.( 다소 자의적 해석이 들어감 ㅎㅎ)
아래는 프로젝트 ERD의 일부이며, product_state 테이블에 들어오는 모든 INSERT 에 대해서 history를 남기고자 합니다.(Postgresql 기준으로 작성된 query입니다.)
INSERT, UPDATE, DELETE 등 데이터 조작 쿼리들) 쿼리가 동작하면 자동으로 동작하는 프로그램이다. 하나의 procedure 와 유사하다.
create trigger product_state_log_action
after insert
on product_state
for each row
execute function insert_history();
product_state_log_action 이라는 트리거를 만들어라~INSERT 이후에 동작할 것이고,product_state 테이블에 dml이 작동 될 시 동작 할거다.INSERT 가 일어나면 트리거 시켜라( N행 삽입 될경우 N번~)insert_history 를 가동 시킬거야~!트리거 작동 예제를 보다보면 procedure 혹은 function을 execute 하는 예제들이 대다수다.
procedure : 일련의 쿼리를 하나의 함수로 실행 할 수 있는 쿼리의 집합
function : 각 프로세스를 수행하기 위해 필요한 기능
procedure보다 느립니다.나는 function 을 사용했기 때문에 procedure는 다음에 알아보자(서버/클라이언트가 무엇인지~)
function 작성의 구조는 아래와 같다.

create function insert_history() returns trigger
language plpgsql as $$
BEGIN
INSERT INTO public.history (id, data, created_at, updated_at)
VALUES (NEW.id, to_jsonb(NEW), NOW(), NOW());
RETURN NEW;
END;
$$;
insert_history라는 트리거 함수를 생성한다.TRIGGER여야 한다.to_jsonb : 기존에 재민님이 전부 jsonify해서 로그를 document db(키 -밸류 쌍의 db)와 유사한 형태로 간단하게 가지고 있는다고 말씀하신게 기억나서 비슷한 내장함수를 찾아 보았고 마침 적절한 것이 있었다.NEW : insert, update 구문에서 들어오는 신규 값OLD : update, delete 구문에서 이전의 값product_state 에 추가될 레코드의 id 와 동일하게 생성되는 현상이 있었다..create function insert_history() returns trigger
language plpgsql as $$
BEGIN
INSERT INTO public.history (id, data, created_at, updated_at)
VALUES (NEW.id, to_jsonb(NEW), NOW(), NOW());
RETURN NEW;
END;
$$;
db의 다양한 기능중 trigger 와 function에 대해서 학습해 보는 좋은 시간이었다. 이를 통해서 로그 적재 동작을 쉽게 구현하는데에 사용하고, 이외에도 부수효과를 구현하기 좋을 것 같다.