이전에 블로그에 올리지 않았지만 DB까지 접근하진 않고 사용자가 주문한 피자와 가격을 표시해주는 웹 페이지를 만들어봤다. 이번엔 DB까지 접근하여 주문 내역을 저장하고 주문 내역을 사용자에게 보여주는 페이지를 만들어본다.
1) 먼저 프로젝트 폴더에 작성된 파일들을 살펴보면 상단부터 Servlet들이 있다. JdbcTemplate.java는 Servlet이 DB에 접근하고 꼭 해주어야 commit, rollback, close 메소드를 미리 만들어 놓은 클래스이다. OrderController.java는 사용자의 요청과 함께 들어온 데이터를 처리하고 DB에 접근할 Servlet이다. EncodingFilter.java는 사용자의 모든 요청에 대해 Filter 역할을 하는 Servlet으로 여기선 UTF-8 인코딩 역할을 한다. PizzaModel.java는 사용자가 피자 주문을 하며 선택한 피자, 토핑들, 사이드 메뉴들을 저장하는 객체를 생성하는 역할을 한다. /WEB-INF/lib/에 java와 DB를 연결해줄 드라이버가 있고 views/에 사용자에게 주문 내역을 보여줄 orderResult.jsp, 맨밑에 주문창인 index.jsp가 있다.
2) 먼저 주문 페이지를 만든다.
- 총 연습을 위한 프로젝트로 메뉴 사진에 모든 종류의 메뉴를 넣진 않았다.
3) 그리고 UTF-8 인코딩을 처리해줄 Filter 역할의 servlet, 주문한 피자를 저장하는 객체를 생성해줄 클래스, DB에 접근 후 처리해 주어야할 commit, rollback, close 메소드를 보관할 클래스를 생성해준다.
4) 그리고 피자 주문 요청에 주 역할을 할 Controller Servlet을 만들어준다.
5) OrderController servlet을 위 부터 살펴본다. 고객의 주문과 함께 전달된 주문 정보 데이터를 getParameter 메소드에 담는다. 토핑과 사이드메뉴는 다수 선택이 가능하기 때문에 배열 형태로 받을 수 있는 getParameterValues 메소드를 통해 받아 준다.
6) DB 접근을 위해 우리가 WEB-INF/lib/에 있는 JDBC 드라이버를 이 클래스에서 사용하기 위해 올려놓는 작업인 Class.forName 메소드를 사용하고 내가 사용하는 DB와 커넥션을 만들어줄 DriverManager.getConnection 메소드를 사용하고 그 커넥션에서 생기는 autocommit 에러를 잡아줄 setAutocommit을 false로 설정한다.
*Connection conn = null; / PreparedStatement pstmt = null; -> 커넥션과 워크시트를 저장하는 변수생성과 초기화를 try - catch문 밖에서 해줘야 DB와의 연결 후 해줘야할 commit, rollback, close 메소드를 catch문, finally문에서 사용할 때 에러가 발생하지 않는다.(지역변수, 전역변수)
7) 이제 주문 내역을 DB에 저장해줄 sql 쿼리문을 작성하고 그 쿼리문을 prepareStatement에 불완전한 상태로 담아주고 사용자가 주문하며 보내준 주문 정보 데이터를 setString 메소드에 담아준다. String.join메소드를 사용하면 배열 객체를 첫번째 매개변수로 전달된 문자를 기준으로 나눠서 넣어준다. 사이드 메뉴를 아무것도 선택하지 않았을 시 NullpointException이 발생하므로 미선택시 전달될 none을 설정해줄 조건문을 작성해준다. 그리고 주문이 제대로 성공했을 때 주문 성공, 실패시 주문 실패를 사용자에게 보여주기 위한 조건문도 작성한다.
8) 그리고 JDBC의 마지막 과정인 commit, rollback, close작업을 해준다. commit은 성공하면 실행되어야 하니 try문에 넣고 rollback은 실패시 실행되어야 하니 catch문, 주문이 성공하거나 실패하거나 close메소드는 무조건 실행되어야 하니 finally문에 작성해준다. 그리고 사용자에게 주문 결과를 보여줄 페이지로 피자 주문 정보와 주문결과를 담은 PizzaModel 객체를 setAttribute를 통해 추가하고 dispatcher메소드로 주문 결과 페이지로 forwarding 해준다.
9) 실행을 해본다.
10) 주문과 함께 데이터가 DB에 잘 저장된것까지 확인됐지만, 주문 결과 페이지에서 배열형태로 받는 토핑과 사이드메뉴가 하나씩만 나온걸 확인할 수 있다. 결과 페이지는 아래와 같이 작성되어 있다. 기존 request 객체를 이용해서 get 메소드로 데이터를 불러올 수 있었는데 EL / JSTL을 통해 코드를 더 간결하게 작성할 수 있다. ${pizzaModel.orderResult}는 Jasper에 의해 request.getAttribute(“pizzaModel”).getOrderResult();로 읽혀서 실해되게 된다. 배열을 가져오기 위한 JSTL문은 다음 시간에 배우기로 했다.