사이먼's 코딩노트

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

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

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

simonpark817 2024. 4. 18. 18:07

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

 

GitHub - psm817/hotel_booking_proj

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

github.com

 

[리뷰 목록 html로 추출 구현]

  • 이번 개인 프로젝트인 호텔 예약 관리 프로그램의 마지막 작업으로 회원이 남긴 리뷰를 html로 추출하는 기능을 추가하려한다.
  • 'export html' 이라는 서비스 명령어와 함께 서비스가 실행됨과 동시에 모든 리뷰 목록을 가져와서 html로 추출하고 누구나 WEB 형식의 html을 확인할 수 있다.
  • export에서는 Dao가 필요없는 이유는 DB를 통해서 가져오는 모든 리뷰 목록은 이미 ReviewDao에서 구현해놨기 때문이다.
  • 기존의 서비스 명령어와는 다르기 때문에 export와 대한 각 Controller, Service를 구현해야한다.

 

  • 먼저 export와 관련된 서비스 명령어가 추가되었기 때문에 App에서 해당 서비스를 구분하고 ExportController와 연결되는 코드를 추가해야한다.
if(controllerName.equals("hotel")) {
    controller = hotelController;
}
else if(controllerName.equals("room")) {
    controller = roomController;
}
else if(controllerName.equals("booking")) {
    controller = bookingController;
}
else if(controllerName.equals("guest")) {
    controller = guestController;
}
else if(controllerName.equals("review")) {
    controller = reviewController;
}
else if(controllerName.equals("export")) {
    controller = exportController;
}
else {
    System.out.println("존재하지 않는 서비스입니다.");
    continue;
}
  • 서비스 이름으로 구분 짓는 부분에서 controllerName.equals("export")를 조건문에 추가하여 사용자가 export로 시작되는 서비스를 입력했을 때 해당 컨트롤러로 연결되도록 한다.

 

  • 다음은 html 추출(export html)과 관련된 기능을 구현하기 위해 ExportController에 코드를 작성한다.
package org.example.controller;

import org.example.container.Container;
import org.example.service.ExportService;

public class ExportController extends Controller {
    private ExportService exportService;

    public ExportController() {
        exportService = Container.exportService;
    }

    public void doAction(String cmd, String actionMethodName) {
        switch(actionMethodName) {
            case "html" :
                doHtml();
                break;
            default :
                System.out.println("존재하지 않는 서비스입니다.");
                break;
        }
    }

    private void doHtml() {
        System.out.println("호텔 숙박 후기 html을 생성하였습니다.");
        exportService.makeHtml();
    }
}
  • App에서 exportController와 연결되면 doAction을 통해 html 명령어를 받아 doHtml() 메서드를 호출하도록 한다.
  • html 추출은 로그인 여부와 관계없이 모두 가능하기 때문에 session을 통한 로그인된 회원을 가져올 필요는 없다.
  • doHtml() 에서는 html을 생성했다는 안내와 함께 바로 [exportService.makeHtml();] 코드를 통해 추출 작업을 exportService라는 직원을 통해 수행한다.

 

  • 다음은 ExportService.java 클래스를 추가하고 새로 작성한 코드이다.
package org.example.service;

import org.example.container.Container;
import org.example.dto.Booking;
import org.example.dto.Guest;
import org.example.dto.Review;
import org.example.util.Util;

import java.util.List;

public class ExportService {
    BookingService bookingService;
    GuestService guestService;
    ReviewService reviewService;

    public ExportService() {
        bookingService = Container.bookingService;
        guestService = Container.guestService;
        reviewService = Container.reviewService;
    }

    public void makeHtml() {
        List<Review> reviews = reviewService.getForPrintReviews();

        for(int i = reviews.size() - 1; i >= 0; i--) {
            Review review = reviews.get(i);
            Booking replyBooking = bookingService.getForPrintBooking(review.bookingId);
            Guest replyGuest = guestService.getGuestByName(replyBooking.guestName);

            String fileName = review.id + "번 리뷰.html";
            String html = "<meta charset=\"UTF-8\">";
            html += "<style>";
            html += "body { font-family: Arial, sans-serif; }";
            html += "div { margin-bottom: 10px; font-weight: bold; }";
            html += ".btn {display: inline-block; margin-right: 10px; }";
            html += "h1 { color: navy; }";
            html += "a { color: inherit; text-decoration: none; }";
            html += "a { display: inline-block; margin-top: 20px; padding: 10px 20px; border-radius: 8px; border: 1px solid black; background-color: #afafaf; }";
            html += "a:hover { background-color: #000; color: #fff; }";
            html += "</style>";
            html += "</head>";
            html += "<body>";
            html += "<h1>숙박 후기</h1>";
            html += "<div>리뷰번호 : " + review.id + "</div>";
            html += "<div>객실번호 : " + replyBooking.roomId + "</div>";
            html += "<div>평점 : " + review.score + " / 5.0" + "</div>";
            html += "<div>작성자ID : " + replyGuest.loginId + "</div>";
            html += "<div>내용 : " + review.body + "</div>";

            if(review.id > 1) {
                html += "<div class=\"btn\"><a href=\"" + (review.id - 1) + "번 리뷰.html\">이전글</a></div>";
            }

            if(review.id < reviews.size()) {
                html += "<div class=\"btn\"><a href=\"" + (review.id + 1) + "번 리뷰.html\">다음글</a></div>";
            }

            Util.writeFileContents("exportHtml/" + fileName, html);
        }
    }
}
  • ExportService는 리뷰를 작성한 회원의 정보, 객실번호를 함께 가져와야 하기 때문에 bookingService와 guestService를 추가해준다.
  • makeHtml() 메서드는 reviewService.getForPrintReviews()를 통해 모든 리뷰를 먼저 리스트에 담아 가져오고, 반복문을 통해 각 리뷰를 쓴 회원의 ID, 리뷰 대상인 객실번호를 반복문을 통해 각각 가져온다.
  • [String fileName = review.id + "번 리뷰.html";] 코드를 통해 추출된 모든 html의 파일의 이름을 "x번 리뷰.html" 로 통일시킨다.
  • 마지막으로 html이라는 문자열 변수를 만들어 html 상에서 보여줄 부분을 코드화시켜준다.
  • 현재 작성된 html은 상단에 css가 포함되어 있는 구조이다.
  • 만약 리뷰의 개수가 1개 이상이라면 이전글과 다음글로 이동할 수 있는 버튼을 생성해주고, 마지막 리뷰에서는 다음글이라는 버튼은 제거한다.

 

  • 지금까지 호텔 예약 관리 프로그램의 구현을 진행해보았는데 코드 작성에 있어서 아직 미숙한 부분이 많습니다.
  • 가볍게 포스팅된 글 봐주시고 혹시 조언해주실 부분이 있다면 언제든지 조언 부탁드립니다.
  • 다음 포스팅에는 완성된 프로그램이 실제 어떻게 동작하는지 사진과 영상을 통해 보여드리겠습니다. 
반응형