[final project] day_3

김예은·2023년 8월 16일

요구사항

  • 인사정보 직접 추가:
    • 기존 사원의 경우, 인사관리-> 인사등록에서 한명의 사원의 인사정보를 입력
    • 신규 회원의 경우, 이메일로 발송된 초대 링크를 통해 회원가입 페이지로 접속하여 회원가입 진행
    • 이메일로 초대 링크를 받을 경우 회원가입 링크의 매개값으로 사원번호 전달
    • 사원번호가 매개값으로 전달되었을 시 사번은 그냥 출력
    • input은 hidden으로 처리
  • 인사정보 엑셀 파일 업로드 한명/대량:
    • 사원번호, 부서, 직급, 권한이 form 형식에 맞게 작성되어 있는 엑셀파일만 가능
    • 엑셀파일에 입력된 사원번호는 모두 회원가입이 먼저 완료되어있어야 한다
    • 인사정보 등록 성공 시 사원 목록 페이지로 이동

화면설계



Code

part1

view_version1
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>registEmp</title>
	<!-- JQuery -->
	<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>
	<script>
		$(document).ready(function() { // 웹 페이지가 모든 html 요소를 로드한 후에 내부(JQuery)의 코드를 실행하도록 보장
			// 취소 버튼 클릭 시
			$('#cancelBtn').click(function() {
				let result = confirm('HOME으로 이동할까요?'); // 사용자 선택 값에 따라 true or false 반환
				if (result) {
					window.location.href = '/home'; // Home으로 이동
				}
			});
		});
	</script>
<style>
	hr {
	    border: solid 3px black;
	    width: 20%;
	    margin: 0; /* auto 가운데 정렬 */
	}

	table {
		text-align: center;
	}
</style>
</head>
<body>
	<h3>사원 등록</h3>
	
	<!-- 파일 업로드 -->
	<form name="frm1" method="post" action="/emp/registEmp" enctype="multipart/form-data">
		<input type="file" name="file1">
		<button type="submit" id="fileInput">저장</button>
	</form>
	
	<!-- 사원 정보 등록 -->
	<form action="/emp/registEmp" method="post">
	<input type="hidden" name="empState" value="재직">
		<table border="1">
			<tr>
				<td>사원번호</td>
				<td><input type="number" name="empNo" value="${empNo}"></td>
				<td><button type="button">사원번호 생성</button></td>
			</tr>
			<tr>
				<td>사원명</td>
				<td colspan="2"><input type="text" name="empName"></td>
			</tr>
			<tr>
				<td>부서명</td>
				<td colspan="2">
					<select name="deptName">
						<option value="" <c:if test="${emp.deptName.equals('')}">selected</c:if>>없음</option>
						<c:forEach var="d" items="${deptList}">
							<option value="${d.deptName}" <c:if test="${emp.deptName.equals(d.deptName)}">selected</c:if>>${d.deptName}</option>
						</c:forEach>
					</select>
				</td>
			</tr>
			<tr>
				<td>팀명</td>
				<td colspan="2">
					<select name="teamName">
						<option value="" <c:if test="${emp.teamName.equals('')}">selected</c:if>>없음</option>
						<c:forEach var="t" items="${teamList}">
							<option value="${t.teamName}" <c:if test="${emp.teamName.equals(t.teamName)}">selected</c:if>>${t.teamName}</option>
						</c:forEach>
					</select>
				</td>
			</tr>
			<tr>
			    <td>직급</td>
			    <td colspan="2">
			        <select name="empPosition">
						<option value="CEO" <c:if test="${emp.empPosition.equals('CEO')}">selected</c:if>>CEO</option>
						<option value="부서장" <c:if test="${emp.empPosition.equals('부서장')}">selected</c:if>>부서장</option>
						<option value="팀장" <c:if test="${emp.empPosition.equals('팀장')}">selected</c:if>>팀장</option>
						<option value="부팀장" <c:if test="${emp.empPosition.equals('부팀장')}">selected</c:if>>부팀장</option>
						<option value="사원" <c:if test="${emp.empPosition.equals('사원')}">selected</c:if>>사원</option>
					</select>
			    </td>
			</tr>
			<tr>
			    <td>권한</td>
			    <td colspan="2">
			        <select name="accessLevel">
						<option value="0" <c:if test="${emp.accessLevel.equals('0')}">selected</c:if>>0레벨</option>
						<option value="1" <c:if test="${emp.accessLevel.equals('1')}">selected</c:if>>1레벨</option>
						<option value="2" <c:if test="${emp.accessLevel.equals('2')}">selected</c:if>>2레벨</option>
						<option value="3" <c:if test="${emp.accessLevel.equals('3')}">selected</c:if>>3레벨</option>
					</select>
			    </td>
			</tr>
			<tr>
				<td>입사일</td>
				<td colspan="2">
					<input type="date" name="employDate">
				</td>
			</tr>
		</table>
		<br>
		<hr><!-- 구분선 -->
		<br>
		<button type="button" id="cancelBtn">취소</button><!-- 좌정렬 -->
		<button type="submit" id="saveBtn">등록</button><!-- 우정렬 -->
		<!-- 목록으로 보내기 -->
	</form>
