본문 바로가기
TIL

[231029] 팀 과제 수정

by 진진리 2023. 10. 29.
728x90
  • 팀 과제 수정

어젯밤에 했던 팀 과제 수정 내용을 정리해보고자 한다.

 

우선 문제사항은 필수 요구사항 중 하나인 '객실은 하루에 한 명만 예약이 가능하다'를 팀 과제를 설계할 때 깊게 고려하지 않았다는 점이었다.

예약 클래스에 예약 시간을 넣기는 했지만 실질적으로 예약 시간을 고려하거나 사용하는 메소드가 빠져있었다.

따라서 추가해야 하는 기능은 다음과 같았다.

  • 이미 하루가 지난 예약의 방은 예약 가능하도록
  • 이미 하루가 지난 예약은 취소하지 못하도록

또한 수정해야 하는 오류는 다음과 같았다.

  • 장바구니에 방을 넣으면 해당 방을 예약 확정하지 않았기 때문에 예약 가능 목록에 표시됨
  • 예약을 취소해도 해당 방이 예약 가능 목록에 표시되지 않음

 

일단 추가해야 하는 첫 번째 기능을 추가하기 위해

예약이 지났는지 검사하고 지났다면 방의 reserved 필드를 false로 수정하는 메소드 resetReserved()를 RoomService 클래스에 추가하였다. 또한 이 메소드를 HotelLounge에서 메인화면을 출력하기 전마다 수행하도록 했다. 

 

처음에는 resetReserved() 메소드 내에서 예약이 하루가 지났는지 검사하여 reserved 필드를 세팅하도록 코드를 구현하였다. 그런데 이후의 다른 코드 부분에서 날짜를 보지않고 reserved만 가지고 예약 여부를 판단해버리면 예약 기간이 지난 방에 대하여 다시 예약을 하여 reserved가 true가 된 경우 기한이 지난 예약까지 다시 살아나 버리는 문제가 발생하였다.

따라서 방의 reserved만으로 예약 가능 여부를 판단하지 않도록 방의 예약 기간이 끝났는지 검사하는 기능을 Reservation 클래스의 isPassed() 메소드로 따로 분리하였다.

 

추가해야 하는 두 번째 기능을 위해

ReservationOutput 클래스에서 해당 고객의 예약 목록에서 기한이 지난 예약만 있다면 취소 목록을 보여주지 않도록 하였다.

기한이 지난 예약과 지나지 않은 예약이 모두 있는 경우 스트림의 filter를 추가하여 isPassed()가 false인 예약 내역만 보여주도록 하였다.

 

수정해야 하는 첫 번째 오류를 위해

장바구니에 방을 넣으면 해당 방의 reserved를 true로 변경하였고 방을 뺄 때에는 false로 변경하도록 코드를 추가하였다.

또한  두 번째 오류를 수정하기 위해 확정된 예약을 취소하는 경우에도 reserved를 false로 변경하도록 추가하였다.

즉, 장바구니에 넣은 방이 아직 예약이 확정되지 않았어도 예약하는 화면에서 '예약 완료'라고 표시하여 같은 사용자가 중복된 예약을 하지 못하도록 하였다.

 

 

추가로 코드를 리팩토링 하였는데 그 목록은 다음과 같다.

  • 데이터베이스 클래스들을 싱글톤 패턴으로 수정
  • 관리자 목록 조회에서 출력 문장을 '현재 예약된 모든 객실을 조회'에서 '모든 예약 내역을 조회'로 수정
  • 관리자 목록 조회에서 예약 시간도 함께 보여주도록 추가

 

싱글톤 패턴은 지난 시간에 공부한 내용을 바탕으로 시도했는데 다른 팀원분들께서 맞다고 해주셔서 뿌듯했다. 중간에 한 데이터베이스의 생성자를 private로 만드는 것을 빼먹어버리는 바람에 추가했다.

 

그 외 다른 팀원분들께서 수정하신 내용은 다음과 같다.

  • 마이 페이지 출력 화면 추가
  • 예약 날짜 출력 시 시간은 제외하도록 포맷 설정
  • 확정된 예약을 취소하는 경우 호텔의 수입 감소 & 고객의 소지금 증가

 

이제 남은 주말 동안 출력 칸 맞추기 등 각자 맡은 코드를 리팩토링하여 PR을 올리면 월요일에 최종 수정하여 마감하기로 하였다.

 

한글 출력을 할 때 줄 맞추기가 잘 되지 않는 문제는 검색해본 뒤 다음 코드를 추가하여 이용했다.

    private int getKorCnt(String kor) {
        int cnt = 0;
        for (int i = 0; i < kor.length(); i++) {
            if (kor.charAt(i) >= '가' && kor.charAt(i) <= '힣') {
                cnt++;
            }
        }
        return cnt;
    }

    public String convert(String word, int size) {
        String formatter = String.format("%%%ds", size - getKorCnt(word));
        return String.format(formatter, word);
    }

그런데 줄이 완전히 잘 맞 떨어지지는 않았다.

 

 

소감: 사실 다양한 기능들을 더 추가하고 싶은 마음도 있었는데 화요일부터 약 일주일 동안 설계 및 구현과 함께 아직 익숙하지 않는 깃허브를 이용하면서 협업하는 데에는 조금 시간이 부족했었던 것 같다.

자바의 다형성이나 추상화라는 특징을 잘 살리지 못한 점도 마음에 걸리지만 그래도 일단을 설계한 내용까지는 잘 구현해서 이번 팀 프로젝트를 마무리하고 싶다.