티스토리 뷰

728x90
반응형

어쩌다 보니 예약 시스템을 개발하게 되었는데요.

지금 것 참여했던 프로젝트를 보니 쿼리문을 이용해서 달력리스트를 뽑아오는게 대부분이더군요..

그러다보니 유지보수시 쿼리문이 괘랄해지는?? 문제가 생겨 인수인계 받거나 받는 과정에서 문제가 생기더군요...

(어떤 경우는 쿼리가 기본 50줄이 넘어가는...)

그래서 그 경험??을 토대로 쿼리는 단순한 데이터들만 가져오고 서비스단에서 캘린더를 처리하는 방식을 이용하여

유지보수시 코드 가독성에 도움이 되었던 작업내용을 일기처럼 남길까합니다~

 

예약 시스템 정보 :

  • 캘린더 달력에서 예약 가능한 날짜 선택
  • 선택시 팝업창과 함께 사용 가능 시간대 체크리스트가 출력
  • 예약가능 상태의 사용시간대를 체크하여 예약 진행

 

캘린더 생성 방식 종류

  • 달력 테이블을 이용한 달력 형태 생성 방식
  • 해당 월일 리스트를 조회하여 생성 하는 방식
  • 자바를 이용한 캘린더 사용 방식

→ 1 번과 2번의 방식 결과에는 ↓ 와 같다 (query로 캘린더 조회 작업 일 경우)

SQL ) 왼쪽 : 달력형태 출력, 오른쪽 : 월별 리스트 출력

1번과 2번 같이 쿼리를 이용하여 달력 또는 리스트를 생성하여 처리 할 수가 있다.

하지만 해당 쿼리 처리 방식으로 해본 결과 유지보수에 있어서 정말 정말.. 고생하게 된다.

왜냐하면 예약 시스템인 경우 예약 중인 데이터와 예약불가 데이터 휴무일 등.. 여러 조건들이 들어가게 되는데 좀 더 디테일한 구조를 이용하게 될 경우 쿼리 자체가 지저분해지거나, 결과 화면 또한 지저분해보이기도 한다. 그리고 쿼리로 해결되지 못하는 부분들은 서버단에서 진행하게 되는데 그렇게 되면 개발자 입장에서 복잡한 형태의 처리 형태가 생성된다.

 

그래서 선택한 방법은 3번째 서비스(java)에서 캘린더를 생성하여 처리하는 방식을 선택했다.

jdk 8 버전 이후로는 그래도 간단하게 캘린더를 생성할 수가 있고 여러 예약에 조건이 들어갈 경우

디자인 패턴을 통해 유지보수에 있어서 그나마? 보기가 편해진다는 장점이 있는것 같다. (지극히 개인적인 의견)

 

캘린더 생성 예시)

LocalDate startDt = LocalDate.parse("2023-01-01");//월 시작 일자
LocalDate endDt = startDt.withDayOfMonth(startDt.lengthOfMonth()); //월 마지막 일자

//withDayOfMonth : 
// 해당 날짜 객체에서 일 필드를 전달된 새로운 값으로 
// 설정한 새로운 날짜 객체를 반환함
//lengthOfMonth : 해당 날짜 객체의 마지막 일을 숫자로 리턴

int dayCnt = (int)ChronoUnit.DAYS.between(startDt,endDt) + 1;

//월 달력 리스트 생성
List<LocalDate> dtList = IntStream.iterate(0, i->i+1).limit(dayCnt)
.mapToObj(i -> startDt.plusDay(i)).collect(Collectors.toList());

 

다음 글에서 이어집니다.

java 캘린더 예약 시스템 (2) (tistory.com)

728x90
반응형
250x250
반응형
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함