nonneng.ee
Daeun-rithm
nonneng.ee
전체 방문자
오늘
어제
  • 분류 전체보기 (51)
    • Back-end (17)
      • Server (3)
      • Database (3)
      • Spring (9)
      • Node.js (1)
    • Book (1)
      • 이펙티브 자바 (0)
      • 대규모 시스템 설계 (1)
    • Algorithm (1)
      • Greedy, Implementation (6)
      • Dynamic Programming (5)
      • Data Structure (3)
      • Sorting (2)
      • Concept (1)
    • TIL (11)
    • Software (3)
      • Design Pattern (3)
    • Computer Science (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 이펙티브 자바
  • API
  • 에러
  • jwt
  • 우분투
  • 파이썬
  • 아이템9
  • 컴파일설치
  • 아이템 25
  • Restful API
  • JPA
  • 자바
  • 구현
  • 서버
  • Spring
  • 구동원리
  • Java
  • APM
  • MySQL
  • 수동설치
  • 가상머신
  • 소스설치
  • 아이템8
  • 백준
  • 아이템 23
  • node js
  • 아이템6
  • DP
  • Postman
  • 브루트포스

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
nonneng.ee

Daeun-rithm

[Spring/fairer] 반복 기능 api 설계
Back-end/Spring

[Spring/fairer] 반복 기능 api 설계

2023. 1. 20. 16:08

반복 기능은 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)
  • 조회 :
    1. 해당 날짜에 포함되는 집안일(반복x) 조회
    2. rrule 형태로 저장된 recurrency_pattern을 파싱하여 시작 날짜~종료 날짜 안에 해당 날짜가 포함된 집안일 조회
    3. exception 테이블에서 리턴할 집안일이 등록되어 있는지 확인 후 제거
  • 수정 :
    • 단일 업데이트 → exception 테이블에 해당 날짜를 등록하고, 단일 집안일 생성
      특정 시점 이후 일괄 업데이트 → 기존 집안일의 end_date 수정, 특정 시점 이후 집안일 새로 등록
  • 삭제 :
    • 단일 삭제 → exception 테이블에 해당 날자 등록
      특정 시점 이후 일괄 삭제 → 기존 집안일의 end_date 수정

(참고 : 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_id를 통한 삭제
      특정 시점 이후 일괄 삭제 → recurrence 테이블의 end date 수정

이렇게 반복될 때마다 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 생성
  • 삭제 :
    • 단일 삭제 → end_date 수정, 이후 반복 housework 생성(수정과 동일)
      특정 시점 이후 일괄 삭제 → end_date 수정

최종적으로, 의견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
    'Back-end/Spring' 카테고리의 다른 글
    • [Spring/fairer] 반복 기능 api 개발 - 조회
    • [Spring/Data JPA] 인터페이스 기능
    • [Spring/Data JPA] 프로젝트 환경설정
    • [Spring] 스프링 Bean과 의존관계 - 컴포넌트 스캔 & 자동 의존관계 vs 스프링 Bean 직접 등록
    nonneng.ee
    nonneng.ee

    티스토리툴바