The Debugging Chronicles : "코드의 미학"

MVC 패턴 , SQL , 웹크롤링 본문

DBMS

MVC 패턴 , SQL , 웹크롤링

sweetseonah1004 2024. 7. 30. 09:20

client

package client;

import ctrl.Ctrl;

public class Client {
	public static void main(String[] args) {
		Ctrl app=new Ctrl();
		app.start();
	}
}

 


CTRL

package ctrl;

import java.util.ArrayList;

import model.Crawling;
import model.MemberDAO;
import model.MemberDTO;
import model.ProductDAO;
import model.ProductDTO;
import view.View;

public class Ctrl {
	private View view;
	private MemberDAO memberDAO;
	private ProductDAO productDAO;
	// 일회성 데이터
	private String user; // 로그인한 사람의 정보
	private ArrayList<ProductDTO> cartList; // 로그인한 사람이 이용하는 장바구니 정보
	public Ctrl() {
		view=new View();
		memberDAO=new MemberDAO();
		productDAO=new ProductDAO();
		user=null;
		cartList=null;
	}
	// 모듈화(함수화,컴포넌트화)
	private boolean logout() {
		if(user==null) {
			view.func09();
			return false;
		}
		user=null;
		cartList=null;
		view.func08();
		return true;
	}
	private boolean isProductTableEmpty() {
		ProductDTO productDTO=new ProductDTO();
		productDTO.setCondition("ISEMPTY");
		// 전체 데이터의 갯수 하나가 궁금하기 때문에 selectOne
		productDTO=productDAO.selectOne(productDTO);
		// 안전성을 위해 범위를 '<= 0'로 함
		if(productDTO.getTotal()<=0) {
			return true;
		}
		return false;
	}
	private void makeSample() {
		// static이 되어있어서 객체를 생성하지 않는다.
		ArrayList<ProductDTO> datas=Crawling.makeSample();
		// 객체를 생성해서 하나하나 insert한다.
		// 한 번에 insert (x)
		for(ProductDTO data:datas) {
			boolean flag=productDAO.insert(data);
			// 한 번이라도 실패가 뜨면 즉시 멈추도록
			if(!flag) {
				view.func09();
				return;
			}
		}
		view.func08();
	}
	public void start() {
		// 테이블이 비어있다면 샘플 데이터를 넣어줌
		if(isProductTableEmpty()) {
			makeSample();
		}	

		while(true) {
			if(user==null) {
				view.func01();
			}
			else {
				view.func02();
				if(user.equals("ADMIN")) {
					view.func03();
				}
			}

			int num=view.func04();
			if(num==0) {
				view.func08();
				break;
			}
			else if(num==1) {
				// 인증(인가,허가,보안) 로직
				if(user!=null) {
					view.func09();
					continue;
				}

				String mid;
				while(true) {
					mid=view.func05();
					MemberDTO memberDTO=new MemberDTO();
					memberDTO.setMid(mid);
					memberDTO.setCondition("JOIN");
					memberDTO=memberDAO.selectOne(memberDTO);
					if(memberDTO==null) {
						break;
					}
					view.func09();
				}
				String password=view.func06();
				String name=view.func12();

				MemberDTO memberDTO=new MemberDTO();
				memberDTO.setMid(mid);
				memberDTO.setPassword(password);
				memberDTO.setName(name);

				boolean flag=memberDAO.insert(memberDTO);

				if(flag) {
					view.func08();
				}
				else {
					view.func09();
				}
			}
			else if(num==2) {
				if(user!=null) {
					view.func09();
					continue;
				}

				String mid=view.func05();
				String password=view.func06();

				MemberDTO memberDTO=new MemberDTO();
				memberDTO.setMid(mid);
				memberDTO.setPassword(password);
				memberDTO.setCondition("LOGIN");

				memberDTO=memberDAO.selectOne(memberDTO);

				if(memberDTO==null) {
					view.func09();
					continue;
				}
				user=memberDTO.getMid();
				cartList=new ArrayList<ProductDTO>();
				view.func08();
			}
			else if(num==3) {
				if(!logout()) {
					continue;
				}
			}
			else if(num==4) {
				if(user==null) {
					view.func09();
					continue;
				}

				String password=view.func06();

				MemberDTO memberDTO=new MemberDTO();
				memberDTO.setMid(user);
				memberDTO.setPassword(password);

				boolean flag=memberDAO.update(memberDTO);

				if(!flag) {
					view.func09();
					continue;
				}

				if(!logout()) {
					continue;
				}

				view.func08();
			}
			else if(num==5) {
				if(user==null) {
					view.func09();
					continue;
				}

				String password=view.func06();

				MemberDTO memberDTO=new MemberDTO();
				memberDTO.setMid(user);
				memberDTO.setPassword(password);
				memberDTO.setCondition("LOGIN");

				memberDTO=memberDAO.selectOne(memberDTO);

				if(memberDTO==null) {
					view.func09();
					continue;
				}

				memberDTO=new MemberDTO();
				memberDTO.setMid(user);

				boolean flag=memberDAO.delete(memberDTO);

				if(!flag) {
					view.func09();
					continue;
				}

				if(!logout()) {
					continue;
				}

				view.func08();
			}
			else if(num==6) {
				// 관리자 모드
				if( user==null || !( user.equals("ADMIN") ) ) {
					view.func09();
					continue;
				}

				String name=view.func11();
				int price=view.func13();

				ProductDTO productDTO=new ProductDTO();
				productDTO.setName(name);
				productDTO.setPrice(price);

				boolean flag=productDAO.insert(productDTO);

				if(!flag) {
					view.func09();
					continue;
				}
				view.func08();
			}
			else if(num==7) {
				////상품 목록 출력 로직
				// 사용자가 목록출력을 눌렀을 때 

				// DTO를 new 해야함
				// A는 PRODUCT DAO가 보여줘야 함
				// .selectAll(DTO)을 호출해야 함
				// 사용자에게 PRODUCT DB(=> A)를 보여줘야 함
				ProductDTO productDTO = new ProductDTO();
				productDTO.setCondition("ALL_NUM");
				ArrayList<ProductDTO> datas = productDAO.selectAll(productDTO);

				view.func07(datas);
				// == view.func07(productDAO.selectAll(new ProductDTO()))
			}
			else if(num==8) {  // 상품 검색
				// DB가 비어있다면 무조건 샘플 데이터를 넣으므로 isEmpty는 생략
				/////상품 이름으로 검색 로직
				// 검색에 사용할 상품 객체 생성
				ProductDTO data = new ProductDTO();

				// V로부터 검색할 상품 이름을 받는다.
				String searchKeyword = view.func11();

				// 상품 객체에 이름을 담음
				data.setSearchKeyword(searchKeyword);
				// 이름으로 검색하는 condition 설정
				data.setCondition("NAME_KEYWORD");

				// M에게 객체를 전달하고 데이터를 받음 selectAll
				ArrayList<ProductDTO> datas = productDAO.selectAll(data);

				// V에게 데이터들을 전달
				view.func07(datas);						
			}
			else if(num==9) {
				/////상품 가격순으로 정렬 출력
				// 새로운 배열리스트 data 객체 생성
				ProductDTO data = new ProductDTO();
				// condition에 가격순 정렬이라는 값 넣기
				data.setCondition("ALL_PRICE");
				// selectAll로 데이터 불러와서 반환
				ArrayList<ProductDTO> datas = productDAO.selectAll(data);

				// V에게 전달
				view.func07(datas);
			}
			else if(num==10) {
				if(user==null) {
					view.func09();
					continue;
				}

				/////장바구니에 상품추가
				// V에게 값을 받아옴
				int productNum=view.func10();

				// 물건을 담을 새로운 객체 생성
				ProductDTO data=new ProductDTO();
				// 물건 하나를 받는다고 지정
				data.setCondition("ONE");
				// 물품 번호(PK) 넣음
				data.setNum(productNum);
				// 해당 번호가 알맞은 객체 찾음 selectOne
				data=productDAO.selectOne(data);

				// 제품이 없거나, 재고수가 없으면 못 담음
				if(data==null || data.getCnt()<=0) {
					view.func09();
					continue;
				}

				// 상품보여주고
				// 개수받아와서
				int buyNum = view.func14(data);
				// 구매 갯수를 장바구니에 넣어주고
				data.setCnt(buyNum);

				// 카트에 저장하기
				this.cartList.add(data);
			}
			else if(num==11) {
				if(user==null) {
					view.func09();
					continue;
				}

				/////장바구니 목록 구매 로직
				// 결과를 담을 flag 함수 생성 (기본 값을 false로)
				boolean flag = false;

				// 카트보여주고
				// V에게 카트 데이터를 전달함
				// 구매 의사 확인
				if(view.func15(this.cartList)) {
					// 만약 아니라면 밑에 프로그램 스킵
					continue;
				}

				// 재고수 백업 리스트 생성
				ArrayList<ProductDTO> saveCnt = new ArrayList<ProductDTO>();
				
				// 카트목록 하나씩 UPDATE				
				// for each 문으로 재고수 계산
				for(ProductDTO data : this.cartList) {
					// 물건을 불러올 객체 하나 생성
					ProductDTO productDTO = new ProductDTO();
					// 객체에 바구니 안의 물품 번호와 condition 변수에 ONE을 넣어줌
					productDTO.setNum(data.getNum());
					productDTO.setCondition("ONE");;
					// selectOne으로 물품번호가 같은 객체를 가져옴
					productDTO = productDAO.selectOne(productDTO);
					
					// 재고 백업 리스트에 재고수 저장
					saveCnt.add(productDTO);

					// 재고수 계산
					productDTO.setCnt(productDTO.getCnt() - data.getCnt());

					// update하고 결과를 받음
					flag = productDAO.update(productDTO);

					// 하나라도 안되면 바로 false
					if(flag) {
						// 재고수 복원
						// for each문으로 백업리스트만큼 반복
						for(ProductDTO saveData : saveCnt) {
						// 재고수를 원래대로 업데이
							productDAO.update(saveData);
						}
						
						view.func09();
						// 반복문 나가기
						break;
					}
				}
				
				// 다되면 true
				if(flag) {
					// 장바구니 전부 비우기
					this.cartList.clear();
					view.func08();
				}
			}
			else if(num==12) {
				if( user==null || !( user.equals("ADMIN") ) ) {
					view.func09();
					continue;
				}

				int productNum=view.func10();

				ProductDTO productDTO=new ProductDTO();
				productDTO.setNum(productNum);

				boolean flag=productDAO.delete(productDTO);

				if(!flag) {
					view.func09();
					continue;
				}
				view.func08();
			}
		}
	}
}

 

