1. Spring에서의 리소스 처리 방법에 대하여 설명하시오.

1-1. Spring의 resource

: 이미지나 css, js 문서와 같은 정적 리소스 파일들을 담는 공간

 

1-2. 정적 리소스 취급 방법

 

 

2. 기존 Board 프로젝트 내 list에서 추가로 페이징을 구현하시오

: 미구현(3번 EMP List 구현으로 인한 시간 초과)

 

 

3. Scott DB의 EMP/DEPT 테이블 정보들을 불러온 뒤 직원 정보들을 새로 작성하시오.

3-1. 소스코드

EMP List Project

 

3-2. 구현사항

  • 직원 리스트 페이지(list) 구현
  • 직원 정보 작성 페이지(write_view) 구현
  • 직원 정보 작성 반영(write) 구현
  • 클라이언트에서 유효성 검사(write_view 내 script) 구현
    <%@ 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>EMP - Write</title>
      	
    	<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
    	<script src="//code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
      	
    	<script type="text/javascript">
    		$(document).ready(function() {
    			$("#sbmBtn").click(function() {
    				if($("#empno").val() == "") { // 입력정보만 검사
    					alert("사원번호를 입력하세요.");
    					event.preventDefault();
    				} else if ($("#ename").val() == "") {
    					alert("사원이름을 입력하세요.");
    					event.preventDefault();
    				} else if ($("#hiredate").val() == "") {
    					alert("입사일을 입력하세요.");
    					event.preventDefault();
    				} else if ($("#sal").val() == "") {
    					alert("급여를 입력하세요.");
    					event.preventDefault();
    				} else {
    					alert("입력이 완료 되었습니다.");
    					$("#loginForm").submit();
    				}				
    			});
      			
    			$("#resBtn").click(function() {
    				alert("입력 정보가 초기화 되었습니다.");
    				$("#loginForm")[0].reset();
    			});
    		});
    	</script>
    </head>
    <body>
    	<h1>사원 정보 입력</h1>
    	<hr>
    	<form id="loginForm" action="write" method="post">
    		사원번호&nbsp;<input id="empno" type="number" name="empno"><br>
      		
    		사원이름&nbsp;<input id="ename" type="text" name="ename"><br>
      		
    		직급&nbsp;<select name="job">
    					<c:forEach var="job" items="${jobList}">
    						<option value="${job.job}">${job.job}</option>
    					</c:forEach>
    		    	 </select><br>
      		
    		상사&nbsp;<select name="mgr">
    					<c:forEach var="mgr" items="${mgrList}">
    						<option value="${mgr.empno}">(${mgr.empno}) ${mgr.ename}</option>
    					</c:forEach>
    				 </select><br>
      		
    		입사일&nbsp;<input id="hiredate" type="date" name="hiredate"><br>
      		
    		급여&nbsp;<input id="sal" type="number" name="sal" placeholder="4200"><br>
      		
    		커미션(선택)&nbsp;<input type="number" name="comm" placeholder="500"><br>
      		
    		부서&nbsp;<select name="deptno">
    					<c:forEach var="dept" items="${deptList}">
    						<option value="${dept.deptno}">(${dept.deptno}) ${dept.dname}</option>
    					</c:forEach>
    		    	 </select><br>
      		
    		<input id="sbmBtn" type="submit" value="입력하기">&nbsp;&nbsp;
    		<input id="resBtn" type="reset" value="입력초기화">&nbsp;&nbsp;
    		<input type="button" value="돌아가기" onclick="location.href='list'">
    	</form>
    </body>
    </html>
  • 서버에서 유효성 검사(validator) 구현
    package edu.bit.ex.emp.controller;
      
    import java.util.List;
      
    import javax.validation.Valid;
      
    import org.springframework.stereotype.Controller;
    import org.springframework.transaction.annotation.Transactional;
    import org.springframework.ui.Model;
    import org.springframework.validation.BindingResult;
    import org.springframework.validation.FieldError;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
      
    import edu.bit.ex.emp.service.EmpService;
    import edu.bit.ex.emp.validator.EmpValidator;
    import edu.bit.ex.emp.vo.EmpVO;
    import lombok.AllArgsConstructor;
    import lombok.extern.log4j.Log4j;
      
    @Log4j
    @AllArgsConstructor
    @Controller
    public class EmpController {
    	private EmpService empService;
      
    	/* 중략 */
      
    	// 직원 정보 작성
    	@PostMapping("/emp/write")
    	public String write(@Valid EmpVO empVO, BindingResult result) {
    		log.info("write()");
      
    		String page = "redirect:list";
    		EmpValidator validator = new EmpValidator();
    		validator.validate(empVO, result);
      
    		if (result.hasErrors()) {
    			page = "reditect:write_view";
    			List<FieldError> list = result.getFieldErrors();
      
    			if (null != result.getFieldErrors()) {
    				for (FieldError fe : result.getFieldErrors()) {
    					log.info("Field: " + fe.getField());
    					log.info("Code: " + fe.getCode());
    					log.info("ObjectName: " + fe.getObjectName());
    					log.info("RejectedValue: " + fe.getRejectedValue());
    					log.info("DefaultMessage: " + fe.getDefaultMessage());
    					// log.info("에러메시지: " + fe.getCode());
    				}
    			}
    		}
    		return page;
    	}
    }
    package edu.bit.ex.emp.validator;
      
    import org.springframework.validation.Errors;
    import org.springframework.validation.ValidationUtils;
    import org.springframework.validation.Validator;
      
    import edu.bit.ex.emp.vo.EmpVO;
    import lombok.extern.log4j.Log4j;
      
    @Log4j
    public class EmpValidator implements Validator {
    	@Override
    	public boolean supports(Class<?> clazz) {
    		// 검증할 EmpVO의 타입 정보를 리턴
    		return EmpVO.class.isAssignableFrom(clazz);
    	}
      
    	@Override
    	public void validate(Object obj, Errors errors) {
    		log.info("validate()");
    		EmpVO empVO = (EmpVO) obj;
      
    		int empno = empVO.getEmpno();
    		if (empno == 0) {
    			log.info("empno is 0");
    			errors.rejectValue("empno", "trouble", "wrong empno");
    		}
      
    		ValidationUtils.rejectIfEmptyOrWhitespace(errors, "empno", "trouble");
    	}
    }​

 

3-3. 미구현사항

  • 클라이언트에서 직원번호(empno) 중복성 체크 미구현boardmapper.xml에서 select count() 쿼리문을 추가한 후 write_view내 script에서 el문법을 통해 대조하면 해결될 것으로 보임
  • 서버에서 직원번호(empno) 중복성 체크 미구현boardmapper.xml에서 select count() 쿼리문을 추가한 후 validator 객체에서 해당 VO객체의 getEmpno() 메소드를 가져와 대조하면 해결될 것으로 보임