Back-End
와 DB
를 연결해 호텔, 모텔, 리조트 등을 예약하는 서비스
- ORACLE
- SQLDeveloper
- Eclipse
- JAVA 11 버전
- Miro (Front UI 설계 툴)
- Draw.io (Usecase 설계 툴)
이준모 |
조용훈 |
이해연 |
조아름 |
- Usecase Dirgram 설계 툴
- 해당 설계를 구현하기 위해 Usecase 를 설계
고객은 크게 3가지 예약, 회원가입, 조회
에 접근 할 수 있음
예약
을 해야만 예약을 변경
, 취소
할 수 있기 때문에 예약과 예약 취소, 변경은 include 관계
처음 설계한 usecase-diagram 은 문제점이 많았음
- 특정 행동 위주가 아닌 사용자 기준으로 만듦
- 색상을 사용하지 않아 가시성이 부족했었음
- `include` 의 방향이 잘못 됐었음
따라서 해당 usecase-diagram 에서의 문제점을 수정
후 다시 그림
고객은 파란색, 관리자는 빨간색
고객은 예약, 회원가입, 조회, 게임하기
에 접근 할 수 있음
관리자는 숙박시설 등록, 회원 조회, 목록 조회
에 접근 할 수 있음
공통으로 접근 할 수 있는 숙박시설 조회
는 흰색을 적용함
eXERD
를 이용해 DB 모델링
Customer
(고객) 와 Accommodation
(숙소) 는 서로 다 vs 다 관계
각각 PK
를 FK
로 주어 1 vs 다 구조로 변경해주어야 함
따라서 Book
(예약) table 을 생성해 비실체화 함
상단의 DB 모델링을 이용해 Class Diagram 을 설계 했음
각각의 Hotel
, Motel
, Resort
, Pension
은 특정한 변수를 갖고 있으며 Accommodation
을 상속받음
상단의 DB 모델링을 이용해 Class Diagram 을 재설계 했음
처음 설계한 class-diagram 은 아쉬운 부분이 있음
- 처음에는 Book 의 class 의 존재 이유를 알지못해 구현하지 않음 (누락)
- Book이 존재해야하는 이유 (예약번호 등...)
- method 를 구현 할 필요 없이 큰 틀로만 작성해야했음
- 색상이 없고 너무 커서 가독성이 떨어짐
Has a 관계와 Extands 관계를 잘 알아볼 수 있게 작성했으며
Customer
와 Date
, Book
은 서로서로 Hasing 관계 에 놓일 수 있도록 설계
Accommodation
(숙박시설) 은 Pension
,Hotel
등의 부모 Class 이므로 extends
설계
package com.jdbc.dao;
// 해당 Class Diagram 으로 Implement 설계
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import com.jdbc.exception.DuplicateSSNException;
import com.jdbc.exception.InvalidBookingException;
import com.jdbc.exception.RecordNotFoundException;
import com.jdbc.vo.Accommodation;
import com.jdbc.vo.Book;
import com.jdbc.vo.Customer;
public interface DatabaseTemplate {
//공통 디비 관련 함수
Connection getConnect() throws SQLException;
void closeAll(Connection conn, PreparedStatement ps) throws SQLException;
void closeAll(Connection conn, PreparedStatement ps, ResultSet rs) throws SQLException;
//ssn과 id로 존재 여부 확인하기
boolean isExist(Connection conn, String ssn) throws SQLException;
boolean isExist(Connection conn, int id) throws SQLException;
boolean isExist(Connection conn, int id, String ssn) throws SQLException;
//예약 관련
boolean canBook(Connection conn, int id, String bookDate, int people) throws SQLException, RecordNotFoundException, InvalidBookingException;
void booking(Book book) throws SQLException, RecordNotFoundException, InvalidBookingException; //void booking(String ssn, int id, String bookDate, int people);
void updateBooking(Book book) throws SQLException, RecordNotFoundException; //void updateBooking(String ssn, int id, String bookDate);
void deleteBooking(String ssn, int id) throws SQLException, RecordNotFoundException;
//고객 관련
//isExist(String ssn) 먼저
void addCustomer(Customer customer) throws SQLException, DuplicateSSNException;
void updateCustomer(Customer customer) throws SQLException, RecordNotFoundException;
void deleteCustomer(String ssn) throws SQLException, RecordNotFoundException;
//숙소 관련
//isExist(int id) 먼저
void addAccom(Accommodation accom) throws SQLException;
void updateAccom(Accommodation accom) throws SQLException, RecordNotFoundException;
void deleteAccom(int id) throws SQLException, RecordNotFoundException;
//고객 조회 기능
ArrayList<Book> getBookList(String ssn) throws SQLException;
ArrayList<Customer> getCustomerByName(String name) throws SQLException;
Customer getCustomerBySsn(String ssn) throws NumberFormatException, SQLException;
ArrayList<Customer> getAllCustomer() throws NumberFormatException, SQLException;
//호텔 조회 기능
Accommodation getAccom(int id) throws SQLException;
ArrayList<Accommodation> printAllAccom() throws SQLException;
ArrayList<Accommodation> findAccomsBylocation(String location) throws SQLException;
ArrayList<Accommodation> findAccomsByPrice(int s_price, int e_price) throws SQLException;
ArrayList<Accommodation> findAccomsByStar(int star) throws SQLException;
ArrayList<Accommodation> findAccomsByAccomName(String name) throws SQLException;
ArrayList<Accommodation> findAccomsByType(String type) throws SQLException;
//알고리즘 기능
void playGame(String ssn) throws SQLException;
}
- FE 기술을 사용하지 않아도 출력화면을 구현을 해야 구조를 이해하기 편함
- 생각치 못한 부분을 떠올릴 수 있음
- 고객과 관리자로 두가지 구현
상단 바에 숙소 명을 기입해 찾을 수 있음
호텔
, 모텔
, 리조트
, 팬션
버튼을 이용해 하단의 LIST
에 해당 조건에 맞는 출력 할 수 있음
가격대별
, 지역별
로 조회 가능
특정 호텔을 클릭 후 예약날짜를 기입, 숙박 명수 를 기입 해 예약
우측에는 회원정보 기입란이 있으며 해당 정보를 등록하면 주민등록번호 (SSN) 이 중복되지 않는 이상 해당 고객을 등록
중복되는 SSN 을 갖고 있을 경우 Exception
발생
하단에 해당 고객의 예약 정보를 조회 가능, 만약 예약 날짜를 변경할 경우 중단에 날짜 기입을 한 후 수정
해당 화면은 관리자 탭
상단의 검색 바에서 아이디, 이름, 지역 등 카테고리에 일치하는 값을 찾아 리스트에 출력
만약 호텔을 추가할 경우 하단의 업체명과 Radio-Button 을 이용해 숙박 시설을 선택
호텔의 등급을 별모양을 눌러 적용 및 최대 수용가능인원 입력
입력 받은 값으로 등록과 수정이 가능함
우측 고객조회 란은 고객 조회를 할 수 있으며 아이디, 이름을 이용해 조회
하단에 고객의 상세정보를 조회 할 수 있음
맨 우측에는 선택 고객의 예약 리스트 를 볼 수 있음
해당 프로젝트 구동을 위해 DB 에 기본 데이터 세팅
좌측부터 Accommodation
, Book
, Customer
Table
각각의 테이블의 형식에 맞게 데이터 값을 입력
미니프로젝트
이므로 Front-UI 는 구현❌
따라서 결과값 출력을 Console 로 확인
각각의 시나리오
를 구성해 해당 시나리오에 알맞는 값을 입출력
팀 원 | 좋았던 점 | 아쉬웠던 점 |
---|---|---|
이준모 |
알고 있는 것과 만들어 본 것은 다르다는 걸 다시금 느끼게 되는 계기가 되었다. | 시간이 2일밖에 주어지지 않아 설계를 시작할 때 빈약한 부분이 보여 아쉬웠고, 짧은 시간이었지만 합을 맞추며 정들었던 팀원들과 헤어질 생각을 하니 아쉽다. |
조용훈 |
우리팀의 의사소통이 원활하게 진행 되어서 만족스러웠으며 각자 주력으로 하는 분야가 달라서 겹치지 않고 분업이 잘 되어 서로 부족한 부분을 채워 줄 수 있어 좋았다. | '남들이 이해하기 쉬운 코드를 짜야한다'는 것을 직접 느끼게 되었고 '기초 설계를 정말 꼼꼼히 해야한다'는 것을 배웠다. |
이해연 |
usecas diagram, class diagram, db modeling, business logic 작성 방법과 그 필요성에 대해서 알 수 있어 좋았다. | 꼼꼼하게 인터페이스를 작성했다고 생각했지만 여기저기서 조금씩 잘못된 부분이 나왔고, 에러가 발생한 부분을 찾는데 오래 걸렸다는 점이 아쉬웠다. |
조아름 |
여러명이 함께하다보니 나의 부족한점을 보완해줄 수 있었다. | 처음부터 끝까지 이해를 하지 못하면 구멍이 생기는 것을 알게되는 계기가 되었다. |