반응형

 ∧∞∧  ∧∞∧ ∧∞∧ ∧∞∧ ∧∞∧ ♪
( ・ω・) ・ω・) ・ω・) ・ω・) ・ω・)
(っ   )っ    )っ   )っ  )っ     )っ
( __フ( __フ( _フ( __フ( __フ
  (_/彡 (_/彡 (_/彡 (_/彡  (_/彡

 김춘장이의 위키백과 - 나만의 공부 기록 Tistory ❤ 

 

 

 

 


 

 

 

 

과제를 고민하다

 

생각해 보면 과제를 할 때마다 요구분석과 시나리오, 설계에서 가장 오랜 시간을 보내고 있다.

다른 학생들을 보면 금방금방 끝내고 코드 짜느라 바빠 보이는데

나는 머리를 쥐어짜며 설계에 온 정신을 다 쏟는다

그래서 코드작성도 쿼리작성도 남들보다 한참 뒤에 시작하는데 부족해 보여 내 스스로가 너무 답답하다😢

메뉴먼저 구현하고 기능 구현하면서 쿼리문이나 요구분석은 그때 그대 하면 된다는데

난 그게 잘 안된다, ㅠㅠ

결국 새벽까지 요구사항 및 정리를 하다가 다음날 오전부터 제대로 코드를 짜기 시작했다

 

 

 

 

 

 

 


 

 

 

Class 다이어그램

 

 

 


 

 

 

 

소스코드

 

package main;
import rentalInfo.programInfo;

public class Main {
    public static void main(String[] args) {
        // todo : 자동차 렌탈 프로그램
        new programInfo();
    }
}

 

 

package rentalInfo;
import java.util.Scanner;

public class programInfo {
    public programInfo(){
        boolean flag = true;
        while(flag){
            programInfoPrt();
            int choice = Integer.parseInt(textIO("메뉴 번호"));
            switch (choice){
                case 1 :
                    Rental_CarAdd rca = Rental_CarAdd.getInstance();
                    rca.set_RentalCar();
                    break;
                case 2 :
                    Rental_contract rct = Rental_contract.getInstance();
                    rct.Rental_contract();
                    break;
                case 3 :
                    Rental_Success rss = Rental_Success.getinstance();
                 rss.get_SuccessRental();
                    break;
                case 4 :
                    System.out.println("프로그램종료");
                    flag = false;
                    break;
                default:
                    System.out.println("다시 입력 ");
            }
        }
    }

    public void programInfoPrt(){
        System.out.println("1. 렌트 차량 등록");
        System.out.println("2. 렌트 예약");
        System.out.println("3. 렌트 예약 완료건 전체보기");
        System.out.println("4. 종료");
    }

    public static String textIO(String text){
        Scanner in = new Scanner(System.in);
        System.out.print("\t" + text + " 입력 >> ");
        return in.nextLine();
    }
}

 

package rentalInfo;
import DAO.RentCarDAO;
import DTO.Rental_Car;

public class Rental_CarAdd extends Rental_Car {
    // todo : 차량 등록 클래스
    private Rental_CarAdd(){};
    private static Rental_CarAdd self;
    public static Rental_CarAdd getInstance(){
        if ( self == null ) self = new Rental_CarAdd();
        return self;
    }
    public String owner_name;
    public String owner_phone;

    public void set_RentalCar(){
        System.out.println("차량 등록 서비스입니다");
        Rental_CarAdd newCar = new Rental_CarAdd();
        newCar.car_number = programInfo.textIO("차량 번호");
        newCar.owner_name = programInfo.textIO("차량 소유자 성함");
        newCar.owner_phone = programInfo.textIO("소유자 휴대폰 번호");
        newCar.car_title = programInfo.textIO("차량 모델명");
        System.out.println("차종은 승용/SUV/승합(11인승이상) 가능합니다");
        newCar.car_type = programInfo.textIO("차종 입력");
        newCar.car_mnfct = programInfo.textIO("제조사");
        newCar.car_fuel = programInfo.textIO("연료 타입");
        new RentCarDAO(newCar);
    }
}

 

package rentalInfo;

import java.util.ArrayList;
import DAO.RentContractDAO;
import DTO.Rental_contractDTO;
import DTO.payDTO;

public class Rental_contract extends Rental_contractDTO {
    private static Rental_contract self = null;
    private Rental_contract() {
    }
    public static Rental_contract getInstance() {
        if (self == null) self = new Rental_contract();
        return self;
    }
    public void Rental_contract() {
        RentContractDAO rcDAO = RentContractDAO.getInstance();
        Rental_contract rentTmp = new Rental_contract();
        System.out.println("차량 예약 메뉴 입니다");
        System.out.println("면허종류는 1종대형(승합전용), 1종보통(SUV, 승용), 2종보통(SUV, 승용) 입니다");
        try {
            rentTmp.setLender_licenseType(programInfo.textIO("종류"));
            rcDAO.licenseTpyeCars(rentTmp.getLender_licenseType());
            super.contract_list = rcDAO.getList();
            if (!contract_list.isEmpty()) {
                prt(contract_list);
                rentTmp.setLender_name(programInfo.textIO("계약자 이름"));
                rentTmp.setLender_age(programInfo.textIO("계약자 나이"));
                rentTmp.setLender_phone(programInfo.textIO("계약자 번호"));
                rentTmp.setLender_start(programInfo.textIO("대여 시작시간"));
                rentTmp.setLender_time(Integer.parseInt(programInfo.textIO("대여 시간")));
                rentTmp.setLender_pass(programInfo.textIO("대여자 비밀번호"));
                rentTmp.setCar_number(programInfo.textIO("대여 차량번호"));
                rentTmp.setLender_licenseNum(programInfo.textIO("운전면허 번호"));
                // 총 지불금액 처리 후 대입
                int cost = calc_cost(rcDAO.get_Cost(rentTmp.getCar_number()), rentTmp.getLender_time());
                rentTmp.setTotal_price(cost);
                self = rentTmp;
                rcDAO.setSqlquery_DAO();
//                rcDAO.status_change(rentTmp.getCar_number());
            } else throw new Exception("잘못된 입력입니다");
        } catch (Exception e) {}
    }

    // 차량 조회시 출력문
    public static void prt(ArrayList<payDTO> list) {
        for (payDTO m : list) {
            System.out.println("차량 번호 :" + m.car_number);
            System.out.println("차량 모델 :" + m.car_title);
            System.out.println("차량 제조사 :" + m.car_mnfct);
            System.out.println("차량 연료 :" + m.car_fuel);
            System.out.println("하루 요금 :" + m.getDay_price());
            System.out.println("초과 요금 :" + m.getOver_price());
        }
    }
    // 총 비용 계산 메서드
    public int calc_cost(payDTO payTable, int time){
        int result_cost = 0;
        try {
            int day_cost = payTable.getDay_price();
            int over_cost = payTable.getOver_price();
            int tmpTime = time - 24;
            if (tmpTime <= 0) return result_cost = day_cost;
            else if (tmpTime >= 0 && tmpTime <= 24) return result_cost = day_cost + (over_cost * tmpTime);
            else if (tmpTime >= 24 && tmpTime <= 48) return result_cost = (day_cost * 2) + ((tmpTime - 24) * over_cost);
            else throw new Exception("계산되지 않는 시간입니다 관리자에게 문의하세요");
        } catch (Exception e){}
        return result_cost;
    }
}

 

package rentalInfo;

import DAO.RentSuccessDAO;
import DTO.Rental_Car;

import java.util.ArrayList;

public class Rental_Success extends Rental_Car {
    // todo : 렌트 계약이 완료된 목록을 보여주는 클래스
    private Rental_Success() {}
    private static Rental_Success self = null;

    public static Rental_Success getinstance() {
        if (self == null) self = new Rental_Success();
        return self;
    }

    public void get_SuccessRental() {
        System.out.println("예약 완료된 차량 리스트 메뉴입니다");
        RentSuccessDAO rsd = RentSuccessDAO.getInstance();
        rsd.setSqlquery_DAO();
        ArrayList<DTO.Rental_Success> list = rsd.getList();
        try {
            if (list.size() != 0) rental_default_prt(list);
            else throw new Exception();
        } catch (Exception e) {
            System.out.println("확인되는 차량이 없습니다");
        }
    }

    public void rental_default_prt(ArrayList<DTO.Rental_Success> list) {
        for (DTO.Rental_Success tmp : list) {
            System.out.println("차량번호\t: " + tmp.getCar_number());
            System.out.println("계약자이름\t : " + tmp.getLender_name());
            System.out.println("대여시작시간\t : " + tmp.getLender_start());
            System.out.println("대여종료시간\t : " + tmp.getLender_end());
        }
    }

}

 

package DTO;

public class payDTO extends Rental_Car{
    // Todo : DB Pay Table DTO
    private int day_price;
    private int over_price;

    public int getDay_price() {
        return day_price;
    }

    public void setDay_price(int day_price) {
        this.day_price = day_price;
    }

    public int getOver_price() {
        return over_price;
    }

    public void setOver_price(int over_price) {
        this.over_price = over_price;
    }
}

 

package DTO;

public class Rental_Car {
    // todo : Super Class
    public String car_number;
    public String car_title;
    public String car_type;
    public String car_mnfct;
    public String car_fuel;
    public String car_status;

    public void rental_default_prt(){
        System.out.println("차량 번호 : " + this.car_number);
        System.out.println("모델명 : " + this.car_title);
        System.out.println("차종 : " + this.car_type);
        System.out.println("제조사 : " + this.car_mnfct);
        System.out.println("연료타입 : " + this.car_fuel);
        System.out.println("대여 상태 : " + this.car_status);
    }
}

 

package DTO;

import java.util.ArrayList;

public class Rental_contractDTO {
    public ArrayList<payDTO> contract_list;
    private String lender_name =null;
    private String lender_age =null;
    private String lender_phone =null;
    private String lender_start =null;
    private int lender_time = 0;
    private String lender_pass =null;
    private String lender_licenseType =null;
    private String lender_licenseNum =null;
    private String car_number=null;

    public int getTotal_price() { return total_price;}

    public void setTotal_price(int total_price) { this.total_price = total_price;}

    private int total_price=0;

    public String getCar_number() {
        return car_number;
    }
    public void setCar_number(String car_number) {
        this.car_number = car_number;
    }
    public String getLender_name() {
        return lender_name;
    }
    public void setLender_name(String lender_name) {
        this.lender_name = lender_name;
    }
    public String getLender_age() {
        return lender_age;
    }
    public void setLender_age(String lender_age) {
        this.lender_age = lender_age;
    }
    public String getLender_phone() {
        return lender_phone;
    }
    public void setLender_phone(String lender_phone) {
        this.lender_phone = lender_phone;
    }
    public String getLender_start() {
        return lender_start;
    }
    public void setLender_start(String lender_start) {
        this.lender_start = lender_start;
    }
    public int getLender_time() {
        return lender_time;
    }
    public void setLender_time(int lender_time) {
        this.lender_time = lender_time;
    }
    public String getLender_pass() {
        return lender_pass;
    }
    public void setLender_pass(String lender_pass) {
        this.lender_pass = lender_pass;
    }
    public String getLender_licenseType() {
        return lender_licenseType;
    }
    public void setLender_licenseType(String lender_licenseType) {
        this.lender_licenseType = lender_licenseType;
    }
    public String getLender_licenseNum() {
        return lender_licenseNum;
    }
    public void setLender_licenseNum(String lender_licenseNum) {
        this.lender_licenseNum = lender_licenseNum;
    }
}

 

package DTO;

public class Rental_Success {
    private String car_number;
    private String lender_name;
    private String lender_start;
    private String lender_end;

    public String getCar_number() {
        return car_number;
    }

    public void setCar_number(String car_number) {
        this.car_number = car_number;
    }

    public String getLender_name() {
        return lender_name;
    }

    public void setLender_name(String lender_name) {
        this.lender_name = lender_name;
    }

    public String getLender_start() {
        return lender_start;
    }

    public void setLender_start(String lender_start) {
        this.lender_start = lender_start;
    }

    public String getLender_end() {
        return lender_end;
    }

    public void setLender_end(String lender_end) {
        this.lender_end = lender_end;
    }
}
package DAO;
import rentalInfo.Rental_CarAdd;

public class RentCarDAO extends Resource_DAO{
    // todo : 차량 등록을 위한 DAO
    public RentCarDAO(Rental_CarAdd newCar){
        super.newCar = newCar;
        setSqlquery_DAO();
    }
    @Override
    public void setSqlquery_DAO() {
        // 차량 등록을 위한 sql query 처리 메서드
        boolean trueConn = isConnections();
        if (trueConn){
            try {
                sql = "INSERT INTO RentCar VALUES(?,?,?,?,?,?,?,'N')";
                psmt = conn.prepareStatement(sql);
                psmt.setString(1, newCar.car_number);
                psmt.setString(2, newCar.owner_name);
                psmt.setString(3, newCar.owner_phone);
                psmt.setString(4, newCar.car_title);
                psmt.setString(5, newCar.car_type);
                psmt.setString(6, newCar.car_mnfct);
                psmt.setString(7, newCar.car_fuel);
                psmt.executeQuery();
                System.out.println(newCar.car_title + " 등록완료");
            } catch (Exception e){
                System.out.println("차량 등록 오류");
            } finally {
                resourcesClose();
            }
        }
    }
}
package DAO;

import java.sql.SQLException;
import java.util.ArrayList;

import DTO.payDTO;
import rentalInfo.Rental_contract;

public class RentContractDAO extends Resource_DAO {
    private static RentContractDAO self = null;

    private RentContractDAO() {
    }

    private static ArrayList<payDTO> list = new ArrayList<>();

    public static RentContractDAO getInstance() {
        if (self == null) self = new RentContractDAO();
        return self;
    }

    public static ArrayList<payDTO> getList() {
        if (!list.isEmpty()) return list;
        return null;
    }

    // 사용자가 입력한 면허에 따른 렌트 가능 차의 목록을 가져와서 반환시켜주는 메서드
    public void licenseTpyeCars(String license) {
        Boolean trueConn = isConnections();
        if (trueConn) {
            try {
                // 1종 보통인지 다른 면허인지 확인
                if (license.equals("1종대형")) {
                    sql = "select * from rPossible_Van";
                    psmt = conn.prepareStatement(sql);
                    rs = psmt.executeQuery();
                }else if (license.equals("1종보통") || license.equals("2종보통")) {
                    sql = "select * from rPossible_NotVan";
                    psmt = conn.prepareStatement(sql);
                    rs = psmt.executeQuery();
                } else {
                    throw new Exception("잘못된 입력입니다");
                }
                // 결과 참조 가능하도록 연결
                while (rs.next()) {
                    payDTO tmp = new payDTO();
                    tmp.car_number = rs.getString("car_number");
                    tmp.car_title = rs.getString("car_title");
                    tmp.car_mnfct = rs.getString("car_mnfct");
                    tmp.car_fuel = rs.getString("car_fuel");
                    tmp.setDay_price(rs.getInt("day_price"));
                    tmp.setOver_price(rs.getInt("over_pirce"));
                    list.add(tmp);
                }
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println("차량 조회 실패");
            } finally {
                resourcesClose();
            }
        }
    }


    // 예약 처리를 완료하는 메서드
    @Override
    public void setSqlquery_DAO() {
        Rental_contract rentTmp = Rental_contract.getInstance();
        boolean trueConn = isConnections();
        if (trueConn) {
            try {
                sql = "INSERT INTO lender VALUES(?,?,?,TO_DATE(?, 'yyyy-mm-dd hh24:mi'),?,default,?,?,?,?,?)";
                psmt = conn.prepareStatement(sql);
                psmt.setString(1, rentTmp.getLender_name());
                psmt.setString(2, rentTmp.getLender_age());
                psmt.setString(3, rentTmp.getLender_phone());
                psmt.setString(4, rentTmp.getLender_start());
                psmt.setInt(5, rentTmp.getLender_time());
                psmt.setString(6, rentTmp.getLender_pass());
                psmt.setString(7, rentTmp.getLender_licenseType());
                psmt.setString(8, rentTmp.getCar_number());
                psmt.setString(9, rentTmp.getLender_licenseNum());
                psmt.setInt(10, rentTmp.getTotal_price());
                int resultInt = psmt.executeUpdate();
                System.out.println(resultInt + "건 예약 되었습니다.");
                System.out.println("총 지불금액 : " + rentTmp.getTotal_price()+"입니다");
                status_change(rentTmp.getCar_number());
            } catch (Exception e) {
                System.out.println("차량 등록 오류");
                e.printStackTrace();
            } finally {
                resourcesClose();
            }
        }
    }


    // 차량 등록을 위한 sql query 처리 메서드
    public void status_change(String car_number) {
        boolean trueConn = isConnections();
        if (trueConn) {
            try {
                sql = "update RentCar set car_status='Y' where car_number=?";
                psmt = conn.prepareStatement(sql);
                psmt.setString(1, car_number);
                psmt.executeQuery();
            } catch (Exception e) {
                System.out.println("차량 등록 오류");
            } finally {
                resourcesClose();
            }
        }
    }

    // 총 계산 메서드
    public payDTO get_Cost(String car_number) {
        boolean trueConn = isConnections();
        try {
            if (trueConn) {
                sql = "SELECT p.DAY_PRICE AS day_price, p.OVER_PRICE AS OVER_PRICE  FROM PAY p INNER JOIN RentCar r ON r.car_type = p.CAR_TYPE WHERE car_number = ?";
                psmt = conn.prepareStatement(sql);
                psmt.setString(1, car_number);
                rs = psmt.executeQuery();
                if (rs.next()) {
                    payDTO tmp = new payDTO();
                    tmp.setDay_price(rs.getInt("DAY_PRICE"));
                    tmp.setOver_price(rs.getInt("OVER_PRICE"));
                    return tmp;
                }
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } catch (Exception e) {

        } finally {
            resourcesClose();
        }
        return null;
    }
}

 

package DAO;
import DTO.Rental_Success;
import java.util.ArrayList;

public class RentSuccessDAO extends Resource_DAO {
    private static RentSuccessDAO self = null;
    private RentSuccessDAO(){}
    private static ArrayList<Rental_Success> list = new ArrayList<>();

    public static RentSuccessDAO getInstance(){
        if (self == null) self = new RentSuccessDAO();
        return self;
    }
    public static ArrayList<Rental_Success> getList() {
        if (list.size() > 0) return list;
        return null;
    }

    @Override
    public void setSqlquery_DAO() {
        boolean trueConn = isConnections();
        if (trueConn) {
            try {
                sql = "SELECT * FROM Rental_Success";
                psmt = conn.prepareStatement(sql);
                rs = psmt.executeQuery();
                while (rs.next()) {
                    Rental_Success tmp = new Rental_Success();
                    tmp.setCar_number(rs.getString("car_number"));
                    tmp.setLender_name(rs.getString("lender_name"));
                    tmp.setLender_start(rs.getString("lender_start"));
                    tmp.setLender_end(rs.getString("lender_end"));
                    list.add(tmp);
                }
            } catch (Exception e) {
                System.out.println("!!예외발생!!");
                e.printStackTrace();
            } finally {
                resourcesClose();
            }
        }
    }
}
package DAO;
import rentalInfo.Rental_CarAdd;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public abstract class Resource_DAO {
    // todo : 리소스 관리 클래스
    final static String url = "jdbc:oracle:thin:@192.168.0.70:1521:orcl";
    final static String username = "system";
    final static String pass = "1111";
    static Connection conn = null;
    static PreparedStatement psmt = null;
    static ResultSet rs = null;
    static String sql;
    static Rental_CarAdd newCar = null;

    // 드라이버로드 생성자
    public Resource_DAO(){
        try {// 실행중에 발생하는 예외를 처리하여 프로그램 오류가 나지 않게 한다.
            Class.forName("oracle.jdbc.driver.OracleDriver");
        } catch (Exception e) {
            System.out.println("Driver Load Failed");// 가 코드에서 드라이버를 로드 못하면 실행
        }
    }

    // 커넥션 시도 리턴값 : 성공/실패
    public static boolean isConnections() {
        try {
            conn = DriverManager.getConnection(url, username, pass);
            return true;
        } catch (Exception e) {
            System.out.println("Connections Failed");
        }
        return false;
    }

    // 자원 반납 메서드정의
    public static void resourcesClose(){
        try {
            if ( psmt != null ) psmt.close();
            if ( conn != null ) conn.close();
        }catch (Exception e){
            System.out.println("Resources return Failed");
        }
    }

    // sql 문법 사용 메서드 (추상화)로 진행하여 DB에 접근하는 클래스들은
    // 모두 추상화로 재정의해야함
    public abstract void setSqlquery_DAO();
}

 

 

 

 

 

반응형
유리쯔의일상