💁♀️ MVC란,
모델-뷰-컨트롤러(model–view–controller)를 의미하며, 소프트웨어 공학에서 사용되는 소프트웨어 디자인 패턴.
이 패턴을 성공적으로 사용하면, 사용자 인터페이스로부터 비즈니스 로직을 분리하여 애플리케이션의 시각적 요소나 그 이면에서 실행되는 비즈니스 로직을 서로 영향 없이 쉽게 고칠 수 있는 애플리케이션을 만들 수 있음.
MVC에서 모델은 애플리케이션의 정보(데이터)를 나타내며, 뷰는 텍스트, 체크박스 항목 등과 같은 사용자 인터페이스 요소를 나타내고, 컨트롤러는 데이터와 비즈니스 로직 사이의 상호동작을 관리
📌 Ref.
* WEB-INF 하위에 있는 폴더 및 파일은 client가 경로를 요청할 수 없도록 하기위해 막아둠 (주소창으로 접근 불가)
<?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>
<?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>
public class ConfigLocation {
public static String mybatisConfigLocation;
}
@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 출력 */
}
}
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;
}
}
<%@ 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>
<%@ 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>
<%@ 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>
Mapper로 등록된 EmployeeDAO는 반드시 패키지명, 클래스명을 동일하게 작성
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 */
}
@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);
}
}
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;
}
}
public class EmployeeDAO {
/* 사원번호로 직원 조회하기 */
public EmployeeDTO selectOneEmpById(SqlSession sqls, String empId) {
return sqls.selectOne("EmployeeDAO.selectOneEmpById", empId);
/* ("mappers/EmployeeDAO의 namespace.현재클래스명", 넘어온 변수명) */
}
}
<?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>
<%@ 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>
// '사원번호로 직원 조회하기'의 EmployeeDTO.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);
}
}
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;
}
}
public class EmployeeDAO {
/* 전체 직원 조회하기 */
public List<EmployeeDTO> selectAllEmp(SqlSession sqls) {
return sqls.selectList("EmployeeDAO.selectAllEmp");
}
}
<?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와 동일
// '사원번호로 직원 조회하기'의 EmployeeDTO.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);
}
}
public class EmployeeService {
/* 트랜잭션 관리 */
private final EmployeeDAO empDAO;
public EmployeeService() { /* [ EmployeeDAO 생성 ] */
empDAO = new EmployeeDAO();
}
}
public class EmployeeDAO {
/* 신규 직원 정보 추가 */
public int insertEmp(SqlSession sqls, EmployeeDTO emp) {
return sqls.insert("EmployeeDAO.insertEmp", emp);
}
}
<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와 동일
// '사원번호로 직원 조회하기'의 EmployeeDTO.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);
}
}
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;
}
}
public class EmployeeDAO {
/* 직원 퇴사 처리 (update) */
public int updateEmp(SqlSession sqls, EmployeeDTO emp) {
return sqls.update("EmployeeDAO.updateEmp", emp);
}
}
<update id="updateEmp">
UPDATE
EMPLOYEE
SET ENT_DATE = #{ entDate }
, ENT_YN = 'Y'
WHERE EMP_ID = #{ empId }
</update>
// '사원번호로 직원 조회하기'의 errorPage.jsp와 동일
// '사원번호로 직원 조회하기'의 EmployeeDTO.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);
}
}
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;
}
}
public class EmployeeDAO {
/* 직원 정보 삭제 */
public int deleteEmp(SqlSession sqls, String empId) {
return sqls.delete("EmployeeDAO.deleteEmp", empId);
}
}
<delete id="deleteEmp">
DELETE
FROM EMPLOYEE
WHERE EMP_ID = #{ empId }
</delete>
// '사원번호로 직원 조회하기'의 errorPage.jsp와 동일