프로젝트는 마무리 되었지만,
제가 구현한 Reservation 기능에서 필요 없는 과정으로 인한 성능 저하가 발생할 수 있다는 피드백을 받았습니다.
그래서 코드 리팩토링을 해보기로 했습니다.
수정 사항 1
| Application |
public static void makeReservation() throws Exception {
List<Bank> banks = bankController.findAllBanks();
int showBankChoice = ConsoleUtility.promptForChoice("위의 지점중 예약할 지점을 선택해주세요", 1, banks.size());
int choseBankId = banks.get(showBankChoice - 1).getId();
// ↓ 수정할 포인트
List<Reservation> reservations = reservationController.findAllReservationsById(choseBankId);
reservationController.printAvailableTime(reservations, choseBankId, banks);
int choseReservationTime = ConsoleUtility.promptForChoice("위의 시간중 예약할 시간을 입력해주세요", 8, 15);
...
}
}
List<Reservation> reservations = reservationController.findAllReservationsById(choseBankId);
reservationController.printAvailableTime(reservations, choseBankId, banks);
모든 예약을 List로 들고와서 이 List를 다시 가능한 시간을 출력하는 메소드에 전달하는 방식으로 구현했지만
굳이 이 과정이 필요할까 라는 생각이 들었습니다.
그냥 printAvailableTime 메소드 하나로 두 기능을 묶어버리면 코드도 간결해지고 성능도 더 좋아질것이라는 판단을 하였고 코드를 수정했습니다.
수정 결과
| Application |
public static void makeReservation() throws Exception {
List<Bank> banks = bankController.findAllBanks();
int showBankChoice = ConsoleUtility.promptForChoice("위의 지점중 예약할 지점을 선택해주세요", 1, banks.size());
int choseBankId = banks.get(showBankChoice - 1).getId();
// 해당 코드 삭제, printAvailableTime으로 넘겨주는 List파라미터 삭제
reservationController.printAvailableTime(choseBankId, banks);
int choseReservationTime = ConsoleUtility.promptForChoice("위의 시간중 예약할 시간을 입력해주세요", 8, 15);
...
}
}
| ReservationService |
@Override
public void printAvailableTime(int choseBankId,List<Bank> banks) throws Exception {
List<Reservation> reservations = reservationRepository.findAvailableReservationsByBankId(choseBankId);
System.out.println("* "+banks.get(choseBankId-1).getName()+"의 예약 가능한 시간");
String availableTimes = IntStream.rangeClosed(9, 15)
.filter(time -> reservations.stream()
.noneMatch(reservation -> reservation.getReservationTime() == time))
.mapToObj(Integer::toString)
.collect(Collectors.joining(", "));
System.out.print(availableTimes);
}
Service단에서 예약 가능한 시간을 모두 출력해주도록 수정하였습니다.
수정 사항 2
| ReservationRepository |
@Override
public boolean isAvailableTime(int choseBankId,int choseReservationTime) throws Exception {
List<Reservation> reserved = new ArrayList<>();
String sql = "SELECT * FROM Reservation WHERE bankId ="+choseBankId+" and reservationTime = "+choseReservationTime;
try (Connection conn = DB.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
reserved.add(extractReservation(rs));
}
}
if(reserved.size()==0){
return true;
}
return false;
}
위의 코드는 중복을 확인하는 코드입니다.
사용자가 원하는 지점과 예약시간을 입력하면 database에서 같은 지점과 예약시간이 있으면 결과를 반환하고
이것의 길이가 0이면 중복이 없는걸로 판단하고 true를 반환,
길이가 1이상이면 중복이 있은것으로 판단하고 false를 반환하는 메소드입니다.
하지만 이 과정에서 reserved.add(extractReservation(rs)); 결과를 reserved List에 add를 하는것이
필요없는 과정이였고 만약 결과가 많을 경우 심각한 성능 저하를 불러일으킬 수도 있겠다는 생각을 하였습니다.
그래서 이부분을 리팩토링을 하기로 했습니다.
수정 결과
@Override
public boolean isAvailableTime(int choseBankId,int choseReservationTime) throws Exception {
String sql = "SELECT * FROM Reservation WHERE bankId ="+choseBankId+" and reservationTime = "+choseReservationTime;
try (Connection conn = DB.getConnection();
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery()) {
if(rs.next()){
return false;
}else{
return true;
}
}
}
그냥 조회 결과로 가져온 결과가 있으면 바로 false를 반환하고 없으면 true를 반환하는 방법으로 더욱 간단하게 구현 가능했습니다.
느낀점
sql쿼리로 최대한 원하는 결과로 줄인 뒤 데이터를 다루는것이 매우 중요하다는 것을 절실하게 느꼈던 프로젝트였습니다.
sql로 결과를 최대한으로 줄이지 않으면 로직으로 매우 복잡해지고 귀찮은 과정을 거쳐야했기 때문입니다.
성능도 sql로 결과를 최대한으로 줄이는것이 더 좋기때문에
다음 프로젝트 부턴 sql을 최대한 잘 활용하는것을 목표로 하려고 합니다.
또한, 프로젝트 외적으로도 느낀것이 하나 더 있습니다.
팀원 모두가 열심히 했지만, 제가 맡았던 부분에서의 부족함으로 인해 팀원들의 노력이 빛을 보지 못한 것 같아 마음이 좋지 않았습니다.
앞으론 팀원들의 노력에 피해가 가지 않도록 기능이 완성되었다고 해도 더 나은 방향은 없는지,
놓친 부분은 없는지 더욱 깊게 생각해보는 노력이 필요하다고 느꼈고,
코드 한줄 한줄에 책임감을 가져야겠다고 다짐할 수 있었던 프로젝트였습니다.
'🚀Project' 카테고리의 다른 글
| [최종프로젝트] 1일차 회고 (0) | 2024.07.03 |
|---|---|
| Trouble Shooting (0) | 2024.04.22 |
| [은행시스템] 최종 #4 (0) | 2024.03.31 |
| [은행시스템] 방문 예약 기능 #3 (0) | 2024.03.31 |
| [은행시스템] 모든 지점 조회 기능 #2 (0) | 2024.03.31 |