서블릿_MVC (Servlet_MVC)

Joy🌱·2023년 2월 21일
0

☕ Java

목록 보기
37/40
post-thumbnail

💁‍♀️ MVC란,
모델-뷰-컨트롤러(model–view–controller)를 의미하며, 소프트웨어 공학에서 사용되는 소프트웨어 디자인 패턴.
이 패턴을 성공적으로 사용하면, 사용자 인터페이스로부터 비즈니스 로직을 분리하여 애플리케이션의 시각적 요소나 그 이면에서 실행되는 비즈니스 로직을 서로 영향 없이 쉽게 고칠 수 있는 애플리케이션을 만들 수 있음.
MVC에서 모델은 애플리케이션의 정보(데이터)를 나타내며, 는 텍스트, 체크박스 항목 등과 같은 사용자 인터페이스 요소를 나타내고, 컨트롤러는 데이터와 비즈니스 로직 사이의 상호동작을 관리


📌 초기 Setting

📌 Ref.

* WEB-INF 하위에 있는 폴더 및 파일은 client가 경로를 요청할 수 없도록 하기위해 막아둠 (주소창으로 접근 불가)

◼ mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<environments default="dev">
		<environment id="dev">
			<!-- JDBC와 MANAGED 둘 중 하나 선택 가능 -->
			<transactionManager type="JDBC"/>
			
			<!-- POOLED와 UNPOOLED 선택 가능 -->
			<dataSource type="POOLED">
				<property name="driver" value="oracle.jdbc.driver.OracleDriver"/>
				<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
				<property name="username" value="C##EMPLOYEE"/>
				<property name="password" value="EMPLOYEE"/>
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<mapper resource="com/greedy/mvc/employee/model/dao/EmployeeDAO.xml"/>
	</mappers>
</configuration>

◼ web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>chap14-mvc</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
  </welcome-file-list>
  <context-param>
  	<param-name>mybatis-config-location</param-name>
  	<param-value>mybatis/mybatis-config.xml</param-value>
  </context-param>
</web-app>

◼ ConfigLocation.java

public class ConfigLocation {
	
	public static String mybatisConfigLocation;
}

◼ initialLoadingServlet.java

@WebServlet(urlPatterns = {}, loadOnStartup = 1) /* 서버를 구동시킬 때 객체가 생성 되도록 loadOnStartup 설정 */
public class InitialLoadingServlet extends HttpServlet {
	
	@Override
	public void init(ServletConfig config) {
		
		/* web.xml(배포 서술자-서버를 구동시킬 때 작성 된대로 동작)에 입력한 <context-param>영역에 작성했던 value인
		 * mybatis/mybatis-config.xml이 ConfigLocation.mybatisConfigLocation 변수에 저장 */
		ConfigLocation.mybatisConfigLocation = config.getServletContext().getInitParameter("mybatis-config-location"); // 소괄호에 name(키값) 입력
		
		System.out.println(ConfigLocation.mybatisConfigLocation);
		/* 서버 구동 시, 콘솔에 mybatis/mybatis-config.xml 출력 */
	}
}

◼ Template.java

public class Template {

	private static SqlSessionFactory sqlSessionFactory;
	