Crawling

package model;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class Crawling {
	public static ArrayList<ProductDTO> makeSample() {
		ArrayList<ProductDTO> datas=new ArrayList<ProductDTO>();

		String url="http://camelmart.godomall.com/main/index.php";
		Connection conn=Jsoup.connect(url);

		Document doc=null;
		try {
			doc=conn.get();
		} catch (IOException e) {
			System.err.println("doc 확보 실패 ...");
		}

		// 가공(정제) 작업
		Elements elems = doc.select("strong.item_name");
		int cnt=0;
		
		// 상품명
		for(Element elem:elems) {
			if(cnt%10 == 0) {
				ProductDTO data=new ProductDTO(); // DTO 객체 생성
				data.setName(elem.text());
				datas.add(data); // 배열리스트에 생성한 DTO 객체 추가
			}
			cnt++;
		}

		// 가격
		Elements elems02 = doc.select("strong.item_price > span");
		cnt=0;
		int i=0;
		for(Element elem:elems02) {
			if(cnt%10 == 0) {
				String str=elem.text();
				str=str.replace("원", "");
				str=str.replace(",", "");
				int price=Integer.parseInt(str);
				datas.get(i++).setPrice(price); // 배열리스트에 추가한 DTO 객체의 setter 호출
			}
			cnt++;
		}
		
		Random rand = new Random();
		for(i = 0; i < datas.size(); i++) {
			datas.get(i).setCnt(rand.nextInt(101));
		}

		return datas;
	}
}

 

