목차
- Controller
1-1. Controller 역할
1-2. Controller 클래스
1-3. ResultView
1. Controller
MVC 패턴은 Model, View, Controller를 일컫는다.
View ↔ Controller ↔ Service ↔ DAO ↔ DB로 흐름이 이어진다.
View는 HTML, CSS, JS 등을 통해 사용자에게 보여지는 화면으로서 기능한다. Controller는 데이터 검증 및 추가 가공 단계이며, Servlets을 통해 치환할 수 있다. Service는 로그인 기능, 회원가입 기능, 회원정보 수정 기능, 주문 등록 기능 등등 비즈니스 로직를 일컫는다. DAO는 직접 DB에 접근하여 기능 수행한다. Service와 DAO는 기본적으로 자바 코드일 것이나 Mybatis라고 하는 기술로 적용할 수 있다. 현재는 자바 클래스로 분류하고 있지만, 나중에 배울 기술들에 의해 대체될 과정들이다. 그때까지 MVC 패턴에 익숙해질 수 있도록 노력하자.
1-1. Controller 역할
- View에서 사용자가 입력한 데이터를 파라미터 형태로 전달 받는다.
- 여기서 검증 또는 추가 가공이 필요한 데 대해 처리한다.
- Service로 넘겨주기 위해 인스턴스에 담고, 비즈니스 로직을 담당하는 Service 메소드를 호출한다.
- 여기서 그치지 않고 수행 결과를 반환 받아 어떤 뷰를 사용자에게 보여줄지 결정한다.
1-2. Controller 클래스
-- OrderMenu.classprivate OrderService orderService = new OrderService();
private OrderController orderController = new OrderController();
public void displayMenu() {
Scanner sc = new Scanner(System.in);
do {
System.out.prinln("======= 음식 주문 프로그램 =======");
List<CategoryDTO> categoryList = orderService.selectAllCategory();
for(Category category : categoryList) {
System.out.println(category.getName());
}
System.out.println("===========================");
System.out.println("주문할 카테고리를 선택해 주세요 : ");
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.selectByCategory(categoryCode);
for(MenuDTO menu : menuList) {
System.out.println(menu);
}
System.out.println("주문하실 메뉴를 선택해 주세요 : ");
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.println("주문하실 수량을 입력하세요 : ");
int orderAmount = sc.nextInt();
OrderMenuDTO orderMenu = new OrderMenuDTO();
orderMenu.setMenuCode(menucode);
orderMenu.setOrderAmount(orderAmount);
orderMenuList.add(orderMenu);
totalOrderPrice += (menuPrice * orderAmount);
System.out.println("계속 주문하시겠습니까?(예/아니오) : ");
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("주문에 실패하였습니다.");}
Map<String, Object> requestMap = new HashMap<>();
requestMap.put("totalOrderPrice", totalOrderPrice);
requestMap.put("orderMenuList", orderMenuList);
orderController.registOrder(requestMap);
}
- Service 클래스에 임의로 사용하였던 데이터 추가, 가공 및 결과 검증과 관한 코드를 삭제하고, Controller 객체를 최상단에 private 필드로서 선언한다.
- Controller와 연결할 코드를 하단에 추가한다. '주문하기' 버튼 눌러 다음 프로세스로 넘어가는 과정을 흉내내는 것이다.
- 앞서 배운 View 계층에서 데이터 검증 및 추가, 가공에 관한 내용만 별도로 다뤄보자: [JDBC] VIEW | MVC 패턴 | CRUD
-- OrderController.class
private OrderService orderService = new OrderService();
- 데이터 검증 및 추가 가공한 뒤 Service 클래스로 넘겨줄 것이기에 이를 private 필드로 선언하고 시작한다.
public List<CategoryDTO> selectAllCategory() {
List<CategoryDTO> categoryList = orderService.selectAllCategory();
return categoryList;
}
- 전달 받은 인자가 없는 경우 별도 검증 과정이 필요치 않을 수 있다. 따라서 위 예시에서는 Service 메소드로 연결만 진행하였다.
public List<MenuDTO> selectByCategory(int categoryCode) {
return orderService.selectByCategory(categoryCode);
}
List 레퍼런스 변수 생성 없이한 줄 리턴값 구문으로 작성할 수도 있다.
-- ① View로부터 전달 받은 파라미터 꺼내 변수에 저장
public void registerOrder(Map<String, Object> requestMap) {
int totalOrderPrice = (Integer)requestMap.get("totalOrderPrice");
List<OrderMenuDTO> orderMenuList = (List<OrderMenuDTO>)requestMap.get("orderMenuList");
- ① View에서 전달 받은 파라미터 꺼내 변수에 저장한다. requestMap에 담아온 데이터들을 key값 통해 가져오는 것이다.
- Map<String, Object>로서 Object 타입의 밸류(value)임이 명시돼 있으므로 int형 변수에 담기 위해서는 (Integer)로 다운캐스팅이 요구된다.
-- ② 필요한 값이 있는 경우 추가 생성
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);
Strint time = timeFormat.format(orderTime);
-- ③ Service로 전달하기 위해 DTO 인스턴스에 저장
OrderDTO order = new OrderDTO();
order.setDate(date);
order.setTime(time);
order.setTotalOrderPrice(totalOrderPrice);
order.setOrderMenuList(orderMenuList);
- ② 필요한 값이 있을 경우 추가 생성한다. SimpleDateFormat 활용해 원하는 텍스트 형식으로 반영할 수 있다.
- 실제 테이블에 반영된 예시는 위와 같다.
- ③ Service로 전달하기 위해 DTO 인스턴스에 이들을 저장한다.
-- ④ Service(비즈니스 로직) 호출 및 결과 리턴
int result = orderService.registOrder(order);
-- ⑤ 사용자에게 보여줄 View 결정
-- Service 처리 결과를 이용해 성공/실패 여부를 판단해 결정한다.
ResultView resultView = new ResultView();
if(result > 0) {
resultView.success();
} else {
resultView.failed();
}
}
- ④ 비즈니스 로직인 Service를 호출하고, 결과를 리턴 받는다.
- ⑤ Service 처리 결과 기반으로 성공/실패 여부를 판단해 사용자에게 보여줄 View를 결정한다.
1-3. ResultView
-- ResultView.class
public void success() {
System.out.println("주문에 성공하였습니다.");
}
public void failed() {
System.out.println("주문에 실패하였습니다.");
}
- 프로젝트 view 폴더 하위에 속한다.
- Service 처리 결과에 따라 반환되며, Controller 통해 사용자에게 보여질 View가 가려진다.
✅ controller 계층을 분리할 수 있다.
✅ controller 계층의 의미를 이해할 수 있다.
✅ 사용자로부터 입력 받은 값을 이후 계층(비즈니스 로직)으로 전달하기 위한 값 가공 처리를 할 수 있다.
✅ 비즈니스 로직의 결과를 판단하여 사용자에게 보여줄 뷰를 결정할 수 있다.
'Database' 카테고리의 다른 글
[DB 모델링] 엔티티 도출 실습 | 개념적 모델링 (0) | 2022.03.01 |
---|---|
[JDBC] JUnit | 단위 테스트 | @Test | assertEquals (0) | 2022.02.08 |
[Oracle/수업 과제 practice] 도서 관리 (0) | 2022.02.06 |
[JDBC] VIEW | MVC 패턴 | CRUD (0) | 2022.02.05 |
[JDBC] Service | MVC 패턴 | CRUD | Transaction (0) | 2022.02.04 |