</body>
</html>

파일업로드 기능 미완성.

view_version2


part2

EmpController_version1
// 인사 등록 폼
	@GetMapping("/emp/registEmp")
	public String showEmployeeRegistrationForm(Model model) {
		
	    // 부서, 팀 정보 조회 Map에서 가져와 분리
	    Map<String, Object> departmentAndTeamInfo = empService.getDeptAndTeamList();
	    model.addAttribute("deptList", departmentAndTeamInfo.get("deptList")); // 부서 정보 리스트
	    model.addAttribute("teamList", departmentAndTeamInfo.get("teamList")); // 팀 정보 리스트
	    
	    return "/emp/registEmp"; // 인사등록 폼으로 이동
	}
	
	// 인사 등록 액션
	@PostMapping("/emp/registEmp")
	public String processEmployeeRegistration(@RequestParam(required = true, defaultValue = "0.0", name = "remainDays")
											  @ModelAttribute("empInfo") EmpInfo empInfo ) {
		
		// empInfo VO 값을 전달하여 addEmp 메서드 실행
	    int rowCount = empService.addEmp(empInfo);
	    log.debug(CC.YE + "EmpController.registEmp() rowCount: " + rowCount + CC.RESET);
	    
	    return "redirect:/emp/empList"; // 인사목록 페이지로 리다이렉트
	}

view를 호출할 GetMapping의 주소로써 "/emp/registEmp"를 설정.
select box에 쓸 List를 전달해주기 위해서 Model 값을 매개변수로 넣었고
Map을 List를 분리해 view에 보내줌.

EmpController_version2
// 사원 등록 폼
	@GetMapping("/emp/registEmp")
	public String registEmp(Model model) {
		
	    // 부서, 팀 정보 조회 Map에서 가져와 분리
	    Map<String, Object> departmentAndTeamInfo = empService.getDeptAndTeamList();
	    model.addAttribute("deptList", departmentAndTeamInfo.get("deptList")); // 부서 정보 리스트
	    model.addAttribute("teamList", departmentAndTeamInfo.get("teamList")); // 팀 정보 리스트
	    
	    return "/emp/registEmp"; // 인사등록 폼으로 이동
	}
	
	// 사원 등록 액션
	@PostMapping("/emp/registEmp")
	public String registEmp(@ModelAttribute("empInfo") EmpInfo empInfo ) {
		
		// empInfo VO 값을 전달하여 addEmp 메서드 실행
	    int rowCount = empService.addEmp(empInfo);
	    log.debug(CC.YE + "EmpController.registEmp() rowCount: " + rowCount + CC.RESET);
	    
	    return "redirect:/emp/empList"; // 인사목록 페이지로 리다이렉트
	}

part3