	public static SqlSession getSqlSession() {
		
		if(sqlSessionFactory == null) {
			String resource = ConfigLocation.mybatisConfigLocation;
			try {
				InputStream inputStream = Resources.getResourceAsStream(resource);
				sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		SqlSession sqlSession = sqlSessionFactory.openSession(false);
		
		return sqlSession;
	}
}

◼ index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
	<jsp:forward page="/WEB-INF/views/main/main.jsp"/> <!-- [이 경로에 main.jsp 파일 생성] -->
</body>
</html>

◼ header.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1 align='center'>Welcome to MVC Project :)</h1>

</body>
</html>

◼ main.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style type="text/css">
h2 { background : #f6f1fd; color : #59595e; }
button { font-weight : bold; padding : 5px 10px; color : gray; background : #f6ecfd; border : none; border-radius : 10px; cursor : pointer; }
button:hover { color : white; background : #d5a4fe; }
</style>
</head>
<body>
	<!-- WEB-INF 하위에 있는 폴더 및 파일은 client가 경로를 찾아올 수 없음 -->
	
	<jsp:include page="../common/header.jsp"/>
	<h2>💡 EMPLOYEE 테이블에서 EMP_ID를 이용하여 사원 정보 조회해오기</h2>
	<form action="employee/select">
		<label>조회할 사번 : </label>
		<input type='text' name='empId' id='empId'/>
		<button type='submit'>조회!</button>
	</form>
	
	<h2>💡 EMPLOYEE 테이블에서 직원 전체 정보 조회(퇴사하지 않은 직원만 조회)</h2>
	<button onclick="location.href='employee/list'">직원 정보 전체 조회하기</button>
	
	<h2>💡 EMPLOYEE 테이블에서 신규 직원 정보 추가</h2>
	<form action="${ pageContext.servletContext.contextPath }/employee/insert" method="post"> <!-- EL을 통해 Context path로 접근하는 방법 -->
		직원명 : <input type="text" name="empName"><br>
		주민등록번호 : <input type="text" name="empNo"><br>
		이메일 : <input type="email" name="email"><br>
		전화번호 : <input type="tel" name="phone"><br>
		부서코드 : 
		<select name="deptCode">
			<option value="D1">인사관리부</option>
			<option value="D2">회계관리부</option>
			<option value="D3">마케팅부</option>
			<option value="D4">국내영업부</option>
			<option value="D5">해외영업1</option>
			<option value="D6">해외영업2</option>
			<option value="D7">해외영업3</option>
			<option value="D8">기술지원부</option>
			<option value="D9">총무부</option>
		</select>
		<br>
		직급코드 : 
		<select name="jobCode">
			<option value="J1">대표</option>
			<option value="J2">부사장</option>
			<option value="J3">부장</option>
			<option value="J4">차장</option>
			<option value="J5">과장</option>
			<option value="J6">대리</option>
			<option value="J7">사원</option>
		</select>
		<br>
		급여등급 : 
		<select name="salLevel">
			<option value="S1">S1</option>
			<option value="S2">S2</option>
			<option value="S3">S3</option>
			<option value="S4">S4</option>
			<option value="S5">S5</option>
			<option value="S6">S6</option>
		</select>
		<br>
		급여 : <input type="number" name="salary"><br>
		보너스율 : <input type="text" name="bonus"><br>
		관리자사번 : <input type="text" name="managerId"><br>
		입사일 : <input type="date" name="hireDate"><br><br>
		<button type="submit">등록하기</button>
	</form>
	
	<h2>💡 EMPLOYEE 테이블에서 직원 정보 수정</h2>
	<form action="${ pageContext.servletContext.contextPath }/employee/update" method="post">
		사번 : <input type="text" name="empId"><br>
		퇴사일 : <input type="date" name="entDate"><br><br>
		<button type="submit">직원 퇴사</button>
	</form>
	
	<h2>💡 EMPLOYEE 테이블에서 직원 정보 삭제</h2>
	<form action="${ pageContext.servletContext.contextPath }/employee/delete" method="post">
		사번 : <input type="text" name="empId"><br><br>
		<button type="submit">직원 정보 삭제</button>
	</form>
	
</body>
</html>

😈 Warning

Mapper로 등록된 EmployeeDAO는 반드시 패키지명, 클래스명을 동일하게 작성


👀 사원번호로 직원 조회하기 (SELECT)

👉 EmployeeDTO.java

public class EmployeeDTO {
	
	private String empId;
	private String empName;
	private String empNo;
	private String email;
	private String phone;
	private String deptCode;
	private String jobCode;
	private String salLevel;
	private int salary;
	private double bonus;
	private String managerId;
	private java.sql.Date hireDate;
	private java.sql.Date entDate;
	private String entYn;
    
    /* 기본 생성자, 모든 매개변수가 있는 생성자*/
    
    /* getter, setter */

	/* toString */
}

👉 SelectOneEmpByIdServlet.java

@WebServlet("/employee/select")
public class SelectOneEmpByIdServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		/* 1. 클라이언트에서 전달 된 파라미터 꺼내고 검증 */
		String empId = request.getParameter("empId");
		System.out.println("empId : " + empId); // 브라우저에서 입력한 사번 출력
		
		/* 2. 사번을 이용해 사원 정보를 조회하는 비즈니스 로직 호출 */
		EmployeeService empService = new EmployeeService(); /* [EmployeeService 클래스 생성] */
		EmployeeDTO selectedEmp = empService.selectOneEmpById(empId); /* [selectOneEmpById() 메소드 생성] */
		System.out.println("selectedEmp : " + selectedEmp);
		
		/* 3. 조회 된 사원 정보를 나타내는 응답 페이지 jsp로 위임해서 처리 */
		String path = "";
		if(selectedEmp != null) {
			path = "/WEB-INF/views/employee/showEmpInfo.jsp";
			request.setAttribute("selectedEmp", selectedEmp);
			
		} else {
			path = "/WEB-INF/views/common/errorPage.jsp";
			request.setAttribute("message", "해당 사번을 가진 직원은 없습니다!");
		}
		
		request.getRequestDispatcher(path).forward(request, response);
	}
}

👉 EmployeeService.java

public class EmployeeService {
	/* 트랜잭션 관리 */
	
	private final EmployeeDAO empDAO;

	public EmployeeService() { /* [ EmployeeDAO 생성 ] */
		empDAO = new EmployeeDAO();
	}
	
	/* 사원번호로 직원 조회하기 */
	public EmployeeDTO selectOneEmpById(String empId) {
		
		/* SqlSession 객체 생성 */
		/* library에 mybatis.jar, ojdbc8.jar 추가 */
		SqlSession sqls = getSqlSession(); 
		System.out.println(sqls);
		
		/* DAO로 empId를 전달하여 employee 객체 반환 요청 */
		EmployeeDTO selectedEmp = empDAO.selectOneEmpById(sqls, empId); /* [ selectOneEmpById() 메소드 생성 ] */ 
		
		/* SqlSesson 객체 닫기 */
		sqls.close();
		
		/* 조회 결과 반환 */
		return selectedEmp;
	}
}

👉 EmployeeDAO.java

public class EmployeeDAO {

	/* 사원번호로 직원 조회하기 */
	public EmployeeDTO selectOneEmpById(SqlSession sqls, String empId) {
		
		return sqls.selectOne("EmployeeDAO.selectOneEmpById", empId); 
        /* ("mappers/EmployeeDAO의 namespace.현재클래스명", 넘어온 변수명) */
	}
}

👉 EmployeeDAO.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="EmployeeDAO">
	<resultMap type="com.greedy.mvc.employee.model.dto.EmployeeDTO" id="employeeResultMap">
		<id property="empId" column="EMP_ID"/>
		<result property="empName" column="EMP_NAME"/>
		<result property="empNo" column="EMP_NO"/>
		<result property="email" column="EMAIL"/>
		<result property="phone" column="PHONE"/>
		<result property="deptCode" column="DEPT_CODE"/>
		<result property="jobCode" column="JOB_CODE"/>
		<result property="salLevel" column="SAL_LEVEL"/>
		<result property="salary" column="SALARY"/>
		<result property="bonus" column="BONUS"/>
		<result property="managerId" column="MANAGER_ID"/>
		<result property="hireDate" column="HIRE_DATE"/>
		<result property="entDate" column="ENT_DATE"/>
		<result property="entYn" column="ENT_YN"/>
	</resultMap>

	<select id="selectOneEmpById" resultMap="employeeResultMap">
		SELECT
				EMP_ID
			,	EMP_NAME
			,	DEPT_CODE
			, 	JOB_CODE
			,	SALARY
			FROM EMPLOYEE
			WHERE ENT_YN = 'N'
			AND EMP_ID = #{ empId }
	</select>
</mapper>

👉 errorPage.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1 align='center'>${ message }</h1>
</body>
</html>

👀 재직 중인 모든 직원 조회하기 (SELECT)

👉 EmployeeDTO.java

// '사원번호로 직원 조회하기'의 EmployeeDTO.java와 동일

👉 SelectAllEmpServlet.java

@WebServlet("/employee/list")
public class SelectAllEmpServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		/* 전체 사원의 정보 조회 결과에 따라 employee/employeeList.jsp or common/errorPage.jsp로 응답 */
		
		/* 1. 클라이언트에서 전달 된 파라미터 꺼내고 검증 */
		/* 클라이언트에서 전달 될 파라미터가 없기 때문에 생략 */
		
		/* 2. 전체 사원의 정보를 조회하는 비즈니스 로직 호출 */
		EmployeeService empService = new EmployeeService();
		List<EmployeeDTO> selectAllEmp = empService.selectAllEmp();
		System.out.println("selectAllEmp : " + selectAllEmp);
		
		/* 3. 전체 사원의 정보를 나타내는 응답 페이지 jsp로 위임해서 처리 */
		String path = "";
		if(selectAllEmp != null ) {
			path = "/WEB-INF/views/employee/employeeList.jsp";
			request.setAttribute("selectAllEmp", selectAllEmp);
		} else {
			path = "/WEB-INF/views/common/errorPage.jsp";
			request.setAttribute("message", "전체 사원의 정보를 불러오지 못 했습니다!");
		}
		
		request.getRequestDispatcher(path).forward(request, response);
	}
}

