▼ 코드 예시 (더보기 클릭) 
더보기

 

class OrderController
package com.greedy.section01.controller;

import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Map;

import com.greedy.section01.model.dto.CategoryDTO;
import com.greedy.section01.model.dto.MenuDTO;
import com.greedy.section01.model.dto.OrderDTO;
import com.greedy.section01.model.dto.OrderMenuDTO;
import com.greedy.section01.model.service.OrderService;
import com.greedy.section01.view.ResultView;

public class OrderController {
	
	private OrderService orderService = new OrderService();

	public List<CategoryDTO> selectAllCategory() {
		
		List<CategoryDTO> categoryList = orderService.selectAllCategory();
		
		return categoryList;
	}

	public List<MenuDTO> selectMenuByCategory(int categoryCode) {
		return orderService.selectMenuByCategory(categoryCode);
	}

	public void registOrder(Map<String, Object> requestMap) {
		/* Controller가 하는 역할은 뷰에서 사용자가 입력한 정보를 파라미터 형태로 전달 받으면
		 * 전달 받은 값들을 검증하거나 추가적인 정보가 필요한 경우 가공을 한 뒤
		 * 서비스 쪽으로 전달하기 위한 인스턴스에 담고 서비스의 비즈니스 로직을 담당하는 메소드를 호출한다.
		 * 또한 호출한 수행 결과를 반환 받아 어떠한 뷰를 다시 사용자에게 보여줄 것인지를 결정하는 역할을 한다.
		 * */
		
		/* 1. 뷰에서 전달 받은 파라미터 꺼내서 변수에 담기 */
		int totalOrderPrice = (Integer)requestMap.get("totalOrderPrice");
		List<OrderMenuDTO> orderMenuList = (List<OrderMenuDTO>)requestMap.get("orderMenuList");
		
		/* 2. 추가적으로 필요한 값이 있는 경우 생성하기 */
		java.util.Date orderTime = new java.util.Date();
		SimpleDateFormat dateFormat = new SimpleDateFormat("yy/MM/dd");
		SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
		String date = dateFormat.format(orderTime);
		String time = timeFormat.format(orderTime);
		
		/* 3. 서비스쪽으로 전달하기 위해 DTO 인스턴스에 담기 */
		OrderDTO order = new OrderDTO();
		order.setDate(date);
		order.setTime(time);
		order.setTotalOrderPrice(totalOrderPrice);
		order.setOrderMenuList(orderMenuList);
		
		/* 4. 서비스(비즈니스 로직)를 호출하고 결과를 리턴 받음 */
		int result = orderService.registOrder(order);
		
		/* 5. 서비스 처리 결과를 이용해 성공 실패 여부를 판단하여 사용자에게 보여줄 뷰를 결정함 */
		ResultView resultView = new ResultView();
		if(result > 0) {
			resultView.success();
		} else {
			resultView.failed();
		}
 	}
	
	

}

 

 

class OrderDAO
package com.greedy.section01.model.dao;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import static com.greedy.common.JDBCTemplate.close;
import com.greedy.section01.model.dto.CategoryDTO;
import com.greedy.section01.model.dto.MenuDTO;
import com.greedy.section01.model.dto.OrderDTO;
import com.greedy.section01.model.dto.OrderMenuDTO;

public class OrderDAO {
	
	private Properties prop = new Properties();
	
