정글에서 온 개발자

[연차 촉진 시스템]휴가 신청서로 휴가 다루기, 문제와 해결방법 고찰 본문

정리

[연차 촉진 시스템]휴가 신청서로 휴가 다루기, 문제와 해결방법 고찰

dev-diver 2024. 6. 20. 16:23

기존 방법

  • 기존에는 휴가 신청서라는 개념 없이, 휴가를 개별 등록하고 개별 승인 받도록 하였다.

요구 사항과 문제상황

  • 하지만, 프로젝트를 진행하면서 ‘휴가 신청서’를 받고, 결재(1차, 2차)를 하고, 필요할 때 한번에 출력 (관공서 제출용) 하고 싶다는 요청이 있었다.
  • 기존에 휴가를 단일하게 관리하면, 승인,반려 취소시 엔티티 하나만 신경 쓰면 됐다. 하지만 ‘휴가 신청서’라는 더 큰 객체에 휴가가 포함이 돼버리면 휴가 신청서 전체의 승인과, 개별 휴가의 승인을 개별로 관리해야 한다.
  • 또 다른 문제는 휴가의 ‘변경과 취소’ 다. 이럴 때 종이 서류로 처리할 경우, 어떤 휴가를 어떻게 바꾸고 싶고, 어떤 휴가를 취소하고 싶은지 ‘변경 신청서’ 를 새로 쓰면, 그 신청서에 따라서 기존 휴가를 조정하거나 삭제한다.
  • 이 때 주의해야 할 점은, 휴가를 변경하더라도 기존의 신청서는 내용이 그대로 남아 있어야 한다는 것이다. 말 그대로 ‘기록과 보관용’ 서류이기 때문이다.

해결 방법

1. 휴가 하나당 신청서 하나 쓰기

  • 장: 구현이 쉽다. 테이블을 새로 안 만들어도 된다.
  • 단: 승인할 때 번거롭고 제출용으로 너무 많은 서류가 생산된다.

해결방법 

  • 승인은 한 화면에 모아서 보여주면 좀 낫긴하다.
    • 문제점: 서류 하나를 통으로 승인한다는 개념은 없다.
  • 제출용 서류를 조합할 때, 변경 이력이 추적이 된다면 같은 날짜(시간)에 신청한 휴가끼리 모아서 뽑으면 된다.

2. 휴가’들을’ 제출시, 신청서 하나 쓰기

  • 장 : 의미 그대로 ‘신청서’ 레코드를 생성하기 때문에 구현 로직이 비즈니스 로직이랑 비슷하다.
  • 단: 테이블을 새로 만들어야 한다. 신청서 승인을 따로 관리 해야 한다. 기존 휴가 변경,취소 관리가 복잡하다.

해결방법 1 - 취소, 변경시 같은 신청서의 휴가 모두 취소  

  • 가장 무식하지만 확실한 방법이다.
  • 단: 공간 소모가 크다. 취소 하나 때문에, 다른 휴가들을 모두 다시 신청해야 한다.

해결 방법 2 - 변경시 기존 휴가 취소

  • 휴가 신청서(휴가 계획서) 테이블을 만들고, 신청 휴가 엔티티가 해당 신청서의 ID 를 들고 있게 한다.
  • 휴가 변경시에도 ‘취소’로 관리한다. 즉. 휴가 변경시, 기존 휴가는 취소되고, 새로운 휴가가 생성되는 것이다.

문제점 

  • 변경이 취소될 수도 있다. - 변경 신청이 반려될 수도 있어서, 반려시 기존 휴가를 원복할 수 있는 방법이 필요하다.

개선점:

  • 변경시마다 새로운 휴가들이 생성되어 공간 소모가 크다.

해결방법

  • 변경을 바로 취소 하지 않고, ‘변경 요청’ 으로 휴가의 상태를 바꾼다.
    • 새로운 신청이 받아들여지는 경우 ‘취소’ 상태로 확실하게 바꾼다.
      • 이 때, 새로운 신청이 어떤 휴가를 취소처리 해야할지 알고 있어야 한다.
      • 이를 위해 변경 신청서, 취소 신청서를 따로 만들어 휴가를 컨트롤한다.
      • 개선점: ‘변경 신청서’ 테이블을 따로 만들지 않고 ‘휴가 신청서’ 테이블을 함께 쓸 수 있을 것 같다.
    • 새로운 신청이 반려되는 경우 기존 상태로 돌아간다.
      • 기존 상태를 추적해야 하는 문제가 있다. → 취소 요청용 상태를 하나 더 만들어서 ‘기본’, ‘취소 요청’, ‘취소’ 의 상태를 주는 방법이 있다.

개선방법

  • 기능이 아닌 성능 문제기 때문에 구현 후순위다.
  • 아직 승인되지 않은 신청서에서는 취소가 아닌 변경이 되도록 하고, 신청서의 승인 상태를 초기 상태로 되돌린다.
    • 문제점: 엄밀하게 ‘모든 기록’을 하는 것은 아니다.

최종 방법

  • 휴가 신청서 테이블을 따로 만든다.
  • 이 테이블에 ParentApplicationID를 가진 ‘취소 신청서’까지 함께 저장한다.
  • 휴가 취소시 휴가의 취소 필드를 ‘취소 요청’ 상태로 변경 후 , 취소 신청서를 작성한다.
  • 휴가 변경시, 기존 휴가를 취소처럼 처리하고, 새로운 휴가를 생성한다. (UI 단에서 표현)
  • 기존 신청서 승인 전 취소, 변경 시 새로 변경신청서가 작성되지 않고, 기존 신청서의 신청 상태 되돌리기, 휴가 변경,삭제가 된다. - 구현의 편의도 있다.
  • 변경 신청서의 휴가를 또다시 변경하는 경우, 변경 신청서를 기존 신청서처럼 다룬다.
    • 승인 전에는 신청서의 휴가를 변경 가능한다.
    • 취소한 휴가를 다시 돌릴 수 있다.

최종 ERD

최종 ERD