👉 EmployeeService.java

public class EmployeeService {
	/* 트랜잭션 관리 */
	
	private final EmployeeDAO empDAO;

	public EmployeeService() { /* [ EmployeeDAO 생성 ] */
		empDAO = new EmployeeDAO();
	}

	/* 전체 직원 조회하기 */
	public List<EmployeeDTO> selectAllEmp() {
		
		/* SqlSession 객체 생성 */
		SqlSession sqls = getSqlSession(); 
		
		/* DAO로 리스트 전달하여 employee 객체 반환 요청 */
		List<EmployeeDTO> selectAllEmp = empDAO.selectAllEmp(sqls);
				
		/* SqlSesson 객체 닫기 */
		sqls.close();
		
		return selectAllEmp;
	}
}

👉 EmployeeDAO.java

public class EmployeeDAO {

	/* 전체 직원 조회하기 */
	public List<EmployeeDTO> selectAllEmp(SqlSession sqls) {
		
		return sqls.selectList("EmployeeDAO.selectAllEmp");
	}
}

👉 EmployeeDAO.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="EmployeeDAO">
	<resultMap type="com.greedy.mvc.employee.model.dto.EmployeeDTO" id="employeeResultMap">
		<id property="empId" column="EMP_ID"/>
		<result property="empName" column="EMP_NAME"/>
		<result property="empNo" column="EMP_NO"/>
		<result property="email" column="EMAIL"/>
		<result property="phone" column="PHONE"/>
		<result property="deptCode" column="DEPT_CODE"/>
		<result property="jobCode" column="JOB_CODE"/>
		<result property="salLevel" column="SAL_LEVEL"/>
		<result property="salary" column="SALARY"/>
		<result property="bonus" column="BONUS"/>
		<result property="managerId" column="MANAGER_ID"/>
		<result property="hireDate" column="HIRE_DATE"/>
		<result property="entDate" column="ENT_DATE"/>
		<result property="entYn" column="ENT_YN"/>
	</resultMap>
	
	<select id="selectAllEmp" resultMap="employeeResultMap">
		SELECT
				*
			FROM EMPLOYEE
			WHERE ENT_YN = 'N'
	</select>
