▶ 서블릿 컨트롤러 - 요청된 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>
'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 |