JDBCUtil

package model;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

// XxxUtil
// == 패턴화(템플릿화)된 코드
public class JDBCUtil {

	// final : 상수화
	private static final String driverName="oracle.jdbc.driver.OracleDriver";
	private static final String url="jdbc:oracle:thin:@localhost:1521:xe";
	private static final String userName="SYSTEM";
	private static final String password="pass";
	
	
	// [1,2]단계
	public static Connection connect() {
		Connection conn=null;
		
		try {
			Class.forName(driverName);
		} catch (ClassNotFoundException e) {
			System.err.println("[1]단계 실패 ...");
		} finally {
			System.err.println("드라이버를 메모리에 로드(load,적재)");
		}
		
		try {
			conn=DriverManager.getConnection(url, userName, password);
		} catch (SQLException e) {
			System.err.println("[2]단계 실패 ...");
		} finally {
			System.err.println("연결 객체 확보");
		}
		
		return conn;
	}
	
	// [4]단계
	public static boolean disconnect(Connection conn, PreparedStatement pstmt) {
		try {
			pstmt.close();
			conn.close();
		} catch (SQLException e) {
			System.err.println("[4]단계 실패 ...");
			return false;
		} finally {
			System.err.println("연결 해제");
		}
		return true;
	}
	
}

 

 

