반복 기능은 fairer를 개발하며 가장 신경써야할 부분이 많았던 기능이다. 일/주/월 단위로 반복되는 집안일을 관리해야하고, 수정&삭제를 할 때에도 반복 일정 모두 삭제/오늘 일정만 삭제/ 앞으로 예정된 집안일만 삭제 등 선택지가 많았다. 반복기능을 어떻게 개발할 것인지 설계하는 데에만 몇 주를 사용했던 것으로 기억한다. 4명의 의견이 모두 달랐어서 신기했고, 배울점도 많았던 기능이다.
의견1
새로운 테이블을 추가하지 않고, 기존 housework 테이블에 주기 칼럼만 추가
- 생성 : 기존 집안일 생성과 동일, 주기 칼럼에 주기만 추가하여 생성
- 조회 :
- 해당 날짜에 포함되는 집안일(반복x) 조회
- 반복되는 집안일 중 반복 요일이 같고, 시작 날짜~종료 날짜 안에 해당 날짜가 포함된 집안일 조회
- 수정 : 집안일의 end date 수정 + 이후의 수정된 집안일 새롭게 생성
- 삭제 : 집안일의 end date 수정
→ 별도의 테이블을 생성하지 않아 기존 로직에서 크게 수정될 부분이 없고, 실행시간도 가장 단축할 수 있는 방법이다. 하지만 이 방법은 반복 집안일을 모두 하나의 레코드로 관리하기 때문에 각각의 완료 여부를 알 수 없고, 예정된 피드백 기능으로의 확장이 불가능하다는 단점이 있었다.
의견2
recurrence-rule 활용, exception 테이블 생성
housework 테이블에 rrule 형식으로 저장되는 recurrency_pattern 칼럼을 통해 반복을 관리하고, 단일 삭제/수정된 집안일의 경우 exception 테이블에 등록한다.
- 생성 : 기존 집안일 생성과 동일, recurrency_pattern 칼럼에 반복 패턴을 rrule 형식으로 저장 (ex.
FREQ=WEEKLY;WKST=SU;BYDAY=TU,TH
) - 조회 :
- 해당 날짜에 포함되는 집안일(반복x) 조회
- rrule 형태로 저장된 recurrency_pattern을 파싱하여 시작 날짜~종료 날짜 안에 해당 날짜가 포함된 집안일 조회
- exception 테이블에서 리턴할 집안일이 등록되어 있는지 확인 후 제거
- 수정 :
- 단일 업데이트 → exception 테이블에 해당 날짜를 등록하고, 단일 집안일 생성
특정 시점 이후 일괄 업데이트 → 기존 집안일의 end_date 수정, 특정 시점 이후 집안일 새로 등록
- 단일 업데이트 → exception 테이블에 해당 날짜를 등록하고, 단일 집안일 생성
- 삭제 :
- 단일 삭제 → exception 테이블에 해당 날자 등록
특정 시점 이후 일괄 삭제 → 기존 집안일의 end_date 수정
- 단일 삭제 → exception 테이블에 해당 날자 등록
(참고 : https://icalendar.org/iCalendar-RFC-5545/3-8-5-3-recurrence-rule.html)
의견3
recurrence 테이블 추가, housework 테이블에 recurrence pk 추가
이건 내가 구상했던 방법이다.🤔
recurrence 테이블을 생성하여 반복 집안일에 id를 부여한다. pattern 칼럼에는 반복 형식이 rrule 형식으로 저장된다.
기존 housework 테이블에는 recur_id 칼럼을 추가하여 관리한다.
- 생성 : 반복 집안일의 경우, 반복 패턴을 받아서 recurrence 테이블에 등록, 기존 housework 테이블에 recur_id 칼럼만 추가하여 생성
- 조회 : 반복되는 집안일도 반복이 없는 집안일과 똑같이 housework 테이블에 저장되므로 기존 조회와 동일
- 수정 :
- 단일 업데이트 → 해당 housework 개별 수정 후 recur_id 삭제
특정 시점 이후 일괄 업데이트 → recur_id와 scheduled_date를 통해 housework를 찾아서 업데이트
- 단일 업데이트 → 해당 housework 개별 수정 후 recur_id 삭제
- 삭제 :
- 단일 삭제 → 해당 housework_id를 통한 삭제
특정 시점 이후 일괄 삭제 → recurrence 테이블의 end date 수정
- 단일 삭제 → 해당 housework_id를 통한 삭제
이렇게 반복될 때마다 housework를 생성해놓으면 조회할 때는 편하지만, 상당한 낭비가 될 수 있다.
의문1. housework의 end_date가 null일 경우 어떻게 할 것인가
예를 들어 화, 목 반복하는 집안일을 end_date 없이 등록한다면, 아직 조회되지도 않았고 추후에 삭제되거나 수정될 수도 있는 집안일을 매주 2개씩 만들어 놓아야 한다는 것이다.
→ 굳이 보완점을 찾아보자면 spring-batch를 통해 주기적으로 집안일을 생성해놓는 방법이 있을 것이다.
의문2. 특정 시점 이후 일괄 업데이트를 진행하면, 미리 생성해놓은 집안일을 모두 수정해야 하는 것인가
: 이 방법에 대하여, 미리 housework를 다 생성해놓지 말고 해당 집안일 조회 요청이 들어왔을 때 housework를 생성하고 바로 리턴하는 방법에 대해서도 추후에 논의되었다. 이렇게 되면 의문1, 2 가 모두 해결되고, 다른 방법에 비해 수정과 삭제도 간단해진다!
의견4
집안일 주기 테이블, 집안일 완료 테이블 생성
집안일 테이블에 주기 관련 칼럼을 추가하여 저장하고, 집안일 완료 테이블을 두어 housework_id, success_datetime 을 저장한다.
- 생성 : 기존 집안일 생성과 동일, 반복 집안일일 경우 주기 칼럼 추가
- 조회 : 반복 집안일일 경우 주기 테이블 조회 → 완료 테이블 조회 (완료 테이블에 데이터가 있을 경우 완료)
- 수정 : housework 테이블, 주기 테이블 업데이트
- 단일 업데이트 → 단일 housework 생성
특정 시점 이후 일괄 업데이트 → end_date 수정, 이후 반복 housework 생성
- 단일 업데이트 → 단일 housework 생성
- 삭제 :
- 단일 삭제 → end_date 수정, 이후 반복 housework 생성(수정과 동일)
특정 시점 이후 일괄 삭제 → end_date 수정
- 단일 삭제 → end_date 수정, 이후 반복 housework 생성(수정과 동일)
최종적으로, 의견4 + 의견2의 exception 테이블을 합쳐서 개발하기로 했다.
- housework 테이블에 집안일의 반복 여부와 상관없이 레코드를 여러개 생성하지 않아도 되고
- exception 테이블을 통해 반복 집안일을 단일 업데이트, 삭제할 때 훨씬 간편하게 관리할 수 있게 된다.
- housework_complete 테이블을 통해 피드백 등의 추가적 기능들에 대한 확장성도 높일 수 있다.
'Back-end > Spring' 카테고리의 다른 글
[Spring/fairer] 반복 기능 api 개발 - 조회 (0) | 2023.01.23 |
---|---|
[Spring/Data JPA] 인터페이스 기능 (0) | 2022.07.26 |
[Spring/Data JPA] 프로젝트 환경설정 (0) | 2022.05.26 |