728x90
Model
package model;
public class AlcVO { // 술 클래스 ex) 참이슬, 처음처럼, 테라
private int num; // PK
private String name; // 이름
private int price; // 가격
private int cnt; // 재고
private double abv; // 도수
private String category; // 카테고리
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public int getCnt() {
return cnt;
}
public void setCnt(int cnt) {
this.cnt = cnt;
}
public double getAbv() {
return abv;
}
public void setAbv(double abv) {
this.abv = abv;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
@Override
public String toString() {
return "AlcVO [num=" + num + ", name=" + name + ", price=" + price + ", cnt=" + cnt + ", abv=" + abv
+ ", category=" + category + "]";
}
}
package model;
public class CategoryVO { // 술 종류 클래스 ex)소주,맥주,막걸리
private String name; // 술 종류
private int num; // 카테고리 pk
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
@Override
public String toString() {
return "CategoryVO [name=" + name + "]";
}
}
package model;
import java.util.ArrayList;
public class AlcDAO {
ArrayList<AlcVO> datas = new ArrayList<AlcVO>(); // 전체배열
ArrayList<CategoryVO> category = new ArrayList<CategoryVO>(); // 주종배열(부분배열)
int pk = 101; // Primary Key
int cpk = 1; // 카테고리에 대한 pk , ex) 소주는 1 , 맥주는 2 , 막걸리 3
// 샘플데이터
AlcVO vo1 = new AlcVO();
{
vo1.setName("참이슬");
vo1.setPrice(2000);
vo1.setCnt(10);
vo1.setCategory("소주");
vo1.setAbv(16.9);
vo1.setNum(pk++);
datas.add(vo1);
}
AlcVO vo2 = new AlcVO();
{
vo2.setName("처음처럼");
vo2.setPrice(2000);
vo2.setCnt(20);
vo2.setCategory("소주");
vo2.setAbv(16.0);
vo2.setNum(pk++);
datas.add(vo2);
}
AlcVO vo3 = new AlcVO();
{
vo3.setName("시원");
vo3.setPrice(2000);
vo3.setCnt(10);
vo3.setCategory("소주");
vo3.setAbv(16.9);
vo3.setNum(pk++);
datas.add(vo3);
}
AlcVO vo4 = new AlcVO();
{
vo4.setName("테라");
vo4.setPrice(3000);
vo4.setCnt(10);
vo4.setCategory("맥주");
vo4.setAbv(5.6);
vo4.setNum(pk++);
datas.add(vo4);
}
AlcVO vo5 = new AlcVO();
{
vo5.setName("카스");
vo5.setPrice(3000);
vo5.setCnt(15);
vo5.setCategory("맥주");
vo5.setAbv(5.5);
vo5.setNum(pk++);
datas.add(vo5);
}
AlcVO vo6 = new AlcVO();
{
vo6.setName("하이트");
vo6.setPrice(3000);
vo6.setCnt(20);
vo6.setCategory("맥주");
vo6.setAbv(5.8);
vo6.setNum(pk++);
datas.add(vo6);
}
AlcVO vo7 = new AlcVO();
{
vo7.setName("원막걸리");
vo7.setPrice(3000);
vo7.setCnt(10);
vo7.setCategory("막걸리");
vo7.setAbv(6.0);
vo7.setNum(pk++);
datas.add(vo7);
}
AlcVO vo8 = new AlcVO();
{
vo8.setName("장수막걸리");
vo8.setPrice(3000);
vo8.setCnt(10);
vo8.setCategory("막걸리");
vo8.setAbv(6.5);
vo8.setNum(pk++);
datas.add(vo8);
}
AlcVO vo9 = new AlcVO();
{
vo9.setName("밤막걸리");
vo9.setPrice(3000);
vo9.setCnt(10);
vo9.setCategory("막걸리");
vo9.setAbv(9.6);
vo9.setNum(pk++);
datas.add(vo9);
}
CategoryVO cvo1 = new CategoryVO();
{
cvo1.setName("소주");
cvo1.setNum(cpk++);
category.add(cvo1);
}
CategoryVO cvo2 = new CategoryVO();
{
cvo2.setName("맥주");
cvo2.setNum(cpk++);
category.add(cvo2);
}
CategoryVO cvo3 = new CategoryVO();
{
cvo3.setName("막걸리");
cvo3.setNum(cpk++);
category.add(cvo3);
}
public ArrayList<AlcVO> selectAll(AlcVO vo) { // AlcVO에 있는 값들 전체 리턴
if(vo.getName()!=null) {
// 검색
ArrayList<AlcVO> datas=new ArrayList<AlcVO>();
for(int i=0;i<this.datas.size();i++) { // datas의 크기만큼 반복해서
if(this.datas.get(i).getName().equals(vo.getName())) { // 인자로 들어온 vo의 이름이 같다면
datas.add(this.datas.get(i)); // 같은 그 객체를 datas에 넣는다.
}
}
return datas;
}
return datas;
}
public AlcVO selectOne(AlcVO vo) { // AlcVO에서 들어온 값을 비교하여 리턴
for (AlcVO data : datas) {
if (data.getName().equals(vo.getName())) { // 이름으로 비교해서 해당 객체 리턴
return data;
}
}
return null;
}
public ArrayList<CategoryVO> categoryAll(CategoryVO cate) { // category(대분류) 배열리턴
return category;
}
public CategoryVO categoryOne(CategoryVO cate) { // category의 selectOne
for (CategoryVO data : category) { // data라는 객체에 category의 값을 넣는다
if (data.getName().equals(cate.getName())) { // 만약 들어온 이름과 data의 이름이 같다면
return data; // data를 리턴한다.
}
}
return null;
}
public boolean update(AlcVO vo) { // cnt 값 수정을 위한 메서드
for (AlcVO data : datas) {
if (data.getName().equals(vo.getName())) { // 만약 이름이 같다면 > 구매자에서 사용
if (data.getCnt() - vo.getCnt() < 0) { // 유효성검사 기존cnt보다 들어온cnt는 높을 수 없다
return false; // 실패
} else {
data.setCnt(data.getCnt() - vo.getCnt()); // vo 객체에 들어온 cnt 값을 기존에 cnt에서 빼준다.
}
}
if (data.getNum()==vo.getNum()) { // 만약 pk 값이 같다면 > 관리자에서 사용
if (data.getCnt() - vo.getCnt() < 0) { // 유효성검사 기존cnt보다 들어온cnt는 높을 수 없다
return false; // 실패
} else {
data.setCnt(data.getCnt() - vo.getCnt()); // vo 객체에 들어온 cnt 값을 기존에 cnt에서 빼준다.
}
}
}
return true;
}
public boolean insert(AlcVO vo) { // 추가 메서드
try {
vo.setNum(pk++); // 재고가 추가됨에 따라 pk 매핑
datas.add(vo); // 받아온 객체에 대한 정보를 datas에 추가
return true; // 재고 추가 성공
} catch (Exception e) {
return false;
}
}
public boolean delete(AlcVO vo) { // 제품 삭제 메서드
for (int i = 0; i < datas.size(); i++) {
if(datas.get(i).getNum() == vo.getNum()) { // 객체로 들어온 vo의 pk 가 기존 데이터의 pk와 같다면
datas.remove(i); // 해당 객체 삭제
return true;
}
}
return false;
}
}
View
package view;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.Scanner;
import model.AlcVO;
import model.CategoryVO;
public class AlcView {
public int action;
public int age;
Scanner sc = new Scanner(System.in);
int min = 1;
int max = 4; // 메뉴 추가 시 max 값 변경해주세요.
public boolean userAge() { // 나이인증 및 유효성검사
while (true) {
System.out.println("안녕하세요.");
System.out.println("귀하의 나이를 입력해주세요.");
System.out.print("나이 입력) ");
try {
age = sc.nextInt();
if (age == 1234) {
return false;
}
if (age < 20 || age > 100) {
System.out.println("인증에 실패하였습니다.");
System.out.println(" ");
continue;
} else if (age >= 20 && age <= 100) {
System.out.println("인증에 성공하였습니다.");
System.out.println(" ");
return true;
}
} catch (Exception e) {
sc.nextLine();
System.out.println("숫자를 입력해주세요.");
}
}
}
public void user_startView() { // 인증 성공 후 자판기 메뉴실행
while (true) {
System.out.println("===========주류 자판기===========");
System.out.println("[ 1.메뉴확인 2.구매 3.검색 4.종료 ]");
System.out.print("정수 입력) ");
try {
action = sc.nextInt();
System.out.println();
if (min <= action && action <= max) { // 유지보수 min, max사용하여 자판기 실행번호 설정
break;
}
System.out.println("범위 외 입력입니다!");
} catch (Exception e) {
sc.nextLine(); // 문자열이 들어올 경우 버퍼를 비우기 위해
System.out.println("숫자를 입력해주세요.");
}
System.out.println(min + "에서 " + max + "사이를 입력해주세요.");
}
}
public void menu(ArrayList<AlcVO> datas) { // 전체메뉴 출력
int num = 1;
if (datas.size() == 0) { //datas에 아무것도 존재 하지 않을 때
System.out.println("해당 종류의 술이 존재하지 않습니다.");
}
for (AlcVO vo : datas) { // 전체메뉴 출력
System.out.println(num++ + "번 " + vo.getCategory() + " " + vo.getName() + " " + vo.getPrice() + "원 "
+ vo.getCnt() + "개 " + vo.getAbv() + "도 ");
}
System.out.println();
}
public int categoryMenu(ArrayList<CategoryVO> cate) { // 대분류 카테고리 출력
while(true) {
for(int i=0; i<cate.size();i++) {
System.out.println(i+1+"." + cate.get(i).getName());
}
System.out.println("원하시는 카테고리를 입력해주세요.");
System.out.print("번호 입력) ");
try {
int num=sc.nextInt();
System.out.println();
if(num<=0 || num>cate.size()) { // 유효성검사 > 0이하 또는 카테고리 개수보다 높은 값을 입력하면 다시 입력 받기
System.out.println("1부터 "+cate.size()+"까지 입력해주세요.");
continue;
}
return num;
}catch (InputMismatchException e) {
sc.nextLine(); // 문자열이 들어올 경우 버퍼를 비우기 위해
System.out.println("숫자를 입력해주세요.");
System.out.println(" ");
}
}
}
public void sool(ArrayList<AlcVO> datas, CategoryVO vo) { // 대분류 카테고리 선택 후 보여질 소분류 출력 메서드
System.out.println("========== "+vo.getName()+" =========="); // 카테고리vo(대분류)의 이름 가져온다.
int num = 1; // 넘버링
for (int i = 0; i < datas.size(); i++) {
if (datas.get(i).getCategory().equals(vo.getName())) { // AlcVO의 요소 중 카테고리이름과 CategoryVO의 요소의 이름이 같으면
System.out.println(num++ + "." + datas.get(i).getName() + " 가격(" + datas.get(i).getPrice() + ") 재고("
+ datas.get(i).getCnt() + ") 도수(" + datas.get(i).getAbv() + ")");
}
}
return;
}
public String inputString() {
System.out.print("이름 입력) ");
String str = sc.next();
System.out.println();
return str;
}
public int inputInt() {
int i = 0;
while (true) {
System.out.print("정수 입력) ");
try {
i = sc.nextInt();
System.out.println();
if (i<=0) { // 0또는 음수 입력 시
System.out.println("양수만 입력해주세요");
continue;
}
} catch (InputMismatchException e) { // 문자열 입력 시
sc.nextLine();
System.out.println("정수만 입력해주세요.");
continue;
} catch (Exception e) {
sc.nextLine();
System.out.println("또다른 오류 발생");
continue;
}
return i;
}
}
public void buyName() {
System.out.println("구매하실 술 이름을 입력해주세요.");
}
public void buyNameFail() {
System.out.println("술의 이름을 다시 한번 확인해주세요.");
}
public void buyCnt() {
System.out.println("구매하실 수량을 입력해주세요.");
}
public void buyCntFail() {
System.out.println("재고가 부족합니다. 현재 재고를 다시 한번 확인해주세요.");
}
public void searchName() {
System.out.println("검색할 술 이름을 입력해주세요.");
}
public void success() {
System.out.println("구매에 성공하였습니다!");
}
public void fail() {
System.out.println("구매에 실패하였습니다...");
}
public void total(int total) {
System.out.println("총 결제하실 금액은 " + total + "원 입니다. ");
}
public void money() {
System.out.println("투입 금액을 입력해주세요. ");
}
public void moneyAdd() {
System.out.println("추가로 투입할 금액을 입력해주세요.");
}
// 누적 금액 추가
public void moneyIn(int money) {
System.out.println("누적 금액 : " + money);
}
public void balT(int balance) { // 잔돈출력
System.out.println("잔돈이 " + -1*balance + "원 있습니다.");
}
public void balF(int balance) {
System.out.println("금액이 " + -1*balance + "원 부족합니다.");
}
public void off() {
System.out.println("이용이 종료됩니다.");
}
public boolean receipt() { // 영수증 출력
while (true) {
try {
System.out.println("영수증을 받으시겠습니까?");
System.out.println("1.YES 2.No");
System.out.print("입력) ");
action = sc.nextInt();
System.out.println(" ");
if (action == 1) {
return true;
} else if (action == 2) {
return false;
} else {
System.out.println("범위 외 입력입니다. 1.(Yes)/2.(No) 만 입력가능");
continue;
}
} catch (Exception e) {
sc.nextLine();
System.out.println("숫자를 입력해주세요.");
}
}
}
public void show_receipt(AlcVO vo) { // 영수증 모양
System.out.println("============영수증============");
System.out.println("품명 : " + vo.getName());
System.out.println("가격 : " + vo.getPrice());
System.out.println("구매수량 : " + vo.getCnt());
System.out.println("총 구매가격: " + vo.getPrice() * vo.getCnt());
System.out.println("반환금액 : " + vo.getNum());
System.out.println("=============================");
System.out.println(" ");
}
public void thanks() {
System.out.println("이용해주셔서 감사합니다!");
System.out.println(" ");
}
public void admin_startView() { // 관리자모드
while (true) {
System.out.println("=====관리자모드=====");
System.out.println("1.술 종류 추가 2.재고추가 3.술 삭제 4.관리자모드 종료");
System.out.print("정수 입력) ");
try {
action = sc.nextInt();
if (1 <= action && action <= 4) {
break;
}
System.out.println("범위 외 입력입니다!");
} catch (Exception e) {
sc.nextLine();
System.out.println("숫자를 입력해주세요.");
}
}
}
public void admin_success() {
System.out.println("수행성공");
}
public void admin_fail() {
System.out.println("수행실패");
}
public void addDrink() { // 술 추가
System.out.println("술 추가 메뉴입니다.");
}
public void category() { // 관리자1 : 종류 추가
System.out.println("추가하실 술의 종류를 입력해주세요.");
}
public void cnt() { // 관리자2 : 재고 설정
System.out.println("추가하실 수량을 입력해주세요.");
}
public void delete() { // 관리자3 : 음료삭제
System.out.println("음료를 삭제합니다.");
}
public void soolpk() { // 재고추가/삭제할 술 번호(pk) 입력
System.out.println("술의 번호를 입력해주세요.");
}
public void name() { // 술 이름
System.out.println("술의 이름을 입력해주세요.");
}
public int price() { // 술 가격 + 유효성검사
System.out.println("술의 가격을 입력해주세요.");
System.out.print("가격 입력) ");
while (true) {
try {
int price = sc.nextInt();
System.out.println();
if (price >= 1000) {
return price;
} else {
System.out.println("1000원 이상부터 입력해주세요.");
System.out.print("가격 입력) ");
continue;
}
} catch (Exception e) {
sc.nextLine();
System.out.println("숫자를 입력해주세요.");
continue;
}
}
}
public double abv() { // 술 도수 + 유효성검사
System.out.println("술의 도수를 입력해주세요.");
System.out.print("도수 입력) ");
while (true) {
try {
double abv = sc.nextDouble();
System.out.println();
if (abv > 0 && abv < 100) {
return abv;
} else {
System.out.println("0~100사이의 값을 입력해주세요");
System.out.print("도수 입력) ");
continue;
}
} catch (Exception e) {
sc.nextLine();
System.out.println("숫자를 입력해주세요.");
continue;
}
}
}
public void admin_off() {
System.out.println("관리자모드 종료합니다.");
}
public boolean buyAgain() {
while (true) {
try {
System.out.println("추가 구매 하시겠습니까?");
System.out.println("1.YES 2.NO");
System.out.print("정수 입력) ");
action = sc.nextInt();
if (action == 1) {
return true;
} else if (action == 2) {
return false;
} else {
System.out.println("범위 외 입력입니다.");
continue;
}
} catch (Exception e) {
sc.nextLine();
System.out.println("숫자를 입력해주세요.");
}
}
}
}
Controller
package controller;
import java.util.ArrayList;
import model.AlcDAO;
import model.AlcVO;
import model.CategoryVO;
import view.AlcView;
public class AlcController {
AlcDAO model = new AlcDAO();
AlcView view = new AlcView();
public void startApp() {
while (true) {
if (view.userAge()) { // 시작시 나이 인증
while (true) {
view.user_startView(); // 자판기 실행메뉴 선택
if (view.action == 1) { // 메뉴확인
AlcVO vo = new AlcVO();
view.menu(model.selectAll(vo)); // 전체메뉴 출력
} else if (view.action == 2) { // 구매하기
AlcVO vo = new AlcVO();
CategoryVO cate = new CategoryVO();
ArrayList<AlcVO> datas = model.selectAll(vo);
ArrayList<CategoryVO> catedatas = model.categoryAll(cate);
int choose = view.categoryMenu(catedatas); // 대분류 카테고리 출력 & 원하는 카테고리 선택
cate.setName(catedatas.get(choose - 1).getName());
if (model.categoryOne(cate) == null) { // 대분류 선택 시 없는 카테고리를 입력할 경우
view.fail();
continue;
}
view.sool(datas, cate); // 전체 배열에서 이름이 일치하는 소분류 카테고리 출력
// 구매할 술 이름 입력받기
while (true) {
view.buyName(); // 소분류 카테고리에서 술 이름 입력 받기
vo.setName(view.inputString()); // 구매할 술이름 입력
AlcVO vo2 =model.selectOne(vo);
if (vo2 == null) { // 이름이 없을 때
view.buyNameFail();
continue;
}
if (vo2.getCnt() == 0) { // 재고가 없을 때
view.buyCntFail();
continue;
}
break;
}
// 재고 확인하기
while (true) {
view.buyCnt(); // 이름이 있다면 재고 입력 받기
vo.setCnt(view.inputInt()); // 구매할 수량 입력
boolean flag2 = model.update(vo); // 구매 재고 확인
if (flag2 == false) { // false 반환 받으면
view.buyCntFail();// 재고 부족 출력
continue; // 다시 입력 받을 수 있게 한다.
}
break;
}
// 결제하기
AlcVO vo2 = new AlcVO(); // 객체 하나 더 만든 이유(price가져오기 위해서)
vo2 = model.selectOne(vo); // 현재 vo에는 이름/수량 담겨있음, selcetOne(이름 비교해서 같으면 객체 반환)
vo.setPrice(vo2.getPrice()); // 현재 vo2에는 모든 정보가 들어있음, 가격 가져와서 다시 vo에 set
int total = vo.getCnt() * vo.getPrice();
view.total(total);
int balance = 0;
while (true) {
view.money(); // 돈 입력 받기
int money = view.inputInt();
balance = money - total; // 투입금액 - 총 합계금액 = 잔돈
vo.setNum(balance);
while (true) {
if (total > money) { // 돈이 부족할때
view.balF(balance); // 부족한금액 출력
view.moneyAdd();
money += view.inputInt();
view.moneyIn(money);
balance = money - total;
vo.setNum(balance); // vo에 int로 받을 수 있는 num이 비어있기 때문에
// num에 잔돈을 넣은 후 view의 영수증출력 메서드 인자로 vo만 넣을 예정
}
if (money >= total) { // 돈이 초과되거나 같으면 stop
break;
}
}
view.success();
view.balT(total - money); // 잔돈 출력
break;
}
boolean flag3 = view.receipt(); // 영수증 출력 여부 확인
if (flag3) {
view.show_receipt(vo); // 영수증 출력
if(view.buyAgain()==true) { // 추가구매 한다면
continue; // 자판기 메뉴출력(나이입력 진행 x)
}
else { // 추가구매 안한다면
view.thanks();
break; // 처음 실행부분(나이입력)으로 이동
}
}
if(view.buyAgain()==false) { // 영수증 x 추가구매 x
view.thanks(); // 구매 종료
break;
}
continue;
}
else if (view.action == 3) { // 검색 (술이름으로 검색)
AlcVO vo = new AlcVO();
view.searchName();
vo.setName(view.inputString());
ArrayList<AlcVO> datas = model.selectAll(vo); // selectAll의 검색 기능
view.menu(datas);
} else if (view.action == 4) { // 프로그램 종료
view.off();
break;
}
}
} else if (view.age == 1234) { // 관리자 모드
while (true) {
view.admin_startView();
if (view.action == 1) { // 술 추가 메뉴
view.addDrink(); // 술 추가 메뉴입니다.
AlcVO vo = new AlcVO(); // 세팅할 객체 생성
CategoryVO cvo = new CategoryVO(); // 카테고리가 없는 종류는 추가를 할 수가 없어서 검사 진행을 위해
ArrayList<CategoryVO> catedatas = model.categoryAll(cvo);
ArrayList<AlcVO> datas = model.selectAll(vo);
while (true) {
view.category(); // 추가할 카테고리 입력해주세요
int choice = view.categoryMenu(catedatas); // 대분류 카테고리 출력 후 int 반환
vo.setCategory(catedatas.get(choice - 1).getName());
if (datas != null) {
break; // 카테고리가 있다면, 유효성검사 while문 탈출
}
else {
view.admin_fail();
continue; // 다시 입력 받도록 함
}
}
while(true) { // 원래있는 음료를 추가하려고 하는 경우
view.name();
String name = view.inputString(); // 이름 입력
vo.setName(name);
ArrayList<AlcVO> datas1 = model.selectAll(vo);
if(datas1.size() != 0) {
view.admin_fail();
continue;
}
break;
}
view.cnt();
int cnt = view.inputInt(); // 재고입력
vo.setCnt(cnt);
int price = view.price(); // 가격입력, 음수이거나 1000원 이하는 입력불가
vo.setPrice(price);
double abv = view.abv(); // 도수 입력, 음수이거나 100도 이상은 입력불가
vo.setAbv(abv);
if (model.insert(vo)) { // 술 추가
view.admin_success();
view.menu(datas);
} else {
view.admin_fail();
}
} else if (view.action == 2) { // 재고추가 메뉴
AlcVO vo = new AlcVO();
ArrayList<AlcVO> datas = model.selectAll(vo);
view.menu(datas); // 전체메뉴 출력
while (true) {
view.soolpk(); // 술 번호 입력 받기
int num = view.inputInt();
if (datas.size() < num) { // 해당 인덱스의 값이 없으면
view.admin_fail();
continue; // 다시 입력 받도록 함
}
vo.setNum(datas.get(num - 1).getNum()); // 재고추가할 술의 pk 대입
break;
}
view.cnt(); // 재고입력 받기
vo.setCnt(-view.inputInt()); // 추가할 재고 입력 - 재고추가시에는 음수로 들어가야함
if (model.update(vo)) { // 재고 추가
view.admin_success();
view.menu(datas);
} else {
view.admin_fail();
}
} else if (view.action == 3) { // 술 삭제 메뉴
AlcVO vo = new AlcVO();
ArrayList<AlcVO> datas = model.selectAll(vo);
view.menu(datas); // 전체메뉴 출력
while (true) {
view.soolpk();
int num = view.inputInt();
if (datas.size() < num) { // 해당 인덱스의 값이 없으면
view.admin_fail();
continue; // 다시 입력 받도록 함
}
vo.setNum(datas.get(num - 1).getNum()); // 삭제할 술의 pk 대입
break;
}
if (model.delete(vo)) { // 술 삭제
view.admin_success();
view.menu(datas);
} else {
view.admin_fail();
view.menu(datas);
}
} else if (view.action == 4) {
view.admin_off();
break;
}
else {
return;
}
}
}
}
}
}
728x90
'Java > study' 카테고리의 다른 글
웹크롤링하여 DB에 데이터 넣기 (0) | 2022.07.14 |
---|---|
SQL을 활용하여 MVC 응용 (0) | 2022.07.14 |
PrepareStatement 이용하기 (0) | 2022.07.05 |
JAVA에 DB연동하기 (0) | 2022.07.04 |
DDL / DML / DCL (0) | 2022.07.03 |