MEMBER.SQL

-- SQL == 인터프리터 언어 == 스트립트어

-- 테이블 == DB == ArrayList<MemberDTO> == 배열리스트 == DAO의 멤버변수 datas를 의미
CREATE TABLE MEMBER(
	MID VARCHAR(20) PRIMARY KEY,
	PASSWORD VARCHAR(20) NOT NULL,
	NAME VARCHAR(20) NOT NULL
);

INSERT INTO MEMBER (MID,PASSWORD,NAME) VALUES('ADMIN','1234','관리자');
UPDATE MEMBER SET PASSWORD=? WHERE MID=?;
DELETE FROM MEMBER WHERE MID=?;

SELECT MID,PASSWORD,NAME FROM MEMBER WHERE MID=?;
SELECT MID,PASSWORD,NAME FROM MEMBER WHERE MID=? AND PASSWORD=?;

DROP TABLE MEMBER;

SELECT * FROM MEMBER;

 

MEMBERDAO

package model;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class MemberDAO {

	// 가독성 높아짐
	// 응집도 높아짐
	// 유지보수 용이	
	private final String INSERT="INSERT INTO MEMBER (MID,PASSWORD,NAME) VALUES(?,?,?)";
	private final String UPDATE="UPDATE MEMBER SET PASSWORD=? WHERE MID=?";
	private final String DELETE="DELETE FROM MEMBER WHERE MID=?";

	private final String SELECTONE_LOGIN="SELECT MID,PASSWORD,NAME FROM MEMBER WHERE MID=? AND PASSWORD=?";
	private final String SELECTONE_JOIN="SELECT MID,PASSWORD,NAME FROM MEMBER WHERE MID=?";

	public boolean insert(MemberDTO memberDTO) {

		// XxxUtil류는 객체 중요 x
		// 메서드 중요 O --->> 메서드를 클래스메서드화(static화 == 객체와 무관하게)
		Connection conn=JDBCUtil.connect();

		PreparedStatement pstmt=null;
		try {
			pstmt=conn.prepareStatement(INSERT);
			pstmt.setString(1, memberDTO.getMid());
			pstmt.setString(2, memberDTO.getPassword());
			pstmt.setString(3, memberDTO.getName());
			int result = pstmt.executeUpdate();
			if(result <= 0) {
				System.err.println("SQL문은 올바른데, DTO 값이 이상할수도있음 ...");
				return false;
			}
		} catch (SQLException e) {
			System.err.println("[3]단계 실패 ...");
			return false;
		} finally {
			System.err.println("DB에 데이터를 write");
		}

		boolean flag=JDBCUtil.disconnect(conn, pstmt);

		return flag;
	}
	public boolean update(MemberDTO memberDTO) {
		Connection conn=JDBCUtil.connect();

		PreparedStatement pstmt=null;
		try {
			pstmt=conn.prepareStatement(UPDATE);
			pstmt.setString(1, memberDTO.getPassword());
			pstmt.setString(2, memberDTO.getMid());
			int result = pstmt.executeUpdate();
			if(result <= 0) {
				System.err.println("SQL문은 올바른데, DTO 값이 이상할수도있음 ...");
				return false;
			}
		} catch (SQLException e) {
			System.err.println("[3]단계 실패 ...");
			return false;
		} finally {
			System.err.println("DB에 데이터를 write");
		}

		boolean flag=JDBCUtil.disconnect(conn, pstmt);

		return flag;
	}
	public boolean delete(MemberDTO memberDTO) {
		Connection conn=JDBCUtil.connect();

		PreparedStatement pstmt=null;
		try {
			pstmt=conn.prepareStatement(DELETE);
			pstmt.setString(1, memberDTO.getMid());
			int result = pstmt.executeUpdate();
			if(result <= 0) {
				System.err.println("SQL문은 올바른데, DTO 값이 이상할수도있음 ...");
				return false;
			}
		} catch (SQLException e) {
			System.err.println("[3]단계 실패 ...");
			return false;
		} finally {
			System.err.println("DB에 데이터를 write");
		}

		boolean flag=JDBCUtil.disconnect(conn, pstmt);

		return flag;
	}
	private ArrayList<MemberDTO> selectAll(MemberDTO memberDTO) {
		return null;
	}
	public MemberDTO selectOne(MemberDTO memberDTO) {
		Connection conn=JDBCUtil.connect();

		PreparedStatement pstmt=null;
		try {
			if(memberDTO.getCondition().equals("LOGIN")) {
				pstmt = conn.prepareStatement(SELECTONE_LOGIN);
				pstmt.setString(1, memberDTO.getMid());
				pstmt.setString(2, memberDTO.getPassword());
			}
			else if(memberDTO.getCondition().equals("JOIN")) {
				pstmt = conn.prepareStatement(SELECTONE_JOIN);
				pstmt.setString(1, memberDTO.getMid());
			}
			ResultSet rs=pstmt.executeQuery();
			if(rs.next()) {
				MemberDTO data=new MemberDTO();
				data.setMid(rs.getString("MID"));
				data.setPassword(rs.getString("PASSWORD"));
				data.setName(rs.getString("NAME"));
				return data;
			}
			else {
				return null;
			}
		} catch (SQLException e) {
			System.err.println("[3]단계 실패 ...");
			return null;
		} finally {
			System.err.println("DB로부터 데이터를 read");

			boolean flag=JDBCUtil.disconnect(conn, pstmt);
			if(!flag) {
				return null;
			}
		}
	}

}

 

