10월 24일

Yullgiii·2023년 10월 24일
0
post-thumbnail

내일 배움 캠프

오늘 부터 팀프로젝트의 시작이다.
우리 팀은 선택과제인 키오스크 관리 프로그램과 호텔예약시스템 중에 호텔예약시스템을 하기로 결정을 하고
프레임을 짜보기로 헀다...
하지만 난 모오오올래 키오스크도 좀 해봐야지?
다른조들이 한거랑 비교도되고 좋잖아?

요구사항

호텔 예약 프로그램
필수 요구 사항
1. 호텔은 여러 객실, 보유 자산을 가지고 있다.
2. 객실은 객실 당 하루에 한 사람만 예약이 가능하다.
3. 객실은 크기, 숙박비를 가진다
4. 예약은 객실, 고객의 이름, 고객의 전화번호, 예약 날짜를 가지고 있다.
1. 전화 번호 제한(XXX-XXXX-XXXX) 정규 표현식 (선택)
2. 예약 날짜 ****
날짜는 ISO 8601 형식으로
조합된 UTC 날짜 및 시간
예) 2016-10-27T17:13:40+00:00
5. 고객은 이름, 전화번호, 소지금을 가진다.
고객 소지금보다 비싼 방은 예약 불가
6. 호텔은 모든 예약 목록을 조회 할 수 있다.
7. 고객은 자신의 예약 목록을 조회 할 수 있다.
예약 번호로 예약 내역을 조회한다
8. 고객은 자신의 예약을 취소 할 수 있다.
9. 고객이 호텔 예약 시에 예약 번호(id)를 반환 (uuid 활용)
- 1. 고객이 호텔 예약에 성공하면 예약 번호(id)를 받는다.
- 2. 고객이 예약 목록을 조회 시 예약 번호도 같이 조회 된다.
- 3. 고객이 예약 취소 시 예약 번호를 통해 자신의 특정 예약을 취소한다.

HRSProject(호텔예약 시스템 프로젝트)


그렇게 와이어 프레임 작성이 시작되었고

와이어 프레임으로 각 클래스는
1.HotelReservationSystem
2.Hotel
3.Reservation
4.Customer
5.Room
으로 실행되어 각 호텔예약시스템을 구성해보려한다.
대충 와이어를 만들어서 구상을 했다...
현재의 코드는 공개가 좀 어려우니까
일단은 이정도로 만들어 뒀다고 보면된다....
그리곤 와이어 프레임이 작성이 끝난후 각 팀원들의 의견을 반영해서 설명이 부족하기에 설명들을 추가해뒀다.

import java.util.Scanner;
import java.util.UUID;

public class HotelReservationSystem {