</mapper>

👉 errorPage.jsp

// '사원번호로 직원 조회하기'의 errorPage.jsp와 동일

👀 신규 직원 정보 추가하기 (INSERT)

👉 EmployeeDTO.java

// '사원번호로 직원 조회하기'의 EmployeeDTO.java와 동일

👉 InsertEmpServlet.java

@WebServlet("/employee/insert")
public class InsertEmpServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

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

		request.setCharacterEncoding("UTF-8");
		
		String empName = request.getParameter("empName");
		String empNo = request.getParameter("empNo");
		String email = request.getParameter("email");
		String phone = request.getParameter("phone");
		String deptCode = request.getParameter("deptCode");
		String jobCode = request.getParameter("jobCode");
		String salLevel = request.getParameter("salLevel");
		int salary = Integer.parseInt(request.getParameter("salary"));
		double bonus = Double.parseDouble(request.getParameter("bonus"));
		String managerId = request.getParameter("managerId");
		Date hireDate = Date.valueOf(request.getParameter("hireDate"));
		
		/* 가져온 파라미터 값을 DTO에 set */
		EmployeeDTO emp = new EmployeeDTO();
		emp.setEmpName(empName);
		emp.setEmpNo(empNo);
		emp.setEmail(email);
		emp.setPhone(phone);
		emp.setDeptCode(deptCode);
		emp.setJobCode(jobCode);
		emp.setSalLevel(salLevel);
		emp.setSalary(salary);
		emp.setBonus(bonus);
		emp.setManagerId(managerId);
		emp.setHireDate(hireDate);
		
		System.out.println("insert request emp : " + emp);
		
		/* DB에 insert하는 비즈니스 로직 호출 */
		EmployeeService empService = new EmployeeService();
		/* insert이므로 반환값은 int */
		int result = empService.insertEmp(emp); /* [ insertEmp() 메소드 생성 ] */
		
		String path = "";
		
		/* 응답 화면 (insert이므로, redirect 사용) */
		// insert가 성공했을 경우 요청 url이 그대로 남아있으면 새로고침 시 다시 insert를 요청하게 되는 문제 존재
		// 따라서 redirect 처리 필요
		if(result > 0) {
			// main 화면으로 redirect
//			response.sendRedirect(request.getContextPath());
			
			// 신규 회원 등록 완료 메세지를 alert로 처리하기 위해서 successPage.jsp로 forward후 메인 페이지를 다시
			// 요청하는 프로세스로 변경
			request.setAttribute("successCode", "insertEmp");
			path = "/WEB-INF/views/common/successPage.jsp";
			
		} else { // 실패 시에는 insert가 되지 않기 때문에 forward 사용
			request.setAttribute("message", "신규 직원 등록에 실패하였습니다 :(");
			path = "/WEB-INF/views/common/errorPage.jsp";
			
		}
		request.getRequestDispatcher(path).forward(request, response);
	}

}