MEMBERDTO

package model;

public class MemberDTO {
	private String mid;
	private String password;
	private String name;
	private String condition;
	public String getCondition() {
		return condition;
	}
	public void setCondition(String condition) {
		this.condition = condition;
	}
	public String getMid() {
		return mid;
	}
	public void setMid(String mid) {
		this.mid = mid;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return "MemberDTO [mid=" + mid + ", password=" + password + ", name=" + name + "]";
	}
}

 

PRODUCT.SQL

CREATE TABLE PRODUCT(
	NUM INT PRIMARY KEY,
	NAME VARCHAR(500) NOT NULL,
	PRICE INT,
	CNT INT DEFAULT 0
);

-- 서브쿼리
INSERT INTO PRODUCT (NUM,NAME,PRICE) VALUES ((SELECT NVL(MAX(NUM),0)+1 FROM PRODUCT),?,?);
UPDATE PRODUCT SET CNT=CNT-? WHERE NUM=?;
DELETE FROM PRODUCT WHERE NUM=?;

SELECT NUM,NAME,PRICE,CNT FROM PRODUCT WHERE NUM=?;
SELECT NUM,NAME,PRICE,CNT FROM PRODUCT ORDER BY NUM;

SELECT NUM,NAME,PRICE,CNT FROM PRODUCT WHERE NAME LIKE '%?%';
SELECT NUM,NAME,PRICE,CNT FROM PRODUCT ORDER BY PRICE;
SELECT COUNT(*) AS TOTAL FROM PRODUCT;
--SELECT COUNT(*) FROM PRODUCT;
-- 열(컬럼, colum) 이름이 없어서 JAVA에서 rs(ResultSet)을 통해 불러올 수 없음
-- AS 별칭을 선택해

