The Debugging Chronicles : "코드의 미학"
MVC 패턴 , SQL , 웹크롤링 본문
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 |