EmpService_version1
// 인사 정보 등록
	public int addEmp(EmpInfo empInfo) {
	    
	    // 인사 정보 등록
	    int addEmpRow = empMapper.addEmp(empInfo);
	    log.debug(CC.YE + "EmpService.addEmp() row : " + addEmpRow + CC.RESET);
	    
	    // 사원번호 사용여부 등록
	    if( addEmpRow > 0) {
		    int addEmpNoRow = empMapper.addEmpNo(empInfo.getEmpNo());
		    log.debug(CC.YE + "EmpService.addEmpNoRow() row : " + addEmpNoRow + CC.RESET);
	    }
	    
	    return addEmpRow; // 사원 정보 등록 결과를 반환
	}
EmpService_version2

addEmpNoRow의 쿼리 처리 결과
==> Preparing: INSERT INTO emp_no_list ( emp_no , active , createdate ) VALUES ( ? , 'Y' , NOW() )

==> Parameters: 1111119(Integer)

<== Updates: 1

addEmpRow의 쿼리 처리 결과
==> Preparing: INSERT INTO emp_info( emp_no , emp_name , dept_name , team_name , emp_position , access_level , emp_state , employ_date , remain_days , createdate , updatedate ) VALUES ( ? , ? , ? , ? , ? , ? , ? , ? , ? , NOW() , NOW() )

==> Parameters: 1111119(Integer), 김냠(String), 영업지원본부(String), 영업팀(String), 사원(String), 0(String), 재직(String), 2023-08-17(String), 0.0(Double)

<== Updates: 1

part4

EmpMapper.java
// 인사정보 등록
int addEmp(EmpInfo empInfo);

// 사원번호 사용여부 등록
int addEmpNo(int empNo);

part5

EmpMapper.xml_version1
<!-- 인사 정보 등록 -->
	<insert id="addEmp" parameterType="com.fit.vo.EmpInfo">
	<selectKey order="AFTER" keyProperty="empNo" resultType="int">
		SELECT LAST_INSERT_ID()
	</selectKey>
	    INSERT INTO emp_info(
	        emp_no
	        , emp_name
	        , dept_name
	        , team_name
	        , emp_position
	        , access_level
	        , emp_state
	        , employ_date
	        , remain_days
	        , createdate
	        , updatedate
	    ) VALUES (
	        #{empNo}
	        , #{empName}
	        , #{deptName}
	        , #{teamName}
	        , #{empPosition}
	        , #{accessLevel}
	        , #{empState}
	        , #{employDate}
	        , #{remainDays}
	        , NOW()
	        , NOW()
	    )
	</insert>
	<!-- 사원번호 사용여부 등록 -->
	<insert id="addEmpNo" parameterType="int">
	    INSERT INTO emp_no_list (
		    , emp_no
		    , active
		    , createdate 
		) VALUES (
		    #{empNo}
		    , 'Y'
		    , NOW()
	    )
	</insert>
EmpMapper.xml_version2
<!-- 사원번호 등록 -->
	<insert id="addEmpNo" parameterType="int">
	    INSERT INTO emp_no_list (
		    emp_no
		    , active
		    , createdate 
		) VALUES (
		    #{empNo}
		    , 'Y'
		    , NOW()
	    )
	</insert>
	
	<!-- 인사 정보 등록 -->
	<insert id="addEmp" parameterType="com.fit.vo.EmpInfo">
	    INSERT INTO emp_info(
	        emp_no
	        , emp_name
	        , dept_name
	        , team_name
	        , emp_position
	        , access_level
	        , emp_state
	        , employ_date
	        , remain_days
	        , createdate
	        , updatedate
	    ) VALUES (
	        #{empNo}
	        , #{empName}
	        , #{deptName}
	        , #{teamName}
	        , #{empPosition}
	        , #{accessLevel}
	        , #{empState}
	        , #{employDate}
	        , #{remainDays}
	        , NOW()
	        , NOW()
	    )
	</insert>

0개의 댓글