사이먼's 코딩노트
[Java] 호텔 예약 관리 프로그램 제작(18) 본문
[호텔 예약 관리 프로그램 제작]
- 작성된 모든 코드는 저의 깃허브 리포지터리에서 확인하실 수 있습니다.
- 깃허브 리포지터리 주소 : https://github.com/psm817/hotel_booking_proj
[리뷰 조회 구현]
- 리뷰 작성이 구현이 완료가 되었으니 이번에는 프로그램에 방문한 모든 사람이 작성된 리뷰를 볼 수 있도록 조회하는 기능을 추가하려한다.
- 아래 코드는 ReviewController에서 리뷰를 조회하는 review list를 구현하기 위해 작성된 코드이다.
- 현재 기능에 필요한 코드만 담고 나머지 코드들은 생략되어 있다는 점 참고 부탁드립니다.
package org.example.controller;
import org.example.container.Container;
import org.example.dto.Booking;
import org.example.dto.Guest;
import org.example.dto.Review;
import org.example.service.BookingService;
import org.example.service.GuestService;
import org.example.service.ReviewService;
import org.example.util.Util;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;
public class ReviewController extends Controller{
private Scanner sc;
private ReviewService reviewService;
private GuestService guestService;
private BookingService bookingService;
private Session session;
public ReviewController() {
sc = new Scanner(System.in);
reviewService = Container.reviewService;
guestService = Container.guestService;
bookingService = Container.bookingService;
session = Container.getSession();
}
public void doAction(String cmd, String actionMethodName) {
switch(actionMethodName) {
case "list" :
viewList();
break;
case "write" :
doWriteReview();
break;
default :
System.out.println("존재하지 않는 서비스입니다.");
break;
}
}
public void viewList() {
List<Review> forPrintReviews = reviewService.getForPrintReviews();
double sumScore = 0;
System.out.printf("============= 최근 리뷰 [%d]개 =============\n", forPrintReviews.size());
for(int i = forPrintReviews.size() - 1; i >= 0; i--) {
Review review = forPrintReviews.get(i);
sumScore += review.score;
}
System.out.printf("평균 평점 : [%1.1f]점\n", sumScore/forPrintReviews.size());
System.out.println("번호 | 객실번호 | 평점 | 작성자ID | 내용");
for(int i = forPrintReviews.size() - 1; i >= 0; i--) {
Review review = forPrintReviews.get(i);
Booking replyBooking = bookingService.getForPrintBooking(review.bookingId);
Guest replyGuest = guestService.getGuestByName(replyBooking.guestName);
System.out.printf("%4d | %6d | %1.1f | %6s | %s\n", review.id, replyBooking.roomId, review.score, replyGuest.loginId, review.body);
}
System.out.println("===========================================");
}
}
- App에서 reviewController와 연결되면 doAction을 통해 list 명령어를 받아 viewList() 메서드를 호출하도록 한다.
- 리뷰 조회는 회원이든 아니든 누구나 조회가 가능하기 때문에 따로 session을 통해 로그인 된 회원의 정보를 불러올 필요는 없다.
- [List<Review> forPrintReviews = reviewService.getForPrintReviews();] 코드를 통해 작성된 모든 리뷰를 가져온다.
- 사용자들에게 제공되는 리뷰 내용은 예약번호, 객실번호, 평점, 작성자ID, 내용이다.
- 여기서 주의할 점은 score는 double 타입이기 때문에 출력문 작성할 때도 서식지정자를 맞게 사용해야한다.
- 다음은 ReviewService.java에 추가 작성된 코드이다.
package org.example.service;
import org.example.container.Container;
import org.example.dao.ReviewDao;
import org.example.dto.Review;
import java.util.List;
public class ReviewService {
private ReviewDao reviewDao;
public ReviewService() {
reviewDao = Container.reviewDao;
}
public int doWrite(int answerId, int guestId, String reviewBody, double score) {
return reviewDao.doWrite(answerId, guestId, reviewBody, score);
}
public List<Review> getForPrintReviews() {
return reviewDao.getForPrintReviews();
}
}
- ReviewService.java 에서는 getForPrintReviews() 라는 메서드를 생성하고, 해당 메서드는 다시 ReviewDao에게 실질적인 기능을 수행하도록 한다.
- 다음은 ReviewDao.java에 추가 작성된 코드이다.
package org.example.dao;
import org.example.container.Container;
import org.example.db.DBConnection;
import org.example.dto.Review;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class ReviewDao extends Dao {
public List<Review> reviews;
private DBConnection dbConnection;
public ReviewDao() {
reviews = new ArrayList<>();
dbConnection = Container.getDBConnection();
}
public int doWrite(int answerId, int guestId, String reviewBody, double score) {
StringBuilder sb = new StringBuilder();
sb.append(String.format("INSERT INTO review "));
sb.append(String.format("SET regDate = NOW(), "));
sb.append(String.format("bookingId = %d, ", answerId));
sb.append(String.format("guestId = %d, ", guestId));
sb.append(String.format("`body` = '%s', ", reviewBody));
sb.append(String.format("score = '%1$f' ", score));
return dbConnection.insert(sb.toString());
}
public List<Review> getForPrintReviews() {
StringBuilder sb = new StringBuilder();
sb.append(String.format("SELECT * FROM review "));
List<Review> reviews = new ArrayList<>();
List<Map<String, Object>> rows = dbConnection.selectRows(sb.toString());
for(Map<String, Object> row : rows) {
reviews.add(new Review(row));
}
return reviews;
}
}
- 최종적으로 ReviewDao.java 에 도달하게 되면 메서드의 기능을 확인할 수 있다.
- getForPrintReviews() 메서드는 DB 쿼리문을 통해 모든 리뷰 목록을 조회하는 기능을 수행한다.
- StringBuilder를 통해 쿼리문을 차례로 작성하고, 지금 같은 경우는 "SELECT * FROM review" 라는 쿼리문을 통해 리뷰를 조회한다.
- SELECT 문을 통해 조회가 완료된다면 dbConnection과 연결하여 selectRows() 메서드를 실행하고 반복문을 통해 회원들이 작성한 리뷰 목록이 2개 이상이라면 reviews List에 로컬 데이터가 아닌 DB 데이터를 add한다.
- 실제로 DB를 통해 모든 리뷰 목록이 조회가 완료되면 ReviewController.java에서 출력문에 맞게 사용자들에게 리뷰를 보여준다.
반응형
'프로젝트 > [Java] 호텔 예약 관리 프로그램 제작' 카테고리의 다른 글
[Java] 호텔 예약 관리 프로그램 시연 영상 (0) | 2024.04.19 |
---|---|
[Java] 호텔 예약 관리 프로그램 제작(19) (0) | 2024.04.18 |
[Java] 호텔 예약 관리 프로그램 제작(17) (1) | 2024.04.18 |
[Java] 호텔 예약 관리 프로그램 제작(16) (1) | 2024.04.18 |
[Java] 호텔 예약 관리 프로그램 제작(15) (1) | 2024.04.18 |