    public static void main(String[] args) {
        Hotel hotel = new Hotel();// 호텔 객체 생성
        Scanner scanner = new Scanner(System.in);// 입력을 위한 Scanner 객체 생성
        // 사용자에게 선택할 수 있는 메뉴 표시
        while (true) {
            System.out.println("호텔 예약 시스템에 오신 것을 환영합니다!");
            System.out.println("1. 예약하기");
            System.out.println("2. 예약 취소하기");
            System.out.println("3. 나의 예약 보기");
            System.out.println("4. 종료");
            System.out.println("0. 모든 예약 보기 (관리자)");
            System.out.print("선택을 입력하세요: ");

            int choice = scanner.nextInt();
            scanner.nextLine();

            switch (choice) {
                case 1:// 예약하기
                    System.out.print("이름을 입력하세요: ");
                    String name = scanner.nextLine();
                    System.out.print("전화번호를 입력하세요: ");
                    String phoneNumber = scanner.nextLine();
                    System.out.print("소지 금액을 입력하세요: ");
                    double money = scanner.nextDouble();
                    scanner.nextLine();
                    System.out.print("방 키를 입력하세요 (small1, small2, big1, big2, veryBig1, veryBig2): ");
                    String roomKey = scanner.nextLine();
                    System.out.print("예약 날짜를 입력하세요 (예, 2023-10-27): ");
                    String date = scanner.nextLine();
                    // [구현] 날짜 형식 변경 필요
                    Customer customer = new Customer(name, phoneNumber, money);
                    // 예약 시도 및 결과 출력
                    UUID reservationId = hotel.reserveRoom(roomKey, customer, date);
                    if (reservationId != null) {
                        System.out.println("예약 성공! 예약 ID는 다음과 같습니다: " + reservationId);
                    } else {
                        System.out.println("예약 실패!");
                    }
                    break;

                case 2:// 예약 취소하기
                    System.out.print("취소할 예약 ID를 입력하세요: ");
                    String id = scanner.nextLine();
                    boolean canceled = hotel.cancelReservation(UUID.fromString(id));
                    if (canceled) {
                        System.out.println("예약이 성공적으로 취소되었습니다!");
                    } else {
                        System.out.println("예약 취소에 실패했습니다!");
                    }
                    break;// 예약 ID를 받아와 예약 취소 로직 실행

                case 3: // 특정 고객의 예약 정보 출력
                    System.out.print("예약을 조회할 이름을 입력하세요: ");
                    String customerName = scanner.nextLine();
                    if(hotel.getCustomerReservations(customerName).isEmpty()) {
                        System.out.println("잘못된 입력입니다.");
                    } else {
                        hotel.getCustomerReservations(customerName).forEach(reservation -> {
                            System.out.println("예약 ID: " + reservation.getId());
                            System.out.println("방 타입: " + reservation.getRoom().getType());
                            System.out.println("날짜: " + reservation.getDate());
                            System.out.println("---------");
                        });//고객 이름을 받아와 해당 고객의 예약 정보 출력
                    }
                    break;

                case 4:
                    System.out.println("안녕히 가세요!");
                    scanner.close();
                    return;

                case 0: // 관리자를 위한 모든 예약 정보 출력
                    System.out.println("모든 예약:");
                    hotel.getAllReservations().forEach(reservation -> {
                        System.out.println("예약 ID: " + reservation.getId());
                        System.out.println("고객 이름: " + reservation.getCustomerName());
                        System.out.println("전화번호: " + reservation.getPhoneNumber());
                        System.out.println("방 타입: " + reservation.getRoom().getType());
                        System.out.println("날짜: " + reservation.getDate());
                        System.out.println("---------");
                    });
                    break; // 모든 예약 정보 출력
                default:
                    System.out.println("잘못된 선택입니다!");
                    break;
            }
        }
    }
}

이런식으로 인터페이스를 만들어 두기는 했는데 아직 부족한게 너무 많다.
그러니 이제는 구현내용들을 해야한다.!!!!

그렇게 깃이라는 친구와 미친듯이 싸우고 있다...어쩔꺼야 증말
코드짜는것보다 깃이 더힘들어!!!!!!!!!!!!말이 되냐고!!!!!!!
오늘도 머지하면서 서로 코드가 슬쩍슬쩍 꼬여서 하하....

깃 특강

깃으로 협업하는 법에 대해 배우게 되었다(이미 아는 사실도 있고 몰랐던 사실도 있지!)
1.브랜치 활용하기
브랜치(복사본)
생성언어는 git branch (브랜치명)
브랜치를 확인하는 것도 필요하다!
브랜치는 이동이 필요한데
오늘 팀원들과 과제를 하면서 딱 했던거다!
git checkout (브랜치명)예전에 쓰던거라는데 나는 저걸로 쓴다...
만들면서 이동을 하는건 git checkout -b (브랜치명)

브랜치 합치기

git switch main
git merge (브랜치명)을 하면되지만 어림없지 합치다가 삑나면 어쩌려구 그래~!
pull request써야지 어딜

깃허브에서 풀리퀘스트 하는법

