사이먼's 코딩노트

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

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

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

simonpark817 2024. 4. 17. 15:47

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

 

hotel_booking_proj/src/main/java/org/example/dao/GuestDao.java at cf1e4f95a21322a8d79d0b82ce982805a65f30f4 · psm817/hotel_booki

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

github.com

 

[Container에 각 Service 추가]

  • 프로그램 제작(8)에 이어서 이번에는 각각의 Service 클래스와 패키지를 추가하여 패키징 분리를 계속해서 진행해봅시다.
  • Service의 역할은 각 Controller에서 Dao를 통해 리스트에 관련된 기능들을 수행하기 전에 그 사이에 거쳐가는 하나의 직원과 같은 역할을 한다.
  • 이렇게 되면 프로그램의 모든 진행 방향이 "Main -> App -> Controller -> 각 Controller -> Container -> 각 Service -> Dao -> 각 Dao" 의 순서대로 진행된다.
  • 먼저, Container에서 각 Service로 연결이 가능하도록 객체 변수를 생성하고 생성자를 통해 객체를 생성한다.  
package org.example.container;

import org.example.dao.BookingDao;
import org.example.dao.GuestDao;
import org.example.dao.RoomDao;
import org.example.service.BookingService;
import org.example.service.GuestService;
import org.example.service.RoomService;

public class Container {
    public static BookingDao bookingDao;
    public static RoomDao roomDao;
    public static GuestDao guestDao;
    public static BookingService bookingService;
    public static RoomService roomService;
    public static GuestService guestService;

    static {
        bookingDao = new BookingDao();
        roomDao = new RoomDao();
        guestDao = new GuestDao();
        bookingService = new BookingService();
        roomService = new RoomService();
        guestService = new GuestService();
    }
}

 

[BookingService 생성]

  • Container에서 각 Service 객체를 생성했다면, 이제는 각각 Service.java 클래스를 구현해야한다.
  • 먼저 BookingService.java 클래스에는 BookingController에서 선언된 메서드의 중복된 사용을 최소화하기 위해서 비슷한 기능들은 하나로 모아 메서드를 선언해주고 BookingDao를 연결하여 해당 메서드를 다시 bookingDao에서 호출할 수 있도록한다.
package org.example.service;

import org.example.Container;
import org.example.dao.BookingDao;
import org.example.dto.Booking;
import org.example.dto.Room;

import java.util.List;

public class BookingService {
    private BookingDao bookingDao;

    public BookingService() {
        bookingDao = Container.bookingDao;
    }

    public Room getRoomsByNum(int roomNum) {
        return bookingDao.getRoomsByNum(roomNum);
    }

    public int getRoomsIndexByNum(int roomNum) {
        return bookingDao.getRoomsIndexByNum(roomNum);
    }

    public int getBookingsByName(String name) {
        return bookingDao.getBookingsByName(name);
    }

    public List<Booking> getForPrintBookings() {
        return bookingDao.getForPrintBookings();
    }
}
  • getRoomsByNum() 메서드는 객실번호를 매개변수로 받아 객실번호를 이용하여 객실의 정보를 가져오는 역할을 한다.
  • getRoomsIndexByNum() 메서드는 객실번호를 매개변수로 받아 객실번호를 이용하여 rooms List의 인덱스 번호를 가져오는 역할을 한다.
  • getBookingsByName() 메서드는 회원 이름을 매개변수로 받아 회원 이름을 이용하여 예약된 bookings List를 정수값으로 가져온다.
  • getForPrintBookings() 메서드는 전체 bookings List를 가져오는 역할을 한다.

 

package org.example.dao;

import org.example.Container;
import org.example.dto.Booking;
import org.example.dto.Room;

import java.util.ArrayList;
import java.util.List;

import static org.example.controller.Controller.loginedGuest;

public class BookingDao extends Dao {
    public List<Booking> bookings;

    public BookingDao() {
        bookings = new ArrayList<>();
    }

    public void add(Booking booking) {
        bookings.add(booking);
        lastId++;
    }

    public Room getRoomsByNum(int roomNum) {
        int index = getRoomsIndexByNum(roomNum);

        if(index != -1) {
            return Container.roomDao.rooms.get(index);
        }

        return null;
    }

    public int getRoomsIndexByNum(int roomNum) {
        int i = 0;

        for(Room room : Container.roomDao.rooms) {
            if((room.floor * 100 + room.id) == roomNum) {
                return i;
            }
            i++;
        }

        return -1;
    }

    public int getBookingsByName(String name) {
        int sum = 0;

        for(Booking booking : bookings) {
            if(booking.guestName.equals(name)) {
                sum++;
            }
        }

        return sum;
    }

    public List<Booking> getForPrintBookings() {
        List<Booking> forPrintBookings = new ArrayList<>();

        for (Booking bookedAllRoom : bookings) {
            for (int j = 0; j < Container.roomDao.rooms.size(); j++) {
                Room foundAllRoom = Container.roomDao.rooms.get(j);
                int roomId = foundAllRoom.floor * 100 + foundAllRoom.id;

                if (bookedAllRoom.regDate.equals(foundAllRoom.bookingDate) && bookedAllRoom.roomId == roomId && loginedGuest.name.equals(bookedAllRoom.guestName)) {
                    forPrintBookings.add(bookedAllRoom);
                }
            }
        }

        return forPrintBookings;
    }
}
  • 이처럼 BookingService에서 선언된 메서드들은 모두 BookingDao에서 실제 동작을 하게 되고, BookingController에서 private로 선언한 지역 메서드들은 모두 삭제해준다.

 

 

 

반응형