--data == row == 행 == 튜플 == 레코드 == DTO
SELECT 

DROP TABLE PRODUCT;

 

ProductDAO

package model;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.concurrent.locks.Condition;

public class ProductDAO {

	// 물음표가 늘어나면 pstmt.set도 늘어남
	private final String INSERT="INSERT INTO PRODUCT (NUM,NAME,PRICE,CNT) VALUES ((SELECT NVL(MAX(NUM),0)+1 FROM PRODUCT),?,?,?)";
	private final String DELETE="DELETE FROM PRODUCT WHERE NUM=?";

	// 잘 돌아가는지 SQL에서 보고 가져오기
	private final String SELECTALL_DEFAULT = "SELECT NUM,NAME,PRICE,CNT FROM PRODUCT ORDER BY NUM";
	private final String SELECTALL_ORDER_PRICE = "SELECT NUM,NAME,PRICE,CNT FROM PRODUCT ORDER BY PRICE";
	// 오라클 한정으로 '%||?||%'으로 써야 함
	private final String SELECTALL_NAME = "SELECT NUM,NAME,PRICE,CNT FROM PRODUCT WHERE NAME LIKE '%'||?||'%'";

	private final String SELECTONE_ISEMPTY="SELECT COUNT(*) AS TOTAL FROM PRODUCT";
	private final String SELECTONE_PK="SELECT NUM,NAME,PRICE,CNT FROM PRODUCT WHERE NUM=?";

