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

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

simonpark817 2024. 4. 17. 15:25

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

 

2개 이상 예약했을 때 원하는 예약 삭제 가능 구현 · psm817/hotel_booking_proj@98268d2

psm817 committed Apr 8, 2024

github.com

 

[Container 생성]

  • 이번에는 프로그램의 코드 관리를 보다 효율적으로 하기 위해 몇 가지 클래스와 패키지를 추가하여 패키징 분리를 시도하려 한다.
  • 현재 프로그램은 각 컨트롤러에서 List를 생성하고 관리하고 있다.
  • 해당 List를 dao라는 패키지 안에 각 Dao 클래스를 생성하여 List 생성과 기능에 관한 코드들을 모두 이전하려 한다.
  • 각 Dao를 생성하기 전, 각 Controller에서 List에 관련된 기능을 수행할 때 반드시 거쳐가야 하는 바다와 같은 Container라는 클래스를 생성한다.
package org.example;

import org.example.dao.BookingDao;
import org.example.dao.GuestDao;
import org.example.dao.RoomDao;

public class Container {
    public static BookingDao bookingDao;
    public static RoomDao roomDao;
    public static GuestDao guestDao;

    static {
        bookingDao = new BookingDao();
        roomDao = new RoomDao();
        guestDao = new GuestDao();
    }
}
  • Container에 각 Dao에 대한 객체 변수를 static으로 선언하고 생성자를 통해 객체를 생성하도록 해준다.
  • 이렇게 되면 예를 들어 BookingController에서 Container.bookingDao.'메서드()' 를 호출하게 되면 자연스럽게 Container를 통해 BookingDao 객체를 생성하고 BookingDao에서 구현된 메서드를 실행할 수 있다.
  • 초기 작업이 복잡해 보이지만, 코드가 길어지고 기능이 많아질 수록 활용도는 더 높아진다.

 

[Dao 생성]

  • 각각의 Dao를 생성하기 전에 예약, 객실, 회원은 모두 고유 번호인 id를 가지고 있다.
  • 현재 프로그램은 각각의 리스트 배열의 size() + 1을 통해 데이터들이 추가될 때마다 id 값을 1씩 증가시킨다.
  • 이제는 해당 기능을 각 컨트롤러가 아닌 Dao에서 전반적으로 관리하려 한다.
package org.example.dao;

public class Dao {
    protected int lastId;

    public Dao() {
        lastId = 0;
    }

    public int getNewId() {
        return lastId + 1;
    }

    public int getLastId() {
        return lastId;
    }
}
  • lastId라는 변수를 protected로 선언하고, 생성자를 통해 초기 값을 0으로 설정한다.
  • protected 접근제한자를 사용하는 이유는 같은 Dao 패키지 또는 자식 클래스에서만 사용 가능하도록 하기 위해서다.
  • 만약 리스트가 추가됐다면 getNewId() 라는 메서드를 호출하여 id 값을 1씩 증가시키도록 한다.

 

[Booking Dao 생성]

  • Container를 생성했다면 이제 각각의 Dao를 생성해야 한다.
  • 먼저 BookingDao.java 클래스에는 Bookings List 생성과 관련된 코드를 작성하고, 기존의 BookingController.java 에서 선언된 List<Booking> bookings = new ArrayList<>() 는 삭제한다.
  • Bookings의 정보에는 고유 번호인 id가 필수적으로 존재하고 BookingController에서 예약 건이 하나씩 생성될 때마다 id 값을 가져오기 위해서 Dao.java를 반드시 상속받아야 한다.
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;

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

    public BookingDao() {
        bookings = new ArrayList<>();
    }
}
  • Container를 통해 BookingDao 객체를 생성하게 되면 호출과 동시에 bookings 라는 리스트 배열이 생성되고 생성자를 통해 자동으로 ArrayList와 연결된다.
  • 앞으로 bookings List와 관련된 기능들은 모두 이 곳에 코드를 작성할 예정이다.

 

[Room Dao 생성]

  • 그 다음으로 RoomDao.java 클래스에는 Rooms List 생성과 관련된 코드를 작성하고, 기존의 RoomController.java 에서 선언된 List<Room> rooms = new ArrayList<>() 는 삭제한다.
  • Rooms의 정보에는 고유 번호인 id가 필수적으로 존재하고 RoomController에서 1일치의 객실이 새로 생성될 때마다 id 값을 가져오기 위해서 Dao.java를 반드시 상속받아야 한다.
package org.example.dao;

import org.example.dto.Room;

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

public class RoomDao extends Dao {
    public List<Room> rooms;

    public RoomDao() {
        rooms = new ArrayList<>();
    }
}
  • Container를 통해 RoomDao 객체를 생성하게 되면 호출과 동시에 rooms 라는 리스트 배열이 생성되고 생성자를 통해 자동으로 ArrayList와 연결된다.
  • 앞으로 rooms List와 관련된 기능들은 모두 이 곳에 코드를 작성할 예정이다.

 

[Guest Dao 생성]

  • 마지막으로 GusetDao.java 클래스에는 Guests List 생성과 관련된 코드를 작성하고, 기존의 GuestController.java 에서 선언된 List<Guest> guests = new ArrayList<>() 는 삭제한다.
  • Guests의 정보에는 고유 번호인 id가 필수적으로 존재하고 GuestController에서 회원이 하나씩 생성될 때마다 id 값을 가져오기 위해서 Dao.java를 반드시 상속받아야 한다.
package org.example.dao;

import org.example.dto.Guest;

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

public class GuestDao extends Dao {
    public List<Guest> guests;

    public GuestDao() {
        guests = new ArrayList<>();
    }
}
  • Container를 통해 GuestDao 객체를 생성하게 되면 호출과 동시에 guests 라는 리스트 배열이 생성되고 생성자를 통해 자동으로 ArrayList와 연결된다.
  • 앞으로 guests List와 관련된 기능들은 모두 이 곳에 코드를 작성할 예정이다.

 

반응형