사이먼's 코딩노트

[Java] 호텔 예약 관리 프로그램 제작(18) 본문

프로젝트/[Java] 호텔 예약 관리 프로그램 제작

[Java] 호텔 예약 관리 프로그램 제작(18)

simonpark817 2024. 4. 18. 18:03

[호텔 예약 관리 프로그램 제작]

 

GitHub - psm817/hotel_booking_proj

Contribute to psm817/hotel_booking_proj development by creating an account on GitHub.

github.com

 

[리뷰 조회 구현]

  • 리뷰 작성이 구현이 완료가 되었으니 이번에는 프로그램에 방문한 모든 사람이 작성된 리뷰를 볼 수 있도록 조회하는 기능을 추가하려한다.
  • 아래 코드는 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에서 출력문에 맞게 사용자들에게 리뷰를 보여준다.

 

 

반응형