👉 EmployeeService.java

public class EmployeeService {
	/* 트랜잭션 관리 */
	
	private final EmployeeDAO empDAO;

	public EmployeeService() { /* [ EmployeeDAO 생성 ] */
		empDAO = new EmployeeDAO();
	}
}

👉 EmployeeDAO.java

public class EmployeeDAO {

	/* 신규 직원 정보 추가 */
	public int insertEmp(SqlSession sqls, EmployeeDTO emp) {
		
		return sqls.insert("EmployeeDAO.insertEmp", emp);
	}
}

👉 EmployeeDAO.xml

<insert id="insertEmp">
		INSERT
			INTO EMPLOYEE
		(
			EMP_ID
		,	EMP_NAME
		,	EMP_NO
		, 	EMAIL
		,	PHONE
		,	DEPT_CODE
		,	JOB_CODE
		,	SAL_LEVEL
		,	SALARY
		,	BONUS
		,	MANAGER_ID
		,	HIRE_DATE
		,	ENT_DATE
		,	ENT_YN
		)
		VALUES
		(
			SEQ_EMPID.NEXTVAL
		,	#{ empName }
		,	#{ empNo }
		,	#{ email }
		,	#{ phone }
		,	#{ deptCode }
		,	#{ jobCode }
		,	#{ salLevel }
		,	#{ salary }
		,	#{ bonus }
		,	#{ managerId }
		,	#{ hireDate }
		,	NULL
		,	DEFAULT
		)
	</insert>

👉 errorPage.jsp

// '사원번호로 직원 조회하기'의 errorPage.jsp와 동일

👀 직원 퇴사 처리하기 (UPDATE)

👉 EmployeeDTO.java

// '사원번호로 직원 조회하기'의 EmployeeDTO.java와 동일

👉 UpdateEmpServlet.java

@WebServlet("/employee/update")
public class UpdateEmpServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		request.setCharacterEncoding("UTF-8");
		
		String empId = request.getParameter("empId");
		Date entDate = Date.valueOf(request.getParameter("entDate"));
		
		/* 가져온 파라미터 값을 DTO에 set */
		EmployeeDTO emp = new EmployeeDTO();
		emp.setEmpId(empId);
		emp.setEntDate(entDate);
		
		/* 확인 */
		System.out.println("update request emp : " + emp);
		
		/* DB에 update하는 비즈니스 로직 호출 */
		EmployeeService empService = new EmployeeService();
		/* update이므로 반환값은 int */
		int result = empService.updateEmp(emp);
		
		String path = "";
		
		/* 응답 화면 (update이므로, redirect 사용) */
		// update가 성공했을 경우 요청 url이 그대로 남아있으면 새로고침 시 다시 update를 요청하게 되는 문제 존재
		// 따라서 redirect 처리 필요
		if(result > 0) {
			// 직원 퇴사 처리 완료 메세지를 alert로 처리하기 위해서 successPage.jsp로 forward후 메인 페이지를 다시
			// 요청하는 프로세스로 변경
			request.setAttribute("successCode", "updateEmp");
			path = "/WEB-INF/views/common/successPage.jsp";
			
		} else { // 실패 시에는 insert가 되지 않기 때문에 forward 사용
			request.setAttribute("message", "직원 퇴사 처리에 실패하였습니다 :(");
			path = "/WEB-INF/views/common/errorPage.jsp";
			
		}
		
		request.getRequestDispatcher(path).forward(request, response);
		
	}
}

