본문 바로가기

JAVA

[실습] 서블릿+컨넥션+트렌젝션+mvc

▶ 서블릿 컨트롤러 - 요청된 request의 uri를 분석해서 경로를 forward 시킨다.

(요청된 uri는 패턴에 따라 컨트롤러로 들어오게 어노테이션을 설정한다.)

 - MainController

package kr.or.ksmart.controller;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.or.ksmart.service.MemberService;

@WebServlet("*.do")
public class MainController extends HttpServlet {
	private static final long serialVersionUID = 1L;
    public MainController() {
          super();
      }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
    				throws ServletException, IOException {
		String uri = request.getRequestURI();
		uri = uri.replace(request.getContextPath(), "");
		
		String fwPath = null;
		if("/main.do".equals(uri)) {
			fwPath = "main.jsp";				
			MemberService memberService = new MemberService();
			request.setAttribute("memberList", memberService.getMemberNameList());
		}else if("/processTest.do".equals(uri)) {
			MemberService memberService = new MemberService();	
			int result = memberService.memberTestProcess();
			PrintWriter out = response.getWriter();
			out.println("result > " + result);
			out.flush();
			out.close();
		}else if("/*.do".equals(uri)) {
			response.sendRedirect(request.getContextPath()+"/main.do");
		}else {
			response.setStatus(404);
		}
		if(fwPath != null) {
			request.getRequestDispatcher("/WEB-INF/views/"+fwPath)
            				.forward(request, response);
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    				throws ServletException, IOException {
		doGet(request, response);
	}
}

 

▶ 데이터베이스 Connection 작업을 분기시켰다.

package kr.or.ksmart.connection;

import java.sql.Connection;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class DBConnection {
	
	public static Connection getConnection() {		
		Connection con = null;
		try {
			Context context = new InitialContext();
			DataSource ds = (DataSource) 
					context.lookup("java:comp/env/jdbc/myCon");
			con = ds.getConnection();
		} catch (SQLException e) {
			e.printStackTrace();	
		} catch (NamingException e) {
			e.printStackTrace();
		}
		return con;
	}
	
}

 

▶ 서비스에서 트랜잭션을 수행한다. 

 - MemberService

package kr.or.ksmart.service;

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

import kr.or.ksmart.connection.DBConnection;
import kr.or.ksmart.dao.MemberDao;

public class MemberService {
	private MemberDao memberDao;
	public MemberService() {
		this.memberDao = new MemberDao();
	}
	
	public List<String> getMemberNameList(){
		return memberDao.getMemberNameList();
	}
	
	public int memberTestProcess() {
		int result = 0;
		Connection con = DBConnection.getConnection();		
		try {
			con.setAutoCommit(false);
			result += memberDao.memberWriteProcess(con);
			result += memberDao.memberUpdateProcess(con);
			con.commit();
		} catch (SQLException e) {
			e.printStackTrace();
			try {
				con.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
		}finally {
			memberDao.close(con);
		}
		return result;
	}
}

 

▶ Dao에서 쿼리문 실행 및 에러 처리를 수행한다.

 - MemberDao

package kr.or.ksmart.dao;

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 kr.or.ksmart.connection.DBConnection;

public class MemberDao {
	
	private List<PreparedStatement> psList = new ArrayList<PreparedStatement>();
	
	public List<String> getMemberNameList(){		
		Connection con = DBConnection.getConnection();	
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<String> memberList = new ArrayList<String>();
		try {
			ps = con.prepareStatement("SELECT U.m_name FROM tb_member AS U LIMIT 0, 10");
			rs = ps.executeQuery();
			while (rs.next()) {
				memberList.add(rs.getString("m_name"));
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				if(con != null) con.close();
				if(ps != null) ps.close();
				if(rs != null) rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return memberList;
	}	
	
	/*
	 * 메서드에 throws 키워드로 하여 Exception 클래스가 
	 * 주입될경우 이 해당 메서드를 호출하는 곳에서
	 * 에러 처리하도록 위임
	 * */
	public int memberWriteProcess(Connection con) throws SQLException {
		PreparedStatement ps = null;
		int result = 0;
		ps = con.prepareStatement("INSERT INTO tb_test (t_name, t_season, t_amount)" 
        						+"VALUES ('test', 'test', 0)");
		result = ps.executeUpdate();
		psList.add(ps);
		return result;
	}
	
	public int memberUpdateProcess(Connection con) throws SQLException {
		PreparedStatement ps = null;
		int result = 0;
		ps = con.prepareStatement("UPDATE tb_test SET t_name='TEST' WHERE");
		result = ps.executeUpdate();
		psList.add(ps);
		return result;
	}
	
	public void close(Connection con) {
		try {
			if(con != null) con.close();
			if(psList != null) {
				for(int i=0; i < psList.size(); i++) {
					psList.get(i).close();
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

 

▶ 처리된 결과를 jsp 파일에서 뽑아쓴다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.List" %>
<%
	List<String> memberList = (List<String>) request.getAttribute("memberList");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>메인</title>
</head>
<body>
	메인페이지
	<% if(memberList != null){ %>
		<table>
		<% for(int i=0; i < memberList.size(); i++){ %>
			<tr>
				<td>
					<%=memberList.get(i)%>
				</td>
			</tr>
		<% } %>	
		</table>
	<% }else{ %>
		<h2>회원 정보가 없습니다.</h2>
	<% } %>	
</body>
</html>

 

 

서블릿+컨넥션+트렌젝션+mvc.zip
1.15MB

'JAVA' 카테고리의 다른 글

싱글톤 패턴  (0) 2020.07.15
객체지향 설계의 5대 원칙  (0) 2020.07.01
커넥션 풀 구현  (0) 2020.05.20
컨넥션 풀  (0) 2020.05.14
JVM (JAVA VIRTUAL MACHAIN)  (0) 2020.05.14