	public OrderDAO() {
		try {
			prop.loadFromXML(new FileInputStream("mapper/order-query.xml"));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/* 모든 카테고리 조회용 메소드 */
	public List<CategoryDTO> selectAllCategory(Connection con) {
		
		PreparedStatement pstmt = null;
		ResultSet rset = null;
		
		List<CategoryDTO> categoryList = null;
		
		String query = prop.getProperty("selectAllCategory");
		
		try {
			pstmt = con.prepareStatement(query);
			rset = pstmt.executeQuery();
			
			categoryList = new ArrayList<>();
			
			while(rset.next()) {
				CategoryDTO category = new CategoryDTO();
				category.setCode(rset.getInt("CATEGORY_CODE"));
				category.setName(rset.getString("CATEGORY_NAME"));
				
				categoryList.add(category);
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(rset);
			close(pstmt);
		}
		
		return categoryList;
	}
	
	/* 카테고리별 메뉴 조회용 메소드 */
	public List<MenuDTO> selectMenuByCategory(Connection con, int categoryCode){
		
		PreparedStatement pstmt = null;
		ResultSet rset = null;
		
		List<MenuDTO> menuList = null;
		
		String query = prop.getProperty("selectMenuByCategory");
		
		try {
			pstmt = con.prepareStatement(query);
			pstmt.setInt(1, categoryCode);
			
			rset = pstmt.executeQuery();
			
			menuList = new ArrayList<>();
			
			while(rset.next()) {
				MenuDTO menu = new MenuDTO();
				menu.setCode(rset.getInt("MENU_CODE"));
				menu.setName(rset.getString("MENU_NAME"));
				menu.setPrice(rset.getInt("MENU_PRICE"));
				menu.setCategoryCode(rset.getInt("CATEGORY_CODE"));
				menu.setOrderableStatus(rset.getString("ORDERABLE_STATUS"));
				
				menuList.add(menu);
			}
		
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(rset);
			close(pstmt);
		}
		
		return menuList;
	}

	/* 주문 정보 입력용 메소드 */
	public int insertOrder(Connection con, OrderDTO order) {
		
		PreparedStatement pstmt = null;
		int result = 0;
		
		String query = prop.getProperty("insertOrder");
		
		try {
			pstmt = con.prepareStatement(query);
			pstmt.setString(1, order.getDate());
			pstmt.setString(2, order.getTime());
			pstmt.setInt(3, order.getTotalOrderPrice());
			
			result = pstmt.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(pstmt);
		}
		
		return result;
	}

	/* 주문 메뉴별 입력용 메소드 */
	public int insertOrderMenu(Connection con, OrderMenuDTO orderMenu) {
		
		PreparedStatement pstmt = null;
		int result = 0;
		
		String query = prop.getProperty("insertOrderMenu");
		
		try {
			pstmt = con.prepareStatement(query);
			pstmt.setInt(1, orderMenu.getMenuCode());
			pstmt.setInt(2, orderMenu.getOrderAmount());
			
			result = pstmt.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(pstmt);
		}

		return result;
	}
	
	

}

 

 

 CategoryDTO
package com.greedy.section01.model.dto;

public class CategoryDTO {
	
	private int code;
	private String name;
	private Integer refCategoryCode;
	
	public CategoryDTO() {}

	public CategoryDTO(int code, String name, Integer refCategoryCode) {
		super();
		this.code = code;
		this.name = name;
		this.refCategoryCode = refCategoryCode;
	}

	public int getCode() {
		return code;
	}

	public void setCode(int code) {
		this.code = code;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getRefCategoryCode() {
		return refCategoryCode;
	}

	public void setRefCategoryCode(Integer refCategoryCode) {
		this.refCategoryCode = refCategoryCode;
	}

	@Override
	public String toString() {
		return "CategoryDTO [code=" + code + ", name=" + name + ", refCategoryCode=" + refCategoryCode + "]";
	}
	
	
}

 

 

class MenuDTO 
package com.greedy.section01.model.dto;

/* DTO(Data Transfer Object) */
public class MenuDTO {

	private int code;
	private String name;
	private int price;
	private int categoryCode;
	private String orderableStatus;
	
	public MenuDTO() {}

	public MenuDTO(int code, String name, int price, int categoryCode, String orderableStatus) {
		super();
		this.code = code;
		this.name = name;
		this.price = price;
		this.categoryCode = categoryCode;
		this.orderableStatus = orderableStatus;
	}

	public int getCode() {
		return code;
	}

	public void setCode(int code) {
		this.code = code;
	}

	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 getCategoryCode() {
		return categoryCode;
	}

	public void setCategoryCode(int categoryCode) {
		this.categoryCode = categoryCode;
	}

	public String getOrderableStatus() {
		return orderableStatus;
	}

	public void setOrderableStatus(String orderableStatus) {
		this.orderableStatus = orderableStatus;
	}

	@Override
	public String toString() {
		return "MenuDTO [code=" + code + ", name=" + name + ", price=" + price + ", categoryCode=" + categoryCode
				+ ", orderableStatus=" + orderableStatus + "]";
	}
}

 

 

class OrderDTO
package com.greedy.section01.model.dto;

import java.util.List;

public class OrderDTO {
	
	private int code;
	private String date;
	private String time;
	private int totalOrderPrice;
	private List<OrderMenuDTO> orderMenuList;
	
	public OrderDTO() {}

	public OrderDTO(int code, String date, String time, int totalOrderPrice, List<OrderMenuDTO> orderMenuList) {
		super();
		this.code = code;
		this.date = date;
		this.time = time;
		this.totalOrderPrice = totalOrderPrice;
		this.orderMenuList = orderMenuList;
	}

	public int getCode() {
		return code;
	}

	public void setCode(int code) {
		this.code = code;
	}

	public String getDate() {
		return date;
	}

	public void setDate(String date) {
		this.date = date;
	}

	public String getTime() {
		return time;
	}

	public void setTime(String time) {
		this.time = time;
	}

	public int getTotalOrderPrice() {
		return totalOrderPrice;
	}

	public void setTotalOrderPrice(int totalOrderPrice) {
		this.totalOrderPrice = totalOrderPrice;
	}

	public List<OrderMenuDTO> getOrderMenuList() {
		return orderMenuList;
	}

	public void setOrderMenuList(List<OrderMenuDTO> orderMenuList) {
		this.orderMenuList = orderMenuList;
	}

	@Override
	public String toString() {
		return "OrderDTO [code=" + code + ", date=" + date + ", time=" + time + ", totalOrderPrice=" + totalOrderPrice
				+ ", orderMenuList=" + orderMenuList + "]";
	}
	
	

}

 

 

OrderMenuDTO
public class OrderMenuDTO {
	
	private int code;
	private int menuCode;
	private int orderAmount;
	
	public OrderMenuDTO() {}

	public OrderMenuDTO(int code, int menuCode, int orderAmount) {
		super();
		this.code = code;
		this.menuCode = menuCode;
		this.orderAmount = orderAmount;
	}

	public int getCode() {
		return code;
	}

	public void setCode(int code) {
		this.code = code;
	}

	public int getMenuCode() {
		return menuCode;
	}

	public void setMenuCode(int menuCode) {
		this.menuCode = menuCode;
	}

	public int getOrderAmount() {
		return orderAmount;
	}

	public void setOrderAmount(int orderAmount) {
		this.orderAmount = orderAmount;
	}

	@Override
	public String toString() {
		return "OrderMenuDTO [code=" + code + ", menuCode=" + menuCode + ", orderAmount=" + orderAmount + "]";
	}
	
	

}

 

 

class OrderService
package com.greedy.section01.model.service;

import java.sql.Connection;
import java.util.List;

import com.greedy.section01.model.dao.OrderDAO;
import com.greedy.section01.model.dto.CategoryDTO;
import com.greedy.section01.model.dto.MenuDTO;
import com.greedy.section01.model.dto.OrderDTO;
import com.greedy.section01.model.dto.OrderMenuDTO;

import static com.greedy.common.JDBCTemplate.*;

public class OrderService {
	
	private OrderDAO orderDAO = new OrderDAO();

	/* 카테고리 전체 조회용 메소드 */
	public List<CategoryDTO> selectAllCategory() {
		
		/* 1. Connection 생성 */
		Connection con = getConnection();
		
		/* 2. DAO의 모든 카테고리 조회용 메소드를 호출하여 결과 리턴 받기 */
		List<CategoryDTO> categoryList = orderDAO.selectAllCategory(con);
		
		/* 3. 커넥션 닫기 (select는 commit, rollback X) */
		close(con);
		
		/* 4. 반환 받은 값 리턴하기 */
		return categoryList;
	}

	/* 카테고리별 메뉴 조회용 메소드 */
	public List<MenuDTO> selectMenuByCategory(int categoryCode) {
		/* 1. Connection 생성 */
		Connection con = getConnection();
		
		/* 2. DAO의 해당 카테고리 메뉴를 조회하는 메소드로 categoryCode 전달하며 조회 */
		List<MenuDTO> menuList = orderDAO.selectMenuByCategory(con, categoryCode);
		
		/* 3. Connection 닫기 */
		close(con);
		
		/* 4. 반환받은 값 리턴하기 */
		return menuList;
	}

	/* 주문 정보 등록용 메소드 */
	public int registOrder(OrderDTO order) {
		/* 1. Connection 생성 */
		Connection con = getConnection();
		
		/* 2. 리턴할 값 초기화 */
		int result = 0;
		
		/* 3. DAO 메소드로 전달 받은 값 넘겨서 insert */
		/* 3-1. Order table insert */
		int orderResult = orderDAO.insertOrder(con, order);
		
		/* 3-2. Order Menu table insert */
		List<OrderMenuDTO> orderMenuList = order.getOrderMenuList();
		int orderMenuResult = 0;
		for(OrderMenuDTO orderMenu : orderMenuList) {
			orderMenuResult += orderDAO.insertOrderMenu(con, orderMenu);
		}
		
		/* 4. 성공 여부 판단 후 트랜잭션 처리 */
		if(orderResult > 0 && orderMenuResult == orderMenuList.size()) {
			commit(con);
			result = 1;
		} else {
			rollback(con);
		}
		
		/* 5. Connection 닫기 */
		close(con);
		
		/* 6. 결과 값 반환 */
		return result;
	}

}

 

class Application
package com.greedy.section01.run;

import com.greedy.section01.view.OrderMenu;

public class Application {

	public static void main(String[] args) {
		new OrderMenu().displayMenu();
	}

}

 

class OrderMenu
package com.greedy.section01.view;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

import com.greedy.section01.controller.OrderController;
import com.greedy.section01.model.dto.CategoryDTO;
import com.greedy.section01.model.dto.MenuDTO;
import com.greedy.section01.model.dto.OrderMenuDTO;

public class OrderMenu {
	
	private OrderController orderController = new OrderController();

	public void displayMenu() {
		
		/* 반복
		 * ------------------------
		 * 1. 카테고리 조회
		 * 2. 해당 카테고리의 메뉴 조회
		 * 3. 사용자에게 어떤 메뉴를 주문 받을 것인지 입력
		 * 4. 주문할 수량 입력
		 * ------------------------
		 * 5. 주문 
		 * */
		
		Scanner sc = new Scanner(System.in);
		
		List<OrderMenuDTO> orderMenuList = new ArrayList<>();
		int totalOrderPrice = 0;
		
		do {
			System.out.println("=============== 음식 주문 프로그램 ==================");
			
			List<CategoryDTO> categoryList = orderController.selectAllCategory();
			for(CategoryDTO category : categoryList) {
				System.out.println(category.getName());
			}
			
			System.out.println("=================================================");
			System.out.print("주문하실 카테고리를 선택해주세요 : ");
			String inputCategory = sc.nextLine();
			
			int categoryCode = 0;
			for(CategoryDTO category : categoryList) {
				if(category.getName().equals(inputCategory)) {
					categoryCode = category.getCode();
				}
			}
			
			System.out.println("================ 주문 가능 메뉴 ====================");
			List<MenuDTO> menuList = orderController.selectMenuByCategory(categoryCode);
			for(MenuDTO menu : menuList) {
				System.out.println(menu);
			}
			
			System.out.print("주문하실 메뉴를 선택해주세요 : ");
			String inputMenu = sc.nextLine();
			
			int menuCode = 0;
			int menuPrice = 0;
			
			for(int i = 0; i < menuList.size();  i++) {
				MenuDTO menu = menuList.get(i);
				if(menu.getName().equals(inputMenu)) {
					menuCode = menu.getCode();
					menuPrice = menu.getPrice();
				}
			}
			
			System.out.print("주문하실 수량을 입력하세요 : ");
			int orderAmount = sc.nextInt();
			
			OrderMenuDTO orderMenu = new OrderMenuDTO();
			orderMenu.setMenuCode(menuCode);
			orderMenu.setOrderAmount(orderAmount);
			
			orderMenuList.add(orderMenu);
			totalOrderPrice += (menuPrice * orderAmount);
			
			System.out.print("계속 주문하시겠습니까?(예/아니오) : ");
			sc.nextLine();
			boolean isContinue = sc.nextLine().equals("예") ? true : false;
			
			if(!isContinue) break;
			
		} while(true);
		
		for(OrderMenuDTO orderMenu : orderMenuList) {
			System.out.println(orderMenu);
		}

		Map<String, Object> requestMap = new HashMap<>();
		requestMap.put("totalOrderPrice", totalOrderPrice);
		requestMap.put("orderMenuList", orderMenuList);
		
		orderController.registOrder(requestMap);
		

	}

}

 

 

class ResultView
package com.greedy.section01.view;

public class ResultView {
	
	public void success() {
		System.out.println("주문에 성공하셨습니다.");
	}

	public void failed() {
		System.out.println("주문에 실패하셨습니다.");
	}
}

 

 

 

 

 

 

 

 

 

 

▼ 코드 예시 (더보기 클릭) 
더보기

 

 class Calculator 
package com.greedy.section01.tests;

public class Calculator {

	public int sumTwoNumber(int first, int second) {
		return first + second;

	}

	
}

 

 class Application
package com.greedy.section01.tests;

public class Application {

	public static void main(String[] args) {
		
		
		/* 테스트 시나리오 */
		/* 어플리케이션의 테스트되어야 할 기능이나 특징을 한 문장으로 기술한 것 */
		/* 1. Calculator 인스턴스 생성이 잘 되는 지 테스트 */
		
		Calculator calc = new Calculator();
		
		if(calc != null) {
			System.out.println("성공");		
		} else {
			System.out.println("실패");
		} // 당연한 논리라서 else 부분이 데드코드로 뜸
		
		/* 2. sumTwoNumber 메소드가 정상 기능하는지 테스트 */
		/* 2-1. 4와 5를 전달하면 합계 9가 계산되는지 확인 */
		int result1 = calc.sumTwoNumber(4, 5);
		
		if (result1 == 9) {
			System.out.println("4와 5를 전달하여 합계가 9인지 확인");
		} else {
			System.out.println("4와 5를 전달하여 합계가 9가 아님");
		}
		
		
		
		/* 2-2. 6과 7을 전달하면 합계가 13이 되는지 확인 */
		int result2 = calc.sumTwoNumber(6, 7);
		
		if(result1 ==13) {
			System.out.println("6과 7을 전달하여 합계가 13인지 확인");
		} else {
			System.out.println("6과 7을 전달하여 합계가 13이 아님");
		}
		
		
		
		/* 3. 위 테스트 결과가 모두 통과되면 해당클래스의 메소드는 신뢰성 있는 메소드임을 확인 */
		if (result1 == 9 && result2 == 13) {
			System.out.println("테스트 성공!");
		} else {
			System.out.println("테스트 실패!");
		}
		
		
		
		
		
	}

}

 

 

class Calculator
public class Calculator {

	public int sumTwoNumber(int first, int second) {
		return first + second;

	}

	
}

 

 

class CalculatorTests 
import static org.junit.Assert.assertEquals;

import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;

/* 단위 테스트 (Unit Test) 
 * 한가지 기능 (함수) 마다 일을 잘 수행하는지 확인하며 특정 모듈이 의도된대로
 * 정확히 작동하는지 검증하는 절차
 * 연관 컴포넌트가 개발되지 않더라도 (다른 기능을 맡는 누군가가 완성되지 않더라도)
 * 기능별 개발(하나의 함수, 하나의 메소드)이 완료된 것을 증명할 수 있음.
 * 
 * */

/* 어노테이션 추가
 * Project의 Properties -> java build path -> libraries 추가 (module 쪽에 추가)
 * -> add library -> junit */


/* @Before 
 * : @Test가 작성 된 메소드 호출 이전에 
 * 반복되는 준비작업을 위한 메소드에 작성
 * 테스트 메소드를 실행하기 전에 먼저 자동으로 실행
 * 
 * @After
 *  : @Test가 작성 된 메소드 호출 이후 실행 
 *  
 *  */



public class CalculatorTests {

	private Calculator calc = null;
	
	
	@Before
	public void setup() {
		
		System.out.println("Calculator 인스턴스 생성");
		calc = new Calculator();
	}
	
	
	@Test
	public void testSumTwoNumber_4와_5를_전달하면_합계가_9가_계산되는지_확인() {
		System.out.println("2-1 테스트 동작");
		int result = calc.sumTwoNumber(4, 5);
		
		/* 괄호안에 (예상하는 값, 실제값)을 전달 후 비교해서 같은지 물어보는 메소드 */
		assertEquals(9, result); // 스태틱으로 임포트
		
		
	}
	
	
	@Test
	@Ignore  // 테스트 하고싶지않을 경우 무시하도록 작성
	public void testSumTwoNumber_6과_7을_전달하면_합계가_13이_계산되는지_확인() {
		System.out.println("2-2 테스트 동작");
		int result = calc.sumTwoNumber(6, 7);
		
		/* 괄호안에 (예상하는 값, 실제값)을 전달 후 비교해서 같은지 물어보는 메소드 */
		/* 세번째 인자는 세번째 인자의 값까지 근사치여도 허용이된다는 의미이다. = 허용오차
		 * 즉 원래의 값은 13이어야 하지만, 1이 허용 오차이므로, 12여도 14여도 잘 작동된다. */
		assertEquals(12, result, 1); // 스태틱으로 임포트
		
		
	}
	
	
	
	/* 사용가능한 어노테이션의 종류
	 * assertArrayEquals(a,b) : 배열 a와 b가 일치함을 확인
	 * assertEquals(a,b) : 객체 a 와 b의 값이 같은지 확인
	 * assertSame(a,b) : 객체 a와 b가 같은 객체임을 확인
	 * assertTrue(a) : a가 참인지 확인
	 * assertNotNull(a) : a객체가 Null 이 아님을 확인
	 * Ignore : 테스트 하고싶지않을 경우 무시하기 위한 어노테이션
	 *  */
	
	
	
	/* 테스트 사후, 사전에 설정해야/제거해야하는 값이 있는 경우 before과 after를 설정 */
	@After
	public void afterTest() {
		System.out.println("단위 테스트 완료!");
	}
	
	
	
}

 

 

 class OrderDAO 
import static com.greedy.common.JDBCTemplate.close;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import com.greedy.section03.layertests.model.dto.CategoryDTO;
import com.greedy.section03.layertests.model.dto.MenuDTO;
import com.greedy.section03.layertests.model.dto.OrderDTO;
import com.greedy.section03.layertests.model.dto.OrderMenuDTO;


public class OrderDAO {
	
	private Properties prop = new Properties();
	
	public OrderDAO() {
		try {
			prop.loadFromXML(new FileInputStream("mapper/order-query.xml"));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/* 모든 카테고리 조회용 메소드 */
	public List<CategoryDTO> selectAllCategory(Connection con) {
		
		PreparedStatement pstmt = null;
		ResultSet rset = null;
		
		List<CategoryDTO> categoryList = null;
		
		String query = prop.getProperty("selectAllCategory");
		
		try {
			pstmt = con.prepareStatement(query);
			rset = pstmt.executeQuery();
			
			categoryList = new ArrayList<>();
			
			while(rset.next()) {
				CategoryDTO category = new CategoryDTO();
				category.setCode(rset.getInt("CATEGORY_CODE"));
				category.setName(rset.getString("CATEGORY_NAME"));
				
				categoryList.add(category);
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(rset);
			close(pstmt);
		}
		
		return categoryList;
	}
	
	/* 카테고리별 메뉴 조회용 메소드 */
	public List<MenuDTO> selectMenuByCategory(Connection con, int categoryCode){
		
		PreparedStatement pstmt = null;
		ResultSet rset = null;
		
		List<MenuDTO> menuList = null;
		
		String query = prop.getProperty("selectMenuByCategory");
		
		try {
			pstmt = con.prepareStatement(query);
			pstmt.setInt(1, categoryCode);
			
			rset = pstmt.executeQuery();
			
			menuList = new ArrayList<>();
			
			while(rset.next()) {
				MenuDTO menu = new MenuDTO();
				menu.setCode(rset.getInt("MENU_CODE"));
				menu.setName(rset.getString("MENU_NAME"));
				menu.setPrice(rset.getInt("MENU_PRICE"));
				menu.setCategoryCode(rset.getInt("CATEGORY_CODE"));
				menu.setOrderableStatus(rset.getString("ORDERABLE_STATUS"));
				
				menuList.add(menu);
			}
		
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(rset);
			close(pstmt);
		}
		
		return menuList;
	}

	/* 주문 정보 입력용 메소드 */
	public int insertOrder(Connection con, OrderDTO order) {
		
		PreparedStatement pstmt = null;
		int result = 0;
		
		String query = prop.getProperty("insertOrder");
		
		try {
			pstmt = con.prepareStatement(query);
			pstmt.setString(1, order.getDate());
			pstmt.setString(2, order.getTime());
			pstmt.setInt(3, order.getTotalOrderPrice());
			
			result = pstmt.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(pstmt);
		}
		
		return result;
	}

	/* 주문 메뉴별 입력용 메소드 */
	public int insertOrderMenu(Connection con, OrderMenuDTO orderMenu) {
		
		PreparedStatement pstmt = null;
		int result = 0;
		
		String query = prop.getProperty("insertOrderMenu");
		
		try {
			pstmt = con.prepareStatement(query);
			pstmt.setInt(1, orderMenu.getMenuCode());
			pstmt.setInt(2, orderMenu.getOrderAmount());
			
			result = pstmt.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(pstmt);
		}

		return result;
	}
	
}

 

 

class OrderDAOTests
import static com.greedy.common.JDBCTemplate.getConnection;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import java.sql.Connection;
import java.util.List;

import org.junit.Before;
import org.junit.Test;

import com.greedy.section03.layertests.model.dto.CategoryDTO;
import com.greedy.section03.layertests.model.dto.OrderDTO;

public class OrderDAOTests {

	private Connection con;
	private OrderDAO orderDAO;
	private OrderDTO order;
	
	@Before
	public void setup() {
		con = getConnection();
		orderDAO = new OrderDAO();
		
		order = new OrderDTO();
		order.setDate("22/02/07");
		order.setTime("12:44:55");
		order.setTotalOrderPrice(30000);
	}
	
	@Test
	public void testSelectAllCategory() {
		
		List<CategoryDTO> categoryList = orderDAO.selectAllCategory(con);
		
		assertNotNull(categoryList);
	}
	
	@Test
	public void testInsertOrder() {
		int result = orderDAO.insertOrder(con, order);
		
		assertEquals(1, result);
	}
	
	
	
}



 

 

 

 

 

 

 

 

'Programming > JDBC' 카테고리의 다른 글

JDBC 응용 연습(1)  (0) 2022.02.04
JDBC 개요  (0) 2022.01.28

 

 

 

 

 

JDBC 연습1

 

▼ 코드 예시 보기 (더보기 클릭) ▼
더보기
더보기

 

 

class JDBCTemplate
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCTemplate {

	public static Connection getConnection() {
		
		Connection con = null;
		Properties prop = new Properties();
		
		try {
			prop.load(new FileReader("config/connection-info.properties"));
			
			String driver = prop.getProperty("driver");
			String url = prop.getProperty("url");
			
			Class.forName(driver);
			
			con = DriverManager.getConnection(url, prop);
			
			/* Application1에서 getAutoCommit()의 결과 true - 기본 값
			 * 프로그램 내에서 commit과 rollback을 판단하여 수행하고자 하므로 setAutoCommit(false) 설정
			 *  */
			con.setAutoCommit(false);
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return con;
	}
	
	public static void close(Connection con) {
		
		try {
			if(con != null && !con.isClosed()) {
				con.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
	}
	
	public static void close(Statement stmt) {
		try {
			if(stmt != null && !stmt.isClosed()) {
				stmt.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public static void close(ResultSet rset) {
		try {
			if(rset != null && !rset.isClosed()) {
				rset.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	/* 자동 commit에서 수동 commit으로 설정 변경 후 코드 추가 */
	public static void commit(Connection con) {
		try {
			if(con != null && !con.isClosed()) {
				con.commit();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public static void rollback(Connection con) {
		try {
			if(con != null && !con.isClosed()) {
				con.rollback();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	
	
	
	
	
}

 

 

Application1
package com.greedy.section01.transaction;

import static com.greedy.common.JDBCTemplate.*;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;

public class Application1 {

	public static void main(String[] args) {
		
		Connection con = getConnection();
		
		try {
			System.out.println("autoCommit의 현재 설정 값 : " + con.getAutoCommit());
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		PreparedStatement pstmt = null;
		int result = 0;
		
		Properties prop = new Properties();
		
		try {
			prop.loadFromXML(new FileInputStream("mapper/menu-query.xml"));
			
			String query = prop.getProperty("insertMenu");
			
			pstmt = con.prepareStatement(query);
			pstmt.setString(1, "정어리비빔밥");
			pstmt.setInt(2, 50000);
			pstmt.setInt(3, 4);
			pstmt.setString(4, "Y");
			
			result = pstmt.executeUpdate();
			
		} catch (IOException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(pstmt);
			close(con);
		}
		
		if(result > 0) {
			System.out.println("메뉴 등록 성공!");
		} else {
			System.out.println("메뉴 등록 실패!");
		}
		
	}

}

 

 

Application2
package com.greedy.section01.transaction;

import static com.greedy.common.JDBCTemplate.*;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;

public class Application2 {

	public static void main(String[] args) {
		
		Connection con = getConnection();
		
		try {
			System.out.println("autoCommit의 현재 설정 값 : " + con.getAutoCommit());
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		PreparedStatement pstmt1 = null;
		PreparedStatement pstmt2 = null;
		
		int result1 = 0;
		int result2 = 0;
		
		Properties prop = new Properties();
		
		try {
			prop.loadFromXML(new FileInputStream("mapper/menu-query.xml"));
			
			String query1 = prop.getProperty("insertCategory");
			String query2 = prop.getProperty("insertMenu");
			
			pstmt1 = con.prepareStatement(query1);
			pstmt1.setString(1, "기타");
			pstmt1.setInt(2, 1);
			
			result1 = pstmt1.executeUpdate();
			
			System.out.println("result1 : " + result1);
			
			pstmt2 = con.prepareStatement(query2);
			pstmt2.setString(1, "정어리비빔밥");
			pstmt2.setInt(2, 50000);
			/* TBL_CATEGORY 에 존재하지 않는 CATEGORY_CODE를 TBL_MENU 테이블의 CATEGORY_CODE 값으로 삽입하려고 하면
			 * 부모 키를 찾지 못하는 외래키 제약조건 위반 오류가 발생한다.
			 * */
			pstmt2.setInt(3, 0);
			pstmt2.setString(4, "Y");
			
			result2 = pstmt2.executeUpdate();
			
			System.out.println("result2 : " + result2);
			
		} catch (IOException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(pstmt1);
			close(pstmt2);
			
			/* 트랜잭션(논리적인 기능 수행 단위) 관리를 위해 2개의 insert가 모두 잘 동작했는지 판단하여
			 * 잘 동작했을 경우 commit, 둘 중 하나라도 잘 동작하지 않았을 경우 rollback을 수행한다.
			 * */
			if(result1 > 0 && result2 > 0) {
				System.out.println("신규 카테고리와 메뉴 등록 성공!");
				commit(con);
			} else {
				System.out.println("신규 카테고리와 메뉴 등록 실패!");
				rollback(con);
			}
			
			close(con);
		}
	
		
	}

}

 

 

 

 

 

 

 

 

JDBC 연습2

 

▼ 코드 예시 보기 (더보기 클릭) ▼
더보기
더보기

 

 

class MenuDAO
import static com.greedy.common.JDBCTemplate.close;

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

import com.greedy.section02.service.model.dto.CategoryDTO;
import com.greedy.section02.service.model.dto.MenuDTO;

public class MenuDAO {
	
	private Properties prop = new Properties();
	
	public MenuDAO() {
		try {
			prop.loadFromXML(new FileInputStream("mapper/menu-query.xml"));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/* 신규 카테고리 등록용 메소드 */
	public int insertNewCategory(Connection con, CategoryDTO newCategory) {
		
		PreparedStatement pstmt = null;
		int result = 0;
		String query = prop.getProperty("insertCategory");
		
		try {
			pstmt = con.prepareStatement(query);
			pstmt.setString(1, newCategory.getName());
			pstmt.setObject(2, newCategory.getRefCategoryCode());
			
			result = pstmt.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(pstmt);
		}
		
		return result;
	}

	/* 현재 카테고리 코드 조회 */
	public int selectLastCategoryCode(Connection con) {
		
		PreparedStatement pstmt = null;
		ResultSet rset = null;
		int newCategoryCode = 0;
		
		String query = prop.getProperty("getCurrentSequence");
		
		try {
			pstmt = con.prepareStatement(query);
			rset = pstmt.executeQuery();
			
			if(rset.next()) {
				newCategoryCode = rset.getInt("CURRVAL");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(rset);
			close(pstmt);
		}
		
		return newCategoryCode;
	}

	/* 신규 메뉴 등록용 메소드 */
	public int insertNewMenu(Connection con, MenuDTO newMenu) {
		
		PreparedStatement pstmt = null;
		int result = 0;
		String query = prop.getProperty("insertMenu");
		
		try {
			pstmt = con.prepareStatement(query);
			pstmt.setString(1, newMenu.getName());
			pstmt.setInt(2, newMenu.getPrice());
			pstmt.setInt(3, newMenu.getCategoryCode());
			pstmt.setString(4, newMenu.getOrderableStatus());
			
			result = pstmt.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(pstmt);
		}
		
		return result;
	}
	
	
	
	
	
	
	

}

 

 

CategoryDTO
public class CategoryDTO {
	
	private int code;
	private String name;
	private Integer refCategoryCode;
	
	public CategoryDTO() {}

	public CategoryDTO(int code, String name, Integer refCategoryCode) {
		super();
		this.code = code;
		this.name = name;
		this.refCategoryCode = refCategoryCode;
	}

	public int getCode() {
		return code;
	}

	public void setCode(int code) {
		this.code = code;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getRefCategoryCode() {
		return refCategoryCode;
	}

	public void setRefCategoryCode(Integer refCategoryCode) {
		this.refCategoryCode = refCategoryCode;
	}

	@Override
	public String toString() {
		return "CategoryDTO [code=" + code + ", name=" + name + ", refCategoryCode=" + refCategoryCode + "]";
	}
	
	
}

 

 

class MenuDTO
/* DTO(Data Transfer Object) */
public class MenuDTO {

	private int code;
	private String name;
	private int price;
	private int categoryCode;
	private String orderableStatus;
	
	public MenuDTO() {}

	public MenuDTO(int code, String name, int price, int categoryCode, String orderableStatus) {
		super();
		this.code = code;
		this.name = name;
		this.price = price;
		this.categoryCode = categoryCode;
		this.orderableStatus = orderableStatus;
	}

	public int getCode() {
		return code;
	}

	public void setCode(int code) {
		this.code = code;
	}

	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 getCategoryCode() {
		return categoryCode;
	}

	public void setCategoryCode(int categoryCode) {
		this.categoryCode = categoryCode;
	}

	public String getOrderableStatus() {
		return orderableStatus;
	}

	public void setOrderableStatus(String orderableStatus) {
		this.orderableStatus = orderableStatus;
	}

	@Override
	public String toString() {
		return "MenuDTO [code=" + code + ", name=" + name + ", price=" + price + ", categoryCode=" + categoryCode
				+ ", orderableStatus=" + orderableStatus + "]";
	}
}

 

 

 

class MenuService
import java.sql.Connection;

import com.greedy.section02.service.model.dao.MenuDAO;
import com.greedy.section02.service.model.dto.CategoryDTO;
import com.greedy.section02.service.model.dto.MenuDTO;

import static com.greedy.common.JDBCTemplate.*;

/* Service의 역할
 * 1. Connection 생성
 * 2. DAO의 메소드 호출 
 * 3. 트랜잭션의 제어
 * 4. Connection 닫기
 * */
public class MenuService {

	/* 신규 메뉴 등록용 서비스 메소드 */
	public void registNewMenu() {
		
		/* 1. Connection 생성 */
		Connection con = getConnection();
		
		/* 2. DAO 메소드 호출 */
		MenuDAO menuDAO = new MenuDAO();
		
		/* 2-1. 카테고리 등록 */
		CategoryDTO newCategory = new CategoryDTO();
		newCategory.setName("기타");
		newCategory.setRefCategoryCode(null);
		
		int result1 = menuDAO.insertNewCategory(con, newCategory);
		
		/* 방금 입력한 마지막 카테고리 번호 조회 */
		int newCategoryCode = menuDAO.selectLastCategoryCode(con);
		
		/* 2-2. 메뉴 등록 */
		MenuDTO newMenu = new MenuDTO();
		newMenu.setName("메롱메롱스튜");
		newMenu.setPrice(40000);
		newMenu.setCategoryCode(newCategoryCode);
		newMenu.setOrderableStatus("Y");
		
		int result2 = menuDAO.insertNewMenu(con, newMenu);
		
		/* 3. 트랜잭션 제어 */
		if(result1 > 0 && result2 > 0) {
			System.out.println("신규 카테고리와 메뉴를 추가하였습니다.");
			commit(con);
		} else {
			System.out.println("신규 카테고리와 메뉴를 추가하지 못했습니다.");
			rollback(con);
		}
		
		/* 4. Connection 반납 */
		close(con);
		
	}

}

 

 

Application
import com.greedy.section02.service.model.service.MenuService;

public class Application {

	public static void main(String[] args) {
		
		new MenuService().registNewMenu();
		
	}

}

 

 

 

 

 

 

 

 

 

JDBC 연습3

 

▼ 코드 예시 보기 (더보기 클릭) ▼
더보기
더보기

 

 

order-query
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
	<entry key="selectAllCategory">
		SELECT
		       A.CATEGORY_CODE
		     , A.CATEGORY_NAME
		  FROM TBL_CATEGORY A
	</entry>
	<entry key="selectMenuByCategory">
        SELECT
               A.MENU_CODE
             , A.MENU_NAME
             , A.MENU_PRICE
             , A.CATEGORY_CODE
             , A.ORDERABLE_STATUS
          FROM TBL_MENU A
         WHERE A.ORDERABLE_STATUS = 'Y'
           AND A.CATEGORY_CODE = ?	
	</entry>
	
	
	
	
	
</properties>

 

 

class JDBCTemplate 


import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCTemplate {

	public static Connection getConnection() {
		
		Connection con = null;
		Properties prop = new Properties();
		
		try {
			prop.load(new FileReader("config/connection-info.properties"));
			
			String driver = prop.getProperty("driver");
			String url = prop.getProperty("url");
			
			Class.forName(driver);
			
			con = DriverManager.getConnection(url, prop);
			
			/* Application1에서 getAutoCommit()의 결과 true - 기본 값
			 * 프로그램 내에서 commit과 rollback을 판단하여 수행하고자 하므로 setAutoCommit(false) 설정
			 *  */
			con.setAutoCommit(false);
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
		return con;
	}
	
	public static void close(Connection con) {
		
		try {
			if(con != null && !con.isClosed()) {
				con.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
	}
	
	public static void close(Statement stmt) {
		try {
			if(stmt != null && !stmt.isClosed()) {
				stmt.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public static void close(ResultSet rset) {
		try {
			if(rset != null && !rset.isClosed()) {
				rset.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	/* 자동 commit에서 수동 commit으로 설정 변경 후 코드 추가 */
	public static void commit(Connection con) {
		try {
			if(con != null && !con.isClosed()) {
				con.commit();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	public static void rollback(Connection con) {
		try {
			if(con != null && !con.isClosed()) {
				con.rollback();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	
	
	
	
	
}

 

 

class OrderDAO

import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import static com.greedy.common.JDBCTemplate.close;
import com.greedy.section01.model.dto.CategoryDTO;
import com.greedy.section01.model.dto.MenuDTO;
import com.greedy.section01.model.dto.OrderDTO;
import com.greedy.section01.model.dto.OrderMenuDTO;

public class OrderDAO {
	
	private Properties prop = new Properties();
	
	public OrderDAO() {
		try {
			prop.loadFromXML(new FileInputStream("mapper/order-query.xml"));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/* 모든 카테고리 조회용 메소드 */
	public List<CategoryDTO> selectAllCategory(Connection con) {
		
		PreparedStatement pstmt = null;
		ResultSet rset = null;
		
		List<CategoryDTO> categoryList = null;
		
		String query = prop.getProperty("selectAllCategory");
		
		try {
			pstmt = con.prepareStatement(query);
			rset = pstmt.executeQuery();
			
			categoryList = new ArrayList<>();
			
			while(rset.next()) {
				CategoryDTO category = new CategoryDTO();
				category.setCode(rset.getInt("CATEGORY_CODE"));
				category.setName(rset.getString("CATEGORY_NAME"));
				
				categoryList.add(category);
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(rset);
			close(pstmt);
		}
		
		return categoryList;
	}
	
	/* 카테고리별 메뉴 조회용 메소드 */
	public List<MenuDTO> selectMenuByCategory(Connection con, int categoryCode){
		
		PreparedStatement pstmt = null;
		ResultSet rset = null;
		
		List<MenuDTO> menuList = null;
		
		String query = prop.getProperty("selectMenuByCategory");
		
		try {
			pstmt = con.prepareStatement(query);
			pstmt.setInt(1, categoryCode);
			
			rset = pstmt.executeQuery();
			
			menuList = new ArrayList<>();
			
			while(rset.next()) {
				MenuDTO menu = new MenuDTO();
				menu.setCode(rset.getInt("MENU_CODE"));
				menu.setName(rset.getString("MENU_NAME"));
				menu.setPrice(rset.getInt("MENU_PRICE"));
				menu.setCategoryCode(rset.getInt("CATEGORY_CODE"));
				menu.setOrderableStatus(rset.getString("ORDERABLE_STATUS"));
				
				menuList.add(menu);
			}
		
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(rset);
			close(pstmt);
		}
		
		return menuList;
	}

	/* 주문 정보 입력용 메소드 */
	public int insertOrder(Connection con, OrderDTO order) {
		
		PreparedStatement pstmt = null;
		int result = 0;
		
		String query = prop.getProperty("insertOrder");
		
		try {
			pstmt = con.prepareStatement(query);
			pstmt.setString(1, order.getDate());
			pstmt.setString(2, order.getTime());
			pstmt.setInt(3, order.getTotalOrderPrice());
			
			result = pstmt.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(pstmt);
		}
		
		return result;
	}

	/* 주문 메뉴별 입력용 메소드 */
	public int insertOrderMenu(Connection con, OrderMenuDTO orderMenu) {
		
		PreparedStatement pstmt = null;
		int result = 0;
		
		String query = prop.getProperty("insertOrderMenu");
		
		try {
			pstmt = con.prepareStatement(query);
			pstmt.setInt(1, orderMenu.getMenuCode());
			pstmt.setInt(2, orderMenu.getOrderAmount());
			
			result = pstmt.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			close(pstmt);
		}

		return result;
	}
	
	
}

 

 

 class CategoryDTO
public class CategoryDTO {
	
	private int code;
	private String name;
	private Integer refCategoryCode;
	
	public CategoryDTO() {}

	public CategoryDTO(int code, String name, Integer refCategoryCode) {
		super();
		this.code = code;
		this.name = name;
		this.refCategoryCode = refCategoryCode;
	}

	public int getCode() {
		return code;
	}

	public void setCode(int code) {
		this.code = code;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getRefCategoryCode() {
		return refCategoryCode;
	}

	public void setRefCategoryCode(Integer refCategoryCode) {
		this.refCategoryCode = refCategoryCode;
	}

	@Override
	public String toString() {
		return "CategoryDTO [code=" + code + ", name=" + name + ", refCategoryCode=" + refCategoryCode + "]";
	}
	
	
}

 

 

class MenuDTO
/* DTO(Data Transfer Object) */
public class MenuDTO {

	private int code;
	private String name;
	private int price;
	private int categoryCode;
	private String orderableStatus;
	
	public MenuDTO() {}

	public MenuDTO(int code, String name, int price, int categoryCode, String orderableStatus) {
		super();
		this.code = code;
		this.name = name;
		this.price = price;
		this.categoryCode = categoryCode;
		this.orderableStatus = orderableStatus;
	}

	public int getCode() {
		return code;
	}

	public void setCode(int code) {
		this.code = code;
	}

	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 getCategoryCode() {
		return categoryCode;
	}

	public void setCategoryCode(int categoryCode) {
		this.categoryCode = categoryCode;
	}

	public String getOrderableStatus() {
		return orderableStatus;
	}

	public void setOrderableStatus(String orderableStatus) {
		this.orderableStatus = orderableStatus;
	}

	@Override
	public String toString() {
		return "MenuDTO [code=" + code + ", name=" + name + ", price=" + price + ", categoryCode=" + categoryCode
				+ ", orderableStatus=" + orderableStatus + "]";
	}
}

 

 

class OrderService


import java.sql.Connection;
import java.util.List;

import com.greedy.section01.model.dao.OrderDAO;
import com.greedy.section01.model.dto.CategoryDTO;
import com.greedy.section01.model.dto.MenuDTO;
import com.greedy.section01.model.dto.OrderDTO;
import com.greedy.section01.model.dto.OrderMenuDTO;

import static com.greedy.common.JDBCTemplate.*;

public class OrderService {
	
	private OrderDAO orderDAO = new OrderDAO();

	/* 카테고리 전체 조회용 메소드 */
	public List<CategoryDTO> selectAllCategory() {
		
		/* 1. Connection 생성 */
		Connection con = getConnection();
		
		/* 2. DAO의 모든 카테고리 조회용 메소드를 호출하여 결과 리턴 받기 */
		List<CategoryDTO> categoryList = orderDAO.selectAllCategory(con);
		
		/* 3. 커넥션 닫기 (select는 commit, rollback X) */
		close(con);
		
		/* 4. 반환 받은 값 리턴하기 */
		return categoryList;
	}

	/* 카테고리별 메뉴 조회용 메소드 */
	public List<MenuDTO> selectMenuByCategory(int categoryCode) {
		/* 1. Connection 생성 */
		Connection con = getConnection();
		
		/* 2. DAO의 해당 카테고리 메뉴를 조회하는 메소드로 categoryCode 전달하며 조회 */
		List<MenuDTO> menuList = orderDAO.selectMenuByCategory(con, categoryCode);
		
		/* 3. Connection 닫기 */
		close(con);
		
		/* 4. 반환받은 값 리턴하기 */
		return menuList;
	}

	/* 주문 정보 등록용 메소드 */
	public int registOrder(OrderDTO order) {
		/* 1. Connection 생성 */
		Connection con = getConnection();
		
		/* 2. 리턴할 값 초기화 */
		int result = 0;
		
		/* 3. DAO 메소드로 전달 받은 값 넘겨서 insert */
		/* 3-1. Order table insert */
		int orderResult = orderDAO.insertOrder(con, order);
		
		/* 3-2. Order Menu table insert */
		List<OrderMenuDTO> orderMenuList = order.getOrderMenuList();
		int orderMenuResult = 0;
		for(OrderMenuDTO orderMenu : orderMenuList) {
			orderMenuResult += orderDAO.insertOrderMenu(con, orderMenu);
		}
		
		/* 4. 성공 여부 판단 후 트랜잭션 처리 */
		if(orderResult > 0 && orderMenuResult == orderMenuList.size()) {
			commit(con);
			result = 1;
		} else {
			rollback(con);
		}
		
		/* 5. Connection 닫기 */
		close(con);
		
		/* 6. 결과 값 반환 */
		return result;
	}

	
}

 

 

class Application
import com.greedy.section01.view.OrderMenu;

public class Application {

	public static void main(String[] args) {
		new OrderMenu().displayMenu();
	}

}

 

 

class OrderMenu


import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import com.greedy.section01.model.dto.CategoryDTO;
import com.greedy.section01.model.dto.MenuDTO;
import com.greedy.section01.model.dto.OrderDTO;
import com.greedy.section01.model.dto.OrderMenuDTO;
import com.greedy.section01.model.service.OrderService;

public class OrderMenu {
	
	private OrderService orderService = new OrderService();

	public void displayMenu() {
		
		/* 반복
		 * ------------------------
		 * 1. 카테고리 조회
		 * 2. 해당 카테고리의 메뉴 조회
		 * 3. 사용자에게 어떤 메뉴를 주문 받을 것인지 입력
		 * 4. 주문할 수량 입력
		 * ------------------------
		 * 5. 주문 
		 * */
		
		Scanner sc = new Scanner(System.in);
		
		List<OrderMenuDTO> orderMenuList = new ArrayList<>();
		int totalOrderPrice = 0;
		
		do {
			System.out.println("=============== 음식 주문 프로그램 ==================");
			
			List<CategoryDTO> categoryList = orderService.selectAllCategory();
			for(CategoryDTO category : categoryList) {
				System.out.println(category.getName());
			}
			
			System.out.println("=================================================");
			System.out.print("주문하실 카테고리를 선택해주세요 : ");
			String inputCategory = sc.nextLine();
			
			int categoryCode = 0;
			for(CategoryDTO category : categoryList) {
				if(category.getName().equals(inputCategory)) {
					categoryCode = category.getCode();
				}
			}
			
			System.out.println("================ 주문 가능 메뉴 ====================");
			List<MenuDTO> menuList = orderService.selectMenuByCategory(categoryCode);
			for(MenuDTO menu : menuList) {
				System.out.println(menu);
			}
			
			System.out.print("주문하실 메뉴를 선택해주세요 : ");
			String inputMenu = sc.nextLine();
			
			int menuCode = 0;
			int menuPrice = 0;
			
			for(int i = 0; i < menuList.size();  i++) {
				MenuDTO menu = menuList.get(i);
				if(menu.getName().equals(inputMenu)) {
					menuCode = menu.getCode();
					menuPrice = menu.getPrice();
				}
			}
			
			System.out.print("주문하실 수량을 입력하세요 : ");
			int orderAmount = sc.nextInt();
			
			OrderMenuDTO orderMenu = new OrderMenuDTO();
			orderMenu.setMenuCode(menuCode);
			orderMenu.setOrderAmount(orderAmount);
			
			orderMenuList.add(orderMenu);
			totalOrderPrice += (menuPrice * orderAmount);
			
			System.out.print("계속 주문하시겠습니까?(예/아니오) : ");
			sc.nextLine();
			boolean isContinue = sc.nextLine().equals("예") ? true : false;
			
			if(!isContinue) break;
			
		} while(true);
		
		for(OrderMenuDTO orderMenu : orderMenuList) {
			System.out.println(orderMenu);
		}
		
		java.util.Date orderTime = new java.util.Date();
		SimpleDateFormat dateFormat = new SimpleDateFormat("yy/MM/dd");
		SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
		String date = dateFormat.format(orderTime);
		String time = timeFormat.format(orderTime);
		
		OrderDTO order = new OrderDTO();
		order.setDate(date);
		order.setTime(time);
		order.setTotalOrderPrice(totalOrderPrice);
		order.setOrderMenuList(orderMenuList);
		
		int result = orderService.registOrder(order);
		
		if(result > 0) {
			System.out.println("주문에 성공하셨습니다.");
		} else {
			System.out.println("주문에 실패하셨습니다.");
		}
	}

}

 

 

 

 

 

 

 

'Programming > JDBC' 카테고리의 다른 글

JDBC 응용 연습(2)  (0) 2022.02.07
JDBC 개요  (0) 2022.01.28

 

 

JDBC

 

 

 

 

 

JDBC(Java DataBase Connectivity)란?



자바에서 데이터베이스에 접근할 수 있게 해주는 Programming API

 

 

 

 

 

JDBC 사용 클래스


DriverManager
데이터 원본에 JDBC드라이버를 통하여 커넥션을 만드는 역할
Class.forName() 메소드를 통해 생성되며 반드시 예외처리를 해야 함
직접 인스턴스 생성이 불가능하고 getConnection() 메소드를 사용하여 인스턴스 생성 가능

 

Connection
특정 데이터 원본과 연결 된 커넥션을 나타내며 Statement 인스턴스를 생성할 때도
Connection 인스턴스를 사용하여 createStatement() 메소드를 호출하여 생성
SQL문장을 실행시키기 전에 우선 Connection 인스턴스가 있어야 함

 

Statement
Connection 클래스의 createStatement() 메소드를 호출하여 얻어지며 생성 된
Statement 인스턴스로 SQL 질의문을 String에 담아 인자로 전달하여 executeQuery()
메소드를 호출하여 SQL 질의 수행
ex) 

try {
String query = "SELECT ID, LAST_NAME FROM EMP";
stmt = conn.createStatement();
rset = stmt.executeQuery(query);
} catch (SQLException e) {
e.printStackTrace();
}

 

PreparedStatement
Connection 클래스의 preparedStatement() 메소드를 사용하여 인스턴스 생성
SQL 질의문을 위치홀더(placeholder)인 ?로 표현되는 String으로 정의 PreparedStatement는 위치홀더라는 개념에 해당되는 인수가 많아서 특정 값만 바꾸어 여러 번 실행해야 할 때 사용하면 유용함
(Statement는 SQL문장을 매번 컴파일 하지만 PreparedStatement는 한번만 컴파일 하므로 실행 속도가 빠름)
ex)

try {
String query = "INSERT INTO MEMBER VALUES(?,?)";
pstmt = conn.preparedStatement(query);
pstmt.setString(1, id);
pstmt.setString(2, password);
} catch (SQLException e) {
e.printStackTrace();
}

 

ResultSet
SELECT문을 사용한 질의 성공 시 ResultSet을 반환
SQL 질의문에 의해 생성 된 테이블을 담고 있으며 커서(cursor)로 특정 행에 대한 참조 조작
String id = rset.getString("ID");
String pwd = rset.getString(2);

 

 

 

 

 

 

JDBC 코딩 절차


 

 

 

해당 Driver로부터 Connection instance 획득

 

 

 

 

Statement에서 제공하는 메소드를 사용하여 SQL문 실행

 

 

 

 

Statement에서 제공하는 메소드를 사용하여 SQL문 실행

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Programming > JDBC' 카테고리의 다른 글

JDBC 응용 연습(2)  (0) 2022.02.07
JDBC 응용 연습(1)  (0) 2022.02.04

+ Recent posts