👉 EmployeeService.java

public class EmployeeService {
	/* 트랜잭션 관리 */
	
	private final EmployeeDAO empDAO;

	public EmployeeService() { /* [ EmployeeDAO 생성 ] */
		empDAO = new EmployeeDAO();
	}
    
    /* 직원 퇴사 처리 (update) */
	public int updateEmp(EmployeeDTO emp) {
		
		SqlSession sqls = getSqlSession();
		
		int result = empDAO.updateEmp(sqls, emp);
		
		/* commit & rollback */
		if(result > 0) {
			sqls.commit();
		} else {
			sqls.rollback();
		}
		
		/* SqlSesson 객체 닫기 */
		sqls.close();
		
		return result;
	}
}

👉 EmployeeDAO.java

public class EmployeeDAO {

	/* 직원 퇴사 처리 (update) */
	public int updateEmp(SqlSession sqls, EmployeeDTO emp) {

		return sqls.update("EmployeeDAO.updateEmp", emp);
	}
}

👉 EmployeeDAO.xml

<update id="updateEmp">
		UPDATE
			EMPLOYEE
		SET ENT_DATE = #{ entDate }
		,	ENT_YN = 'Y'
		WHERE EMP_ID = #{ empId }
</update>

👉 👉 errorPage.jsp

// '사원번호로 직원 조회하기'의 errorPage.jsp와 동일

👀 직원 정보 삭제하기 (DELETE)

👉 EmployeeDTO.java

// '사원번호로 직원 조회하기'의 EmployeeDTO.java와 동일

👉 DeleteEmpServlet.java

@WebServlet("/employee/delete")
public class DeleteEmpServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

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

		request.setCharacterEncoding("UTF-8");
		
		String empId = request.getParameter("empId");
		
		/* 확인 */
		System.out.println("empId : " + empId);
		
		/* DB에 delete하는 비즈니스 로직 호출 */
		EmployeeService empService = new EmployeeService();
		/* delete이므로 반환값은 int */
		int result = empService.deleteEmp(empId);
		
		String path = "";
		
		/* 응답 화면 (delete이므로, redirect 사용) */
		// delete가 성공했을 경우 요청 url이 그대로 남아있으면 새로고침 시 다시 delete를 요청하게 되는 문제 존재
		// 따라서 redirect 처리 필요
		if(result > 0) {
			// 직원 정보 삭제 완료 메세지를 alert로 처리하기 위해서 successPage.jsp로 forward후 메인 페이지를 다시
			// 요청하는 프로세스로 변경
			request.setAttribute("successCode", "deleteEmp");
			path = "/WEB-INF/views/common/successPage.jsp";
			
		} else { // 실패 시에는 insert가 되지 않기 때문에 forward 사용
			request.setAttribute("message", "직원 정보 삭제에 실패하였습니다 :(");
			path = "/WEB-INF/views/common/errorPage.jsp";
			
		}
		
		request.getRequestDispatcher(path).forward(request, response);
	}
}

👉 EmployeeService.java

public class EmployeeService {
	/* 트랜잭션 관리 */
	
	private final EmployeeDAO empDAO;

	public EmployeeService() { /* [ EmployeeDAO 생성 ] */
		empDAO = new EmployeeDAO();
	}
    
    /* 직원 정보 삭제 */
	public int deleteEmp(String empId) {
		
		SqlSession sqls = getSqlSession();
		
		int result = empDAO.deleteEmp(sqls, empId);
		
		/* commit & rollback */
		if(result > 0) {
			sqls.commit();
		} else {
			sqls.rollback();
		}
		
		/* SqlSesson 객체 닫기 */
		sqls.close();
		
		return result;
	}
}

👉 EmployeeDAO.java

public class EmployeeDAO {
	
    /* 직원 정보 삭제 */
	public int deleteEmp(SqlSession sqls, String empId) {
		
		return sqls.delete("EmployeeDAO.deleteEmp", empId);
	}
}

👉 EmployeeDAO.xml

<delete id="deleteEmp">
		DELETE
		FROM EMPLOYEE
		WHERE EMP_ID = #{ empId }
</delete>

👉 👉 errorPage.jsp

// '사원번호로 직원 조회하기'의 errorPage.jsp와 동일

profile
Tiny little habits make me

0개의 댓글

관련 채용 정보