오늘 이걸 써봤기떄문에 뭐 쉽지쉽지 이정도는
팀원 원격저장소에서 compare & pull request 누르기.(또는 Contribute버튼)
compare & pull request 클릭 후 이동된 팀장의 레포에서 화살표방향과 브랜치 꼭 확인

실전 압축 근육...

git flow쪽을 이야기하시는거 같은데?
맞네...허허 여튼 dev브랜치를 만들어서 테스트용 브랜치를 만들라고 하는것이였다.

우리가 낫던 에러이다 ㅎㅎㅎㅎㅎ
깃에서 흔하구나...?
충돌을 하는 상태여서
내 코드에 머지를 먼저 해서 덮어준다음에 충돌이 없어지길 원하기에 내 로컬로 먼저 옮겨둔걸 해결하고 다시 올리면 자연스럽게 해결이된다!!!!

실전압축이네 ㅋㅋ완벽이해!

현재시간을 받아와서 과거에는 예약이 불가능하게 만들기!

내가 해야하는 영역이다...그걸 해가면서 되면 README도 작성을 할것이다
저녁시간이 6시니까 그전에 완료를 해야지 강의를 들을수가 있다 이말이야!!!

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

우선 날짜관련된 라이브러리를 인포트 한다.아 어딜 바꾸는지 말을 안했구나
호텔 코드내에 방예약과 관련된 코드가 있다.
그곳을 이용하여서 바꿀것이다.
원래도 날짜를 받는곳은 존재 했으니 그곳을 건드릴 필요는 없다고 보여진다.
우리 팀은 조금 귀찮더라도 다른 팀원들을 위해서 각자 작성한 코드에 주석을 달아서 어떤 식으로 쓰여진 코드인지를 보여주기로 했다.
당장 잘 지켜질지는 모르지만 일단은 그러기로했으니 나또한 주석으로 설명을 다 추가해서 코드를 읽으면 다 이해가갈것이다.

    public UUID reserveRoom(String roomKey, Customer customer, String dateStr) {
        // 방의 키를 사용하여 rooms 맵에서 해당 방의 정보를 가져오면되유...
        Room room = rooms.get(roomKey);
        // "yyyy-MM-dd" 형식의 문자열 날짜를 파싱하기 위한 포맷터를 설정
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        // dateStr을 LocalDate 형식으로 파싱
        LocalDate inputDate = LocalDate.parse(dateStr, formatter);
        // 현재 날짜를 가져오는 식???
        LocalDate currentDate = LocalDate.now();
        // 입력한 날짜가 현재 날짜 이전인 경우 예약 거절
        if (inputDate.isBefore(currentDate)) {
            System.out.println("당신은 타임머신타려고요? 지난 날짜는 예약 안되요~.");
            return null;//거절~
        }
        // 방이 있고 고객이 돈을 지불할 수 있는 경우
        if (room != null && customer.canAfford(room.getPrice())) {
            // 새로운 예약 ID를 생성
            UUID id = UUID.randomUUID();
            // 새로운 예약을 생성하고 reservations 리스트에 추가
            reservations.add(new Reservation(id, room, customer, dateStr));
            // 예약 ID를 반환
            return id;
        } else {
            // 조건을 만족하지 못하는 경우 예약을 거절하고 null을 반환
            return null;
        }
    }

틈틈히 해보는 키오스크 관리자 기능

package Kiosk;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

public class KioskManager {

    private List<Order> pendingOrders = new ArrayList<>();
    private List<Order> completedOrders = new ArrayList<>();
    private List<Product> products = new ArrayList<>();

    public KioskManager() {
        initializeProducts();
    }

