우테코 팀 프로젝트 3주차를 진행하면서 느꼈던 것들을 회고해본다.
EventService에서 이벤트 조회수까지 변경관리 하게 되면서 책임이 매우 커졌다. 테스트코드만 해도 300줄이 넘어가기 시작했다.이벤트 기반의 느슨하게 결합된 시스템(Loosely Coupled System)에서는 각 컴포넌트가 '서로를 완벽히 신뢰하지 않는 것'을 전제로 방어적으로 설계되어야 한다.
EventService는 ViewsService가 언제나 즉시 완벽하게 데이터를 만들 것이라고 믿어서는 안 되고
ViewsService는 EventService가 항상 올바른 데이터를 담은 이벤트를 발행할 것이라고 믿어서는 안된다.
INSERT INTO event_view_metric (event_statistic_id, view_date, view_count, created_at, updated_at)
SELECT
DateSeries.event_statistic_id,
DateSeries.metric_date,
0,
NOW(),
NOW()
FROM
(
-- 재귀 쿼리 부분을 FROM 절의 서브쿼리로 이동
WITH RECURSIVE DateSeries_CTE AS (
SELECT
es.event_statistic_id,
CAST(e.registration_start AS DATE) AS metric_date,
CAST(e.event_end AS DATE) AS end_date
FROM
event e
JOIN
event_statistic es ON e.event_id = es.event_id
UNION ALL
SELECT ds.event_statistic_id,
DATE_ADD(ds.metric_date, INTERVAL 1 DAY),
ds.end_date
FROM
DateSeries_CTE ds
WHERE
ds.metric_date < ds.end_date
)
SELECT * FROM DateSeries_CTE
) AS DateSeries
WHERE NOT EXISTS (
SELECT 1
FROM event_view_metric evm
WHERE evm.event_statistic_id = DateSeries.event_statistic_id
AND evm.view_date = DateSeries.metric_date
);
위와 같이 항상 대응쿼리를 수동으로 날릴 수 없다. 그래서 flyway를 도입하나보다..



전반적인 서비스의 기능 개발은 마무리되어간다.
이제 서비스를 지속적으로 운영가능하게 고도화할 때가 온것같다.