// LunchMainController, Runnable을 implements@Overridepublic void run() { // 30초마다 한번씩 조회를 수행 try { while (true) { searchOrder(); Thread.sleep(1000 * 30); } } catch (InterruptedException e) { JOptionPane.showMessageDialog(lmv, "조회 중 문제가 발생"); e.printStackTrace(); }}...@Overridepublic void mouseClicked(MouseEvent me) { if (me.getSource() == lmv.getJtb()) { // 탭에서 클릭이 발생했을 때만 if (lmv.getJtb().getSelectedIndex() == 1) { // 두번째 탭(주문)에서 이벤트 발생 // 실시간으로 DB를 조회하여 주문현황을 갱신 if (threadOrdering == null) { threadOrdering = new Thread(this); threadOrdering.start(); } } }...
클라이언트 주문 목록 조회를 프로시저로 구현
Out Parameter로 커서를 전달할 땐 SYS_REFCURSOR 사용
-- procedure lunch_order_select.sqlCREATE OR REPLACE PROCEDURE lunch_order_select( i_order_name IN VARCHAR2, i_phone IN VARCHAR2, cur_order_list OUT SYS_REFCURSOR)ISBEGIN OPEN cur_order_list FOR SELECT l.lunch_name, TO_CHAR(o.order_date, 'yyyy-mm-dd day hh24:mi:ss') order_date, o.quan FROM ordering o, lunch l WHERE l.lunch_code = o.lunch_code AND o.order_name=i_order_name AND o.phone=i_phone ORDER BY o.order_date DESC;END;/
자바에서 프로시저를 사용할 땐 CallableStatement를 사용
// LunchClientDAO...public List<OrderListVO> selectOrder(OrderInfoVO oivo) throws SQLException { List<OrderListVO> list = new ArrayList<OrderListVO>(); Connection con = null; CallableStatement cstmt = null; ResultSet rs = null; try { con = getConn(); cstmt = con.prepareCall(" { call lunch_order_select(?,?,?) }"); // in parameter : 외부 값을 프로시저 안으로 넣을 때 cstmt.setString(1, oivo.getOrderName()); cstmt.setString(2, oivo.getOrderTel()); // out parameter : 프로시저 내부 값을 외부에서 받을 때 cstmt.registerOutParameter(3, OracleTypes.CURSOR); cstmt.execute(); rs = (ResultSet)cstmt.getObject(3); OrderListVO olvo = null; while(rs.next()) { olvo = new OrderListVO(rs.getString("lunch_name"), rs.getString("order_date"), rs.getInt("quan")); System.out.println(olvo); list.add(olvo); } } finally { if (rs != null) { rs.close(); } if (cstmt != null) { cstmt.close(); } if (con != null) { con.close(); } } return list;}...
접두사, 접미사가 정해진 파일을 한정지을 땐 contains말고 startsWith나 endsWith를 사용한다!
private String[] lunchImageList() { String[] fileList = null; String path = "C:/Users/owner/youngRepositories/SSangYoung/dev/workspace/lunch_prj/src/kr/co/sist/lunch/user/img/"; File dir = new File(path); // 큰 이미지(s_가 붙지 않은)만 배열에 넣으세요. List<String> listFileName = new ArrayList<String>(); for(String f_name : dir.list()) { if (!f_name.startsWith("s_")) { // contains사용하면 위험!!! listFileName.add(f_name); } } fileList = new String[listFileName.size()]; listFileName.toArray(fileList); return fileList;}
서버에 도시락 추가 시 클라이언트가 가지지 않은 이미지 파일을 전송하는 기능이 필요
도시락 프로그램은 2 Tier 구조
DB 서버 - 서버
DB 서버 - 클라이언트
메뉴를 추가하면 추가된 이미지가 서버에만 추가됨
클라이언트에서 서버에 이미지명 배열을 보내면 서버가 없는 파일을 판단 후 파일로 전달
클라이언트와 서버에 Tier가 추가되어 n Tier 구조가 된다.
웹에선 DB 서버- Web 서버 - Web 클라이언트 3 Tier 구조가 일반적
DB서버와 Web 서버 사이에 Middleware가 들어가 n Tier 구조가 될 수 있음