    private void initializeProducts() {
        // 커피 카테고리
        products.add(new Product("아메리카노", "국민음료? 당신의 하루는 언제나 아메리카노로 시작하는거 다알아요!!!", 3.5, "Coffee"));
        products.add(new Product("라떼", "우유와 함께한 에스프레소의 궁합!! 고소한 커피를 경험해보세요.", 4.0, "Coffee"));

        // 차 카테고리
        products.add(new Product("아이스 티", "뜨숩은 차가 심심할 땐 아이스로 즐겨보는건 어떤가요? 아샷추 가능!!", 3.0, "Tea"));
        products.add(new Product("페퍼민트 티", "초코민트는 안좋아할수있지!!하지만 이건 좀 다를껄??", 4.8, "Tea"));

        // 토스트 카테고리
        products.add(new Product("평범한 토스트?", "버터와 잼의 가장 기본의 충실한 맛!!!!!", 2.2, "Toast"));
        products.add(new Product("치즈 토스트", "치즈가 숨어있어! 누가 나를 찾나?(치즈양이 적다는건 아녀유...)", 3.0, "Toast"));

        // 디저트 카테고리
        products.add(new Product("치즈케이크", "치즈가 웃다! 행복의 원조!", 4.0, "Dessert"));
        products.add(new Product("티라미수 ", "커피와 치즈의 이탈리아 방식 폭신폭신이!!", 4.5, "Dessert"));
    }
    public void addPendingOrder(Order order) {
        this.pendingOrders.add(order);
    }

    public boolean completeOrder(int orderId) {
        for (Order order : pendingOrders) {
            if (order.getOrderId() == orderId) {
                order.setCompletionTime(new Date());
                completedOrders.add(order);
                pendingOrders.remove(order);
                return true;
            }
        }
        return false;
    }

    public void addProduct(String name, String description, double price, String category) {
        products.add(new Product(name, description, price, category));
    }

    public boolean removeProduct(String productName) {
        Iterator<Product> iterator = products.iterator();
        while (iterator.hasNext()) {
            Product product = iterator.next();
            if (product.getName().equals(productName)) {
                iterator.remove();
                return true;
            }
        }
        return false;
    }

    public List<Order> getPendingOrders() {
        return this.pendingOrders;
    }

    public List<Order> getCompletedOrders() {
        return this.completedOrders;
    }

    public List<Product> getProducts() {
        return this.products;
    }

    public void viewPendingOrders() {
        System.out.println("\n[ 대기 주문 목록 ]");
        for (Order order : pendingOrders) {
            System.out.println(order.getOrderDetails());
        }
    }

    public void viewCompletedOrders() {
        System.out.println("\n[ 완료 주문 목록 ]");
        for (Order order : completedOrders) {
            System.out.println(order.getCompletedOrderDetails());
        }
    }
}

우선 키오스크 매니져를 만들어서 그쪽으로 메뉴들을 옮겨주었다 어째서냐면 그쪽에서 메뉴들을 추가하거나 삭제를 해야하기떄문에 옮겨서 여기의 로직을 실행하는것이 옳다고 판단되었기 때문이다.
현재는 그래서 키오스크 관리자 메뉴를 만들어서 관리할수있게끔 구현을 해둔 상태이다.
메뉴의 삭제와 추가까지는 쉽게 되었는데
이게 주문 현황이랑 주문 완료 현황이랑이 무슨말인지 몰라서 멈칫중이다...허허
어쩌겠어 모르겠는걸....
다음에 또 짜투리 시간이 난다면 해보자

회고

오늘부터 본격적인 협업이 시작되었는데 얼른얼른 마무리하고싶은 마음도 들지만 깃이라는 친구도 발목을 잡고 뭔가 좀더 복잡해진것들이 있어서 작업하는 속도가 더뎌지는게 사실이다.그래도 끝낼순있겠다 싶다...
뭔가 에러도 많이 뜨고 아직 합하는게 서툴지만 하나씩 잘해나가고있다!!!!!
내일 할작업은
1.실행로직 나누기
2.그걸 기준으로 스캐너 나누기가 될것같다!!!
튜터님과 이야기를 하면서 나온 것이기에 해보는게 좋을거 같다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글