TIL - 2022.11.29

자라나는 ㅇㅅㅇ개발자·2022년 11월 29일
0

TIL

목록 보기
22/126

2차 미니 프로젝트 - 호텔 예약 하기



트러블 슈팅

Before Refactoring

public String requestReservation(int roomNo, String userName, String userPhone, String date) {
	for (Room room : getBookableRoomList(date)) {
    	if (room.getRoomNo() == roomNo) {
        	for (User user : userRepository.getUserList()) {
            	if (user.getUserName().equals(userName) && user.getUserPhone().equals(userPhone)) {
                	if (user.getUserAsset() >= room.getPrice()) {
                    	int updateUserAsset = user.getUserAsset() - room.getPrice();
                        user.setUserAsset(updateUserAsset);
                        Reservation reservation = reservationRepository.createReservation(room, userName, userPhone, date);
                        putHotelAsset(reservation.getRoom().getPrice());
                        return reservation.getReservationId();
                    } else {
                        return "잔액부족";
                    }
                }
            }
        } else {
        	return "예약실패";
        }
    }
    return "까꿍";	// -> 어차피 return되지 않을거라 생각해서 아무 값이나 넣어둫
}

for문으로 예약 가능한 방 리스트들 중에 선택한 방을 찾는 코드였는데
나는 처음엔 당연히 위에 코드와 같이 if문에 else return "예약실패"를 해야 if문 조건에 일치하지 않으면 else로 "예약실패"가 될거라 생각했다.
하지만 코드를 병합하고 실행을 해보니 방번호를 비교하는 if문에서 for문으로 돌아가는 방 리스트들 중 첫번째 방이 조건에 일치하지 않다면 for문이 마저 돌지 않고 바로 else return "예약실패"로 빠져버리게되어 방 리스트의 첫번째 배열인 1번방만 예약이 가능하고 나머지는 모두 예약 실패가 되어버리는 상황이 발생하였다.


After Refactoring

public String requestReservation(int roomNo, String userName, String userPhone, String date) {
	for (Room room : getBookableRoomList(date)) {
    	if (room.getRoomNo() == roomNo) {
        	for (User user : userRepository.getUserList()) {
            	if (user.getUserName().equals(userName) && user.getUserPhone().equals(userPhone)) {
                	if (user.getUserAsset() >= room.getPrice()) {
                    	int updateUserAsset = user.getUserAsset() - room.getPrice();
                        user.setUserAsset(updateUserAsset);
                        Reservation reservation = reservationRepository.createReservation(room, userName, userPhone, date);
                        putHotelAsset(reservation.getRoom().getPrice());
                        return reservation.getReservationId();
                    } else {
                        return "잔액부족";
                    }
                }
            }
        }
    }
    return "예약실패";
}

때문에 위에 코드와 같이 처음 for문 안에 모든 조건문과 반복문이 실행되고, 거기에 해당되지 않는 것들을 retrun "예약실패" 되도록 수정하였다.


코드가 중복으로 반복되다보니 제대로 판단하지 못했고 직접 실행을 해보니 알 수 있는 오류였다.
가능한 반복문의 중복은 피하고 그렇게 되더라도 주의깊게 한다는걸 배웠고, TDD라는 개념이 이런 오류를 줄이기 위해 필요하다는 것을 직접 경험해볼 수 있었다.



아쉬웠던 것 / 다음에 시도해보고 싶은 것

코드를 작성하는 도중에 전체적인 코드의 흐름을 놓쳐 의미없이 시간을 소비한 적이 있었는데
물론 프로젝트 시작 전에는 시간을 소모하긴 하겠지만
한눈에 이해를 할 수 있도록 프로젝트 시작 전에 다이어그램이나 순서도를 그려보는 방법을 시도해보고 싶다.



느낀점

저는 처음 프로젝트를 시작하고 1일차 메모장에서부터도 이해를 따라가지 못해 어려움이 많았습니다.
매번 하는 말이지만... 포기할까 생각을 많이했었는데 팀원분들이 도움을 많이주셔서 끝까지 함께할 수 있었습니다.

0개의 댓글