	public boolean insert(ProductDTO productDTO) {
		Connection conn=JDBCUtil.connect();

		PreparedStatement pstmt=null;
		try {
			pstmt=conn.prepareStatement(INSERT);
			pstmt.setString(1, productDTO.getName());
			pstmt.setInt(2, productDTO.getPrice());
			pstmt.setInt(3, productDTO.getCnt());
			int result = pstmt.executeUpdate();
			if(result <= 0) {
				System.err.println("SQL문은 올바른데, DTO 값이 이상할수도있음 ...");
				return false;
			}
		} catch (SQLException e) {
			System.err.println("[3]단계 실패 ...");
			return false;
		} finally {
			System.err.println("DB에 데이터를 write");
		}

		boolean flag=JDBCUtil.disconnect(conn, pstmt);

		return flag;
	}
	public boolean update(ProductDTO productDTO) {
		return false;
	}
	public boolean delete(ProductDTO productDTO) {
		Connection conn=JDBCUtil.connect();

		PreparedStatement pstmt=null;
		try {
			pstmt=conn.prepareStatement(DELETE);
			pstmt.setInt(1, productDTO.getNum());
			int result = pstmt.executeUpdate();
			if(result <= 0) {
				System.err.println("SQL문은 올바른데, DTO 값이 이상할수도있음 ...");
				return false;
			}
		} catch (SQLException e) {
			System.err.println("[3]단계 실패 ...");
			return false;
		} finally {
			System.err.println("DB에 데이터를 write");
		}

		boolean flag=JDBCUtil.disconnect(conn, pstmt);

		return flag;
	}
	public ArrayList<ProductDTO> selectAll(ProductDTO productDTO) {
		// 배열을 반환해야 함
		ArrayList<ProductDTO> datas = new ArrayList<ProductDTO>();

		Connection conn = JDBCUtil.connect();

		PreparedStatement pstmt = null;
		try {
			if(productDTO.getCondition().equals("ALL_NUM")) {
				// System.err.println("   로그 : getCondition() ALL_NUM");
				pstmt = conn.prepareStatement(SELECTALL_DEFAULT);
			}
			else if(productDTO.getCondition().equals("ALL_PRICE")) {
				// System.err.println("   로그 : getCondition() ALL_PRICE");
				pstmt = conn.prepareStatement(SELECTALL_ORDER_PRICE);
			}
			else if(productDTO.getCondition().equals("NAME_KEYWORD")) {
				// System.err.println("   로그 : getCondition() NAME_KEYWORD");
				pstmt = conn.prepareStatement(SELECTALL_NAME);
				pstmt.setString(1, productDTO.getSearchKeyword());
			}

			// ?가 없다면 set을 안 해도 됨
			// 가져오는 것이므로 query
			// System.err.println("   로그 : executeQuery()");
			ResultSet rs = pstmt.executeQuery();

			// 데이터 반환이 몇 개인지 모른다
			while(rs.next()) {
				ProductDTO data = new ProductDTO();
				data.setNum(rs.getInt("NUM"));
				data.setName(rs.getString("NAME"));
				data.setPrice(rs.getInt("PRICE"));
				data.setCnt(rs.getInt("CNT"));
				// System.err.println("   로그 : 데이터 반환 성공" + data);
				datas.add(data);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			// System.err.println("   로그 : catch");
			e.printStackTrace();
		}


		// 실패하든 성공하든 데이터는 가기 때문에 반환값을 사용하지 않는다.
		JDBCUtil.disconnect(conn, pstmt);

		// System.err.println("   로그 : selectAll() 반환");
		return datas;
	}
	public ProductDTO selectOne(ProductDTO productDTO) {
		Connection conn=JDBCUtil.connect();

		PreparedStatement pstmt=null;
		try {
			// 데이터의 갯수를 확인하려는 기능
			if(productDTO.getCondition().equals("ISEMPTY")) {
				pstmt = conn.prepareStatement(SELECTONE_ISEMPTY);

				// 결과값을 가져옴
				// System.err.println("    로그 : condition() ONE 실행 완료");
				ResultSet rs=pstmt.executeQuery();
				// System.err.println("    로그 : ResultSet 완료");
				// 만약 결과가 있다면
				if(rs.next()) {
					// System.err.println("    로그 : rs 결과 있음");
					ProductDTO data=new ProductDTO();
					// 별칭으로 불러온다.
					data.setTotal(rs.getInt("TOTAL"));
					// System.err.println("    로그 : data 반환");
					return data;
				}
				else {
					// System.err.println("    로그 : null 반환");
					return null;
				}
			}
			// 데이터에서 PK값이 일치하는 값을 가져오려는 기능
			if(productDTO.getCondition().equals("ONE")) {
				// System.err.println("    로그 : condition() ONE 실행");
				pstmt = conn.prepareStatement(SELECTONE_PK);
				pstmt.setInt(1, productDTO.getNum());
			}

			// 결과값을 가져옴
			// System.err.println("    로그 : condition() ONE 실행 완료");
			ResultSet rs=pstmt.executeQuery();
			// System.err.println("    로그 : ResultSet 완료");
			// 만약 결과가 있다면
			if(rs.next()) {
				// System.err.println("    로그 : rs 결과 있음");
				ProductDTO data=new ProductDTO();
				data.setName(rs.getString("NAME"));
				data.setCnt(rs.getInt("CNT"));
				data.setNum(rs.getInt("NUM"));
				data.setPrice(rs.getInt("PRICE"));
				// System.err.println("    로그 : data 반환");
				return data;
			}
			else {
				// System.err.println("    로그 : null 반환");
				return null;
			}
		} catch (SQLException e) {
			// System.err.println("[3]단계 실패 ...");
			return null;
		} finally {
			// System.err.println("DB로부터 데이터를 read");

			boolean flag=JDBCUtil.disconnect(conn, pstmt);
			if(!flag) {
				return null;
			}
		}
	}
}

 

ProductDTO

package model;

public class ProductDTO {
	private int num;
	private String name;
	private int price;
	private int cnt;
	private String condition;
	private int total;  // 물건 전체 갯수
	private String searchKeyword;  // searchContent
	public String getSearchKeyword() {
		return searchKeyword;
	}
	public void setSearchKeyword(String searchKeyword) {
		this.searchKeyword = searchKeyword;
	}
	public String getCondition() {
		return condition;
	}
	public void setCondition(String condition) {
		this.condition = condition;
	}
	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 int getTotal() {
		return total;
	}
	public void setTotal(int total) {
		this.total = total;
	}
	@Override
	public String toString() {
		return "ProductDTO [num=" + num + ", name=" + name + ", price=" + price + ", cnt=" + cnt + "]";
	}
}

 

View

package view;

import java.util.ArrayList;
import java.util.Scanner;

import model.ProductDTO;

public class View {
	public static Scanner sc=new Scanner(System.in);
	public void func01() {
		System.out.println("1. 회원가입");
		System.out.println("2. 로그인");
		System.out.println("7. 상품 목록 출력");
		System.out.println("8. 상품 이름으로 검색");
		System.out.println("9. 상품 가격순으로 정렬 출력");
		System.out.println("0. 프로그램 종료");
	}
	public void func02() {
		System.out.println("3. 로그아웃");
		System.out.println("4. 비밀번호 변경");
		System.out.println("5. 회원탈퇴");
		System.out.println("10. 상품을 장바구니에 추가");
		System.out.println("11. 장바구니 목록 구매");
	}
	// 관리자 모드
	public void func03() {
		System.out.println("6. 상품추가");
		System.out.println("12. 상품삭제");
	}
	public int func04() {
		System.out.print("메뉴번호입력 >> ");
		int num=sc.nextInt();
		return num;
	}
	public String func05() {
		System.out.print("회원아이디입력 >> ");
		String id=sc.next();
		return id;
	}
	public String func06() {
		System.out.print("회원비밀번호입력 >> ");
		String password=sc.next();
		return password;
	}
	public void func07(ArrayList<ProductDTO> datas) {	
		// datas가 비어있는지 확인
		if(datas.size() <= 0) {
			System.out.println("검색 결과가 없습니다.");
		}

		for(ProductDTO data:datas) {
			// 재고가 0일 때
			if(data.getCnt() <= 0) {
				System.out.println("재고 품절");
				continue;
			}
			System.out.println(data);
		}
	}
	public void func08() {
		System.out.println("성공!");
	}
	public void func09() {
		System.out.println("실패...");
	}
	public int func10() {
		System.out.print("상품번호입력 >> ");
		int num=sc.nextInt();
		return num;
	}
	public String func11() {
		System.out.print("상품이름입력 >> ");
		String name=sc.next();
		return name;
	}
	public String func12() {
		System.out.print("회원이름입력 >> ");
		String name=sc.next();
		return name;
	}
	public int func13() {
		System.out.print("상품가격입력 >> ");
		int price=sc.nextInt();
		return price;
	}
	public int func14(ProductDTO data) {
		// 상품 정보 출력
		System.out.println("상품 번호 : "+data.getNum()+", 상품명 : " + data.getName()+", 재고 수 : "+ data.getCnt());
		// 유효성 검사
		int num;
		while(true) {
			System.out.print("구매 갯수 입력 >> ");
			// 재고 수 보다 작고, 0보다 클 때만 반복문을 나감
			num=sc.nextInt();
			if(0 < num && num < data.getCnt()) {
				break;
			}
		}
		return num;
	}
	public boolean func15(ArrayList<ProductDTO> datas) {	
		// 장바구니가 비어있는지 확인
		if(datas.size() <= 0) {
			System.out.println("장바구니가 비어있습니다.");
			return false;
		}

		// 장바구니 목록 출력
		for(ProductDTO data:datas) {
			System.out.println(data);
		}
		
		// 장바구이 목록 구매 의사 확인
		System.out.print("장바구니 목록들을 구매하시겠습니까? (Y/N)");
		String ans = sc.next();
		if(ans.equals("Y")) {
			return true;
		}
		return false;
	}
}

'DBMS' 카테고리의 다른 글

정규화 - 2 (JOIN문)  (0) 2024.08.12
정규화  (0) 2024.08.12
PRODUCT.SQL - NVL 함수  (0) 2024.07.30