국비학원_78일차(Validation, PL/SQL, interCeptor)

써니·2022년 11월 11일
0

spring

목록 보기
20/23
post-thumbnail

ORM 차이

JDBC -> dataSource
myBatis -> sqlSession
JPA -> Entity Manager




Validation Check

🔻oBootMybatis01

📂 views

  • writeFormEmp3.jsp

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> 추가
<form:form></form:form> 변경

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="header.jsp" %>
<!-- validation check -->
<%@ taglib prefix="form"  uri="http://www.springframework.org/tags/form"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<script type="text/javascript">
	function chk() {
		if(!frm.empno.value){
			alert("사번을 입력한 후에 확인하세요");
			frm.empno.focus();
			return false;
		} else location.href="confirm?empno="+frm.empno.value;
	}
</script>
<body>
	<h2>직원정보 입력(Validation Check 용도)</h2>
	<c:if test="${msg!=null}">${msg}</c:if>
	<form:form action="writeEmp3" method="post" name="frm" modelAttribute="emp">
		<table>
			<tr><th>사번</th><td>
				<input type="number" name="empno" required="required" maxlength="4" value="${empno }">
				<input type="button" value="중복확인" onclick="chk()"></td></tr>
			<tr><th>이름</th><td>	<input type="text" name="ename">
								<form:errors path="ename" /></td></tr>
			<tr><th>업무</th><td><input type="text" name="job" required="required"></td></tr>
			<tr><th>급여</th><td>	<input type="number" name="sal" required="required"></td></tr>
			<tr><th>입사일</th><td><input type="date" name="hiredate" required="required"></td></tr>
			<tr><th>보너스</th><td><input type="number" name="comm" required="required"></td></tr>
			<tr><th>관리자사번</th><td>
				<select name="mgr">
					<c:forEach var="emp" items="${empMngList}">
						<option value="${emp.empno}">${emp.ename}</option>
					</c:forEach>
				</select></td>
			</tr>
			<tr><th>부서코드</th><td>
				<select name="deptno">
					<c:forEach var="dept" items="${deptList}">
						<option value="${dept.deptno}">${dept.dname}</option>
					</c:forEach>
				</select></td>
			</tr>
			<tr><td colspan="2"><input type="submit" value="확인"></td></tr>
		</table>
	</form:form>
</body>
</html>

[com.oracle.oBootMybatis01.model]

  • Emp.java
package com.oracle.oBootMybatis01.model;

import javax.validation.constraints.NotEmpty;

import lombok.Data;

@Data
public class Emp {
	private int empno;	
	@NotEmpty(message = "이름은 필수입니다T.T")
	private String ename;
	private String job;			
    private int mgr;
	private String hiredate; 	
    private int sal;
	private int comm;			
    private int deptno;
	
	// 조회용
	private String search;		private String keyword;
	private String pageNum;
	private int start;			private int end;
}

[com.oracle.oBootMybatis01.controller]

  • EmpController.java
// 직원 정보 입력
@RequestMapping(value = "writeFormEmp")
public String writeForm(Model model) {
	log.info("writeForm Start...");
	// 관지자 사번 만 Get
	List<Emp> empList = es.listManager();
	
	// 부서(코드, 부서명)
	List<Dept> deptList = es.deptSelect();
	
	model.addAttribute("empMngList", empList);
	model.addAttribute("deptList", deptList);
	
	// 원래 writeFormEmp
	//return "writeFormEmp";
	// Validation 적용
	return "writeFormEmp3";
}

// Emp ename Validation check
@PostMapping(value = "writeEmp3")
public String writeEmp3(@ModelAttribute("emp") @Valid Emp emp 
						, BindingResult result
						, Model model) {
	log.info("writeEmp3 Start...");
	
	// Validation 오류시 Result
	if(result.hasErrors()) {
		log.info("writeEmp3 hasError...");
		model.addAttribute("msg", "BindingResult 입력 실패 확인해 보세요");
		return "forward:writeFormEmp";
		
	}
	
	// Service, Dao , Mapper명[insertEmp] 까지 -> insert
	int insertResult = es.insertEmp(emp);
	if(insertResult > 0) {
		return "redirect:listEmp";
	} 
	else {
		model.addAttribute("msg", "입력 실패 확인해 보세요");
		return "forward:writeFormEmp";
	}
}




PL/SQL

ORACLE DB 프로시저

-- Spring에서 DeptVO 사용 DeptVO 전달 받음
Create or Replace Procedure Dept_Insert3
 (vdeptno   in  dept.deptno%TYPE,   vdname in dept.dname%TYPE,  vloc in dept.loc%TYPE,
  p_deptno out dept.deptno%TYPE,    p_dname out dept.dname%TYPE ,   p_loc out dept.loc%TYPE)
  Is
  BEGIN
    Insert into dept values(vdeptno, vdname, vloc);
     commit;
     
        DBMS_OUTPUT.ENABLE;
        -- %TYPE 데이터형 변수 사용
        select deptno, dname, loc
        into    p_deptno, p_dname, p_loc
        from   dept
        where deptno = vdeptno;
        
        -- 결과값 출력
        DBMS_OUTPUT.PUT_LINE('부서번호 : ' || p_deptno);
        DBMS_OUTPUT.PUT_LINE('부서이름 : ' || p_dname);
        DBMS_OUTPUT.PUT_LINE('부서위치 : ' || p_loc);
END;


sts에서 프로시저 실행




PL/SQL(부서조회)

[com.oracle.oBootMybatis01.controller]

  • EmpController.java
package com.oracle.oBootMybatis01.controller;

import java.util.HashMap;
import java.util.List;

import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;

import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import com.oracle.oBootMybatis01.model.Dept;
import com.oracle.oBootMybatis01.model.DeptVO;
import com.oracle.oBootMybatis01.model.Emp;
import com.oracle.oBootMybatis01.model.EmpDept;
import com.oracle.oBootMybatis01.service.EmpService;
import com.oracle.oBootMybatis01.service.Paging;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Controller
@Slf4j
@RequiredArgsConstructor
public class EmpController {
	
	private final EmpService  es;
	private final JavaMailSender mailSender;
	
	@RequestMapping(value = "listEmp")
	public String empList(Emp emp, String currentPage, Model model) {
		log.info("empList Start...");
		// Emp 전체 count 25
		int totalEmp = es.totalEmp();
		log.info("empList total=>{}", totalEmp);
		
		// Paging 작업
		Paging page = new Paging(totalEmp, currentPage);
		// Parameter emp --> page만 추가 Setting(페이징)
		emp.setStart(page.getStart()); // 시작시 1
		emp.setEnd(page.getEnd());	   // 시작시 10
		
		List<Emp> listEmp = es.listEmp(emp);
		log.info("listEmp.size()->{}",listEmp.size());
		
		model.addAttribute("totalEmp", totalEmp);
		model.addAttribute("listEmp", listEmp);
		model.addAttribute("page", page);
		return "list";
	}
	
	// 회원 상세 정보
	@GetMapping(value = "detailEmp")
	public String detailEmp(int empno, Model model) {
		log.info("detailEmp Start...");
		Emp emp = es.detailEmp(empno);
		log.info("emp->{}", emp);
		model.addAttribute("emp", emp);
		return "detailEmp";
	}
	
	// 회원 정보 수정
	@GetMapping(value = "updateFormEmp")
	public String updateFormEmp(int empno, Model model) {
		log.info("updateFormEmp Start...");
		
		Emp emp = es.detailEmp(empno);
		
		// 문제
		// 1. DTO String hiredate
		// 2. view : 단순조회 OK,JSP에서 input type="date" 문제 발생
		// 3. 해결책 : 년월일을 짤라 넣어 주어야함
		String hiredate = "";
		if(emp.getHiredate() != null) {
			hiredate = emp.getHiredate().substring(0, 10);
			emp.setHiredate(hiredate);
		}
		log.info("hiredate->{}",hiredate);
		
		model.addAttribute("emp", emp);
		
		return "updateFormEmp";
	}
	
	// 회원 정보 수정하기
	@PostMapping(value = "updateEmp")
	public String updateForm(Emp emp, Model model) {
		log.info("updateEmp Start...");
		
//      1. EmpService안에 updateEmp method 선언
//      1) parameter : Emp
//      2) Return      updateCount (int)
//
//   	2. EmpDao updateEmp method 선언
//                             	 		mapper ID   ,    Parameter
//   	updateCount = session.update("TKempUpdate",emp);

		int updateCount = es.updateEmp(emp);
		log.info("updateCount->{}",updateCount);
		model.addAttribute("uptCnt", updateCount);
		model.addAttribute("kk3", "Message Test");
		
		return "forward:listEmp";
		//return "redirect:listEmp";
	}
	
	// 직원 정보 입력
	@RequestMapping(value = "writeFormEmp")
	public String writeForm(Model model) {
		log.info("writeForm Start...");
		// 관지자 사번 만 Get
		List<Emp> empList = es.listManager();
		
		// 부서(코드, 부서명)
		List<Dept> deptList = es.deptSelect();
		
		model.addAttribute("empMngList", empList);
		model.addAttribute("deptList", deptList);
		
		// 원래 writeFormEmp
		//return "writeFormEmp";
		// Validation 적용
		return "writeFormEmp3";
	}
	
	// 직원 정보 저장
	@PostMapping(value = "writeEmp")
	public String writeEmp(Emp emp, Model model) {
		log.info("writeEmp Start...");
		
		// Service, Dao , Mapper명[insertEmp] 까지 -> insert
		int result = es.insertEmp(emp);
		
		if(result > 0) {
			return "redirect:listEmp";
		} 
		else {
			model.addAttribute("msg", "입력 실패 확인해 보세요");
			return "forward:writeFormEmp";
		}
	}
	
	// Emp ename Validation check
	@PostMapping(value = "writeEmp3")
	public String writeEmp3(@ModelAttribute("emp") @Valid Emp emp 
							, BindingResult result
							, Model model) {
		log.info("writeEmp3 Start...");
		
		// Validation 오류시 Result
		if(result.hasErrors()) {
			log.info("writeEmp3 hasError...");
			model.addAttribute("msg", "BindingResult 입력 실패 확인해 보세요");
			return "forward:writeFormEmp3";
			
		}
		
		// Service, Dao , Mapper명[insertEmp] 까지 -> insert
		int insertResult = es.insertEmp(emp);
		if(insertResult > 0) {
			return "redirect:listEmp";
		} 
		else {
			model.addAttribute("msg", "입력 실패 확인해 보세요");
			return "forward:writeFormEmp3";
		}
	}
	
	// 중복체크
	@GetMapping(value = "confirm")
	public String confirm(int empno, Model model) {
		log.info("confirm Start...");
		Emp emp = es.detailEmp(empno);
		model.addAttribute("empno", empno);
		if(emp != null) {
			log.info("confirm 중복된 사번");
			model.addAttribute("msg", "중복된 사번입니다");
			return "forward:writeFormEmp";
		} else {
			log.info("confirm 사용 가능한 사번");
			model.addAttribute("msg", "사용 가능한 사번입니다");
			return "forward:writeFormEmp";
		}
	}
	
	// 직원삭제
	@GetMapping(value = "deleteEmp")
	public String deleteEmp(int empno, Model model) {
		log.info("deleteEmp Start...");
		int result = 0;
		result = es.deleteEmp(empno);
		
		if(result > 0) {
			return "redirect:listEmp";
		} 
		else {
			model.addAttribute("msg", "삭제 실패 확인해 보세요");
			return "forward:datailEmp";
		}
	}
	
	// 직원 부서 조회
	@GetMapping(value = "listEmpDept")
	public String listEmpDept(Model model) {
		log.info("listEmpDept Start...");
		List<EmpDept> listEmpDept = es.listEmpDept();
		model.addAttribute("listEmpDept", listEmpDept);
		return "listEmpDept";
	}
	
	// 메일 시작
	@RequestMapping(value = "mailTransport")
	public String mailTransport(HttpServletRequest request, Model model) {
		log.info("mailSending");
		String tomail = "khj97041444@gmail.com"; 	// 받는 사람 이메일
		log.info("tomail->{}",tomail);
		String setfrom = "gpdy0102@gmail.com";		// yml 등록된 사람으로 감
		String title = "mailTransport 입니다";		// 제목
		
		try {
			// Mime 전자우편 Internet 표준 Format
			MimeMessage message = mailSender.createMimeMessage();
			MimeMessageHelper messageHelper = new MimeMessageHelper(message, true, "UTF-8");
			messageHelper.setFrom(setfrom);		// 보내는사람 생략하거나 하면 정상작동을 안함
			messageHelper.setTo(tomail);		// 받는 사람 이메일
			messageHelper.setSubject(title);	// 메일제목은 생략이 가능하다
			String tempPassword = (int) (Math.random() * 99999) + 1 + "";
			messageHelper.setText("임시 비밀번호입니다 : " + tempPassword);
			log.info("임시 비밀번호 입니다  : {}",tempPassword);
			DataSource dataSource = new FileDataSource("c:\\log\\hwa.png");
			messageHelper.addAttachment(MimeUtility.encodeText("hwa3.png", "UTF-8", "B"), dataSource); // 첨부문서
			mailSender.send(message);
			model.addAttribute("check", 1);
			// DB tempPassword Logic 구성
		} catch (Exception e) {
			log.info("mailTransport error->{}",e.getMessage());
			model.addAttribute("check", 2); // 메일 전달이 실패 시 model에 2를 담아서 감
		}
		return "mailResult";
	}
	
	// Procedure Test 입력화면
	@RequestMapping(value = "writeDeptIn")
	public String writeDeptIn(Model model) {
		log.info("writeDeptIn Start...");
		return "writeDept3";
	}
	
	// Procedure 통한 Dept 입력후 VO 전달
	@PostMapping(value = "writeDept")
	public String writeDept(DeptVO deptVO, Model model) {
		es.insertDept(deptVO);
		
		if(deptVO == null) {
			log.info("deptVO Null");
		} else {
			log.info("deptVO.getOdeptno()->{}", deptVO.getOdeptno());
			log.info("deptVO.getOdname()->{}", deptVO.getOdname());
			log.info("deptVO.getOloc()->{}", deptVO.getOloc());
			model.addAttribute("msg", "정상 입력 되었습니다 ^^");
			model.addAttribute("dept", deptVO);
		}
		
		return "writeDept3";
	}
	
	// 부서조회
	@GetMapping(value = "writeDeptCursor")
	public String writeDeptCursor(Model model) {
		log.info("writeDeptCursor Start...");
		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put("sDeptno", 30);
		map.put("eDeptno", 60); // 30~60사이를 가져옴
		es.selListDept(map);
		List<Dept> deptLists = (List<Dept>) map.get("dept");
		for(Dept dept : deptLists) {
			log.info("dept.getDname()->{}",dept.getDname());
			log.info("dept.getLoc()->{}",dept.getLoc());
		}
		log.info("deptLists.size()->{}",deptLists.size());
		model.addAttribute("deptList", deptLists);
		
		return "writeDeptCursor";
	}
}

[com.oracle.oBootMybatis01.service]

  • EmpServiceImpl.java
package com.oracle.oBootMybatis01.service;

import java.util.HashMap;
import java.util.List;

import org.springframework.stereotype.Service;

import com.oracle.oBootMybatis01.dao.DeptDao;
import com.oracle.oBootMybatis01.dao.EmpDao;
import com.oracle.oBootMybatis01.model.Dept;
import com.oracle.oBootMybatis01.model.DeptVO;
import com.oracle.oBootMybatis01.model.Emp;
import com.oracle.oBootMybatis01.model.EmpDept;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Service
@Slf4j
@RequiredArgsConstructor
public class EmpServiceImpl implements EmpService {
	
	private final EmpDao ed;
	private final DeptDao dd;
	
	@Override
	public int totalEmp() {
		log.info("totalEmp Start...");
		int totEmpCnt = ed.totalEmp();
		log.info("totalEmp totEmpCnt=>{}",totEmpCnt);
		return totEmpCnt;
	}

	@Override
	public List<Emp> listEmp(Emp emp) {
		List<Emp> empList = null;
		log.info("listEmp Start...");
		empList = ed.listEmp(emp);
		log.info("listEmp empList.size()->{}",empList.size());
		return empList;
	}

	@Override
	public Emp detailEmp(int empno) {
		log.info("detailEmp Start...");
		Emp emp = null;
		emp = ed.detailEmp(empno);
		log.info("emp->{}", emp);
		return emp;
	}

	@Override
	public int updateEmp(Emp emp) {
		log.info("updateEmp Start...");
		int updateCount = 0;
		updateCount = ed.updateEmp(emp);
		return updateCount;
		
	}
	
	// emp->관리자
	@Override
	public List<Emp> listManager() {
		log.info("listManager Start...");
		
		List<Emp> listManager = null;
		listManager = ed.listManager(); 
		
		log.info("listManager.size()->{}",listManager.size());
		// ed.listManager();
		return listManager;
	}
	
	// dept->다 가져옴
	@Override
	public List<Dept> deptSelect() {
		log.info("deptSelect Start...");
		
		List<Dept> deptList = null;
		deptList = dd.deptSelect();
		
		log.info("deptList.size()->{}",deptList.size());
		// deptList =  dd.deptSelect();
		return deptList;
	}

	@Override
	public int insertEmp(Emp emp) {
		log.info("insertEmp Start...");
		int result = 0;
		
		result = ed.insertEmp(emp);
		
		return result;
	}

	@Override
	public int deleteEmp(int empno) {
		log.info("deleteEmp Start...");
		int result = 0;
		result = ed.deleteEmp(empno);
		return result;
	}

	@Override
	public List<EmpDept> listEmpDept() {
		log.info("listEmpDept Start...");
		List<EmpDept> listEmpDept = null;
		listEmpDept = ed.listEmpDept();
		log.info("listEmpDept.size()->{}",listEmpDept.size());
		return listEmpDept;
	}

	@Override
	public void insertDept(DeptVO deptVO) {
		log.info("insertDept Start...");
		dd.insertDept(deptVO);
	}

	@Override
	public void selListDept(HashMap<String, Object> map) {
		log.info("selListDept Start...");
		dd.selListDept(map);
	}

}

[com.oracle.oBootMybatis01.dao]

  • DeptDaoImpl.java
package com.oracle.oBootMybatis01.dao;

import java.util.HashMap;
import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;

import com.oracle.oBootMybatis01.model.Dept;
import com.oracle.oBootMybatis01.model.DeptVO;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Repository
@Slf4j
@RequiredArgsConstructor
public class DeptDaoImpl implements DeptDao {
	
	private final SqlSession session;

	@Override
	public List<Dept> deptSelect() {
		log.info("deptSelect Start...");
		List<Dept> deptList = null;
		
		try {
			deptList = session.selectList("tkSelectDept");
			// deptList =  session.selectList("tkSelectDept");
		} catch (Exception e) {
			log.info("deptSelect Exception->{}",e.getMessage());
		}
		
		return deptList;
	}

	@Override
	public void insertDept(DeptVO deptVO) {
		log.info("insertDept Start...");
		session.selectOne("procDeptInsert", deptVO);
	}

	@Override
	public void selListDept(HashMap<String, Object> map) {
		log.info("selListDept Start...");
		session.selectOne("procDeptList", map);
	}

}



💡 DTO vs MAP

비교DTOMAP
정의Class로 선 정의즉흥적 구성
Parameter 전달DTO -> Setter Or 생성자map.put
사용용도명확한 정의시간부족/대화부족
장점유지보수 용이기능개발 시간 절감



📂 mappers

  • Dept.xml
<?xml version="1.0" encoding="UTF-8"?>

<!-- ======= mapper 기본설정 ======= -->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- ==== 루트 엘리먼트 & 네임스페이스 설정(프로젝트 전체 내에서 유일해야 한다.) ==== -->
<mapper namespace="com.oracle.oBootMybatis01.DeptMapper">
	<resultMap type="Dept" id="DeptResult">
		<result property="deptno" column="deptno"/>
		<result property="dname" column="dname"/>
		<result property="loc" column="loc"/>
	</resultMap>
	
	
	<select id="tkSelectDept" parameterType="Dept" resultType="Dept">
		select * from dept
	</select>
	
	<!-- PL/SQL - Procedure -->
	<select id="procDeptInsert" parameterType="DeptVO" statementType="CALLABLE">
		{
			call Dept_Insert3(
					 #{deptno	,	mode=IN		, jdbcType=INTEGER}
					,#{dname	,	mode=IN		, jdbcType=VARCHAR}
					,#{loc		,	mode=IN		, jdbcType=VARCHAR}
					,#{odeptno	,	mode=OUT	, jdbcType=INTEGER}
					,#{odname	,	mode=OUT	, jdbcType=VARCHAR}
					,#{oloc		,	mode=OUT	, jdbcType=VARCHAR}
			)
		}
	</select>
	
	<!-- Procedure 부서 조회  -->
	<select id="procDeptList" parameterType="java.util.Map" statementType="CALLABLE">
		{
			call Dept_Cursor3(
					 #{sDeptno,	mode=IN,	jdbcType=INTEGER}
					,#{eDeptno,	mode=IN,	jdbcType=INTEGER}
					,#{dept,	mode=OUT,	jdbcType=CURSOR
					,  javaType=java.sql.ResultSet
					,  resultMap=DeptResult}
					)
		
		}
	</select>
</mapper>

oracle

-- Spring에서 Cursor문 사용 ListDept 전달 받음
Create or  Replace PROCEDURE Dept_Cursor3
 (sdeptno       IN      dept.deptno%TYPE, edeptno   IN      dept.deptno%TYPE,
  Dept_Cursor   OUT     SYS_REFCURSOR
 )
 IS
 BEGIN
    OPEN    Dept_Cursor     FOR
        SELECT  deptno, dname, loc
        FROM      dept
        WHERE   deptno BETWEEN sdeptno AND edeptno;
        
END Dept_Cursor3;



📂 views

  • writeDeptCursor.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"   pageEncoding="UTF-8"%>
<%@ include file="header.jsp" %>
<!DOCTYPE html><html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	   <h2>부서 정보 Procedure Cursor List</h2>
	   <table>
		<tr><th>부서명</th><th>부서이름</th><th>근무지</th></tr>
		<c:forEach var="listDept" items="${deptList}">
			<tr><td>${listDept.deptno }</td>
			    <td>${listDept.dname }</td>
				<td>${listDept.loc }</td>
			</tr>
		</c:forEach>
	   </table>     
</body>
</html>




interCeptor


📂 views

  • interCeptorForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="header.jsp" %>    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>interCepter</title>
</head>
<body>
	<h2>직원정보 조회</h2>
	<c:if test="${msg!=null}">${msg}</c:if>
	<form action="interCeptor" name="frm">
	<table>
		<tr><th>사번</th><td><input type="text" name="id" required="required"></td></tr>
		<tr><td><input type="submit" value="확인"></td></tr>
	</table>
	</form>
</body>
</html>
  • interCeptor.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>interCepter</title>
</head>
<body>
    id        : ${id} <p>
    memcnt    : ${memCnt}
    

</body>
</html>

[com.oracle.oBootMybatis01.controller]

  • EmpController.java
package com.oracle.oBootMybatis01.controller;

import java.util.HashMap;
import java.util.List;

import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;

import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.oracle.oBootMybatis01.model.Dept;
import com.oracle.oBootMybatis01.model.DeptVO;
import com.oracle.oBootMybatis01.model.Emp;
import com.oracle.oBootMybatis01.model.EmpDept;
import com.oracle.oBootMybatis01.model.Member1;
import com.oracle.oBootMybatis01.service.EmpService;
import com.oracle.oBootMybatis01.service.Paging;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Controller
@Slf4j
@RequiredArgsConstructor
public class EmpController {
	
	private final EmpService  es;
	private final JavaMailSender mailSender;
	
	@RequestMapping(value = "listEmp")
	public String empList(Emp emp, String currentPage, Model model) {
		log.info("empList Start...");
		// Emp 전체 count 25
		int totalEmp = es.totalEmp();
		log.info("empList total=>{}", totalEmp);
		
		// Paging 작업
		Paging page = new Paging(totalEmp, currentPage);
		// Parameter emp --> page만 추가 Setting(페이징)
		emp.setStart(page.getStart()); // 시작시 1
		emp.setEnd(page.getEnd());	   // 시작시 10
		
		List<Emp> listEmp = es.listEmp(emp);
		log.info("listEmp.size()->{}",listEmp.size());
		
		model.addAttribute("totalEmp", totalEmp);
		model.addAttribute("listEmp", listEmp);
		model.addAttribute("page", page);
		return "list";
	}
	
	// 회원 상세 정보
	@GetMapping(value = "detailEmp")
	public String detailEmp(int empno, Model model) {
		log.info("detailEmp Start...");
		Emp emp = es.detailEmp(empno);
		log.info("emp->{}", emp);
		model.addAttribute("emp", emp);
		return "detailEmp";
	}
	
	// 회원 정보 수정
	@GetMapping(value = "updateFormEmp")
	public String updateFormEmp(int empno, Model model) {
		log.info("updateFormEmp Start...");
		
		Emp emp = es.detailEmp(empno);
		
		// 문제
		// 1. DTO String hiredate
		// 2. view : 단순조회 OK,JSP에서 input type="date" 문제 발생
		// 3. 해결책 : 년월일을 짤라 넣어 주어야함
		String hiredate = "";
		if(emp.getHiredate() != null) {
			hiredate = emp.getHiredate().substring(0, 10);
			emp.setHiredate(hiredate);
		}
		log.info("hiredate->{}",hiredate);
		
		model.addAttribute("emp", emp);
		
		return "updateFormEmp";
	}
	
	// 회원 정보 수정하기
	@PostMapping(value = "updateEmp")
	public String updateForm(Emp emp, Model model) {
		log.info("updateEmp Start...");
		
//      1. EmpService안에 updateEmp method 선언
//      1) parameter : Emp
//      2) Return      updateCount (int)
//
//   	2. EmpDao updateEmp method 선언
//                             	 		mapper ID   ,    Parameter
//   	updateCount = session.update("TKempUpdate",emp);

		int updateCount = es.updateEmp(emp);
		log.info("updateCount->{}",updateCount);
		model.addAttribute("uptCnt", updateCount);
		model.addAttribute("kk3", "Message Test");
		
		return "forward:listEmp";
		//return "redirect:listEmp";
	}
	
	// 직원 정보 입력
	@RequestMapping(value = "writeFormEmp")
	public String writeForm(Model model) {
		log.info("writeForm Start...");
		// 관지자 사번 만 Get
		List<Emp> empList = es.listManager();
		
		// 부서(코드, 부서명)
		List<Dept> deptList = es.deptSelect();
		
		model.addAttribute("empMngList", empList);
		model.addAttribute("deptList", deptList);
		
		// 원래 writeFormEmp
		//return "writeFormEmp";
		// Validation 적용
		return "writeFormEmp3";
	}
	
	// 직원 정보 저장
	@PostMapping(value = "writeEmp")
	public String writeEmp(Emp emp, Model model) {
		log.info("writeEmp Start...");
		
		// Service, Dao , Mapper명[insertEmp] 까지 -> insert
		int result = es.insertEmp(emp);
		
		if(result > 0) {
			return "redirect:listEmp";
		} 
		else {
			model.addAttribute("msg", "입력 실패 확인해 보세요");
			return "forward:writeFormEmp";
		}
	}
	
	// Emp ename Validation check
	@PostMapping(value = "writeEmp3")
	public String writeEmp3(@ModelAttribute("emp") @Valid Emp emp 
							, BindingResult result
							, Model model) {
		log.info("writeEmp3 Start...");
		
		// Validation 오류시 Result
		if(result.hasErrors()) {
			log.info("writeEmp3 hasError...");
			model.addAttribute("msg", "BindingResult 입력 실패 확인해 보세요");
			return "forward:writeFormEmp3";
			
		}
		
		// Service, Dao , Mapper명[insertEmp] 까지 -> insert
		int insertResult = es.insertEmp(emp);
		if(insertResult > 0) {
			return "redirect:listEmp";
		} 
		else {
			model.addAttribute("msg", "입력 실패 확인해 보세요");
			return "forward:writeFormEmp3";
		}
	}
	
	// 중복체크
	@GetMapping(value = "confirm")
	public String confirm(int empno, Model model) {
		log.info("confirm Start...");
		Emp emp = es.detailEmp(empno);
		model.addAttribute("empno", empno);
		if(emp != null) {
			log.info("confirm 중복된 사번");
			model.addAttribute("msg", "중복된 사번입니다");
			return "forward:writeFormEmp";
		} else {
			log.info("confirm 사용 가능한 사번");
			model.addAttribute("msg", "사용 가능한 사번입니다");
			return "forward:writeFormEmp";
		}
	}
	
	// 직원삭제
	@GetMapping(value = "deleteEmp")
	public String deleteEmp(int empno, Model model) {
		log.info("deleteEmp Start...");
		int result = 0;
		result = es.deleteEmp(empno);
		
		if(result > 0) {
			return "redirect:listEmp";
		} 
		else {
			model.addAttribute("msg", "삭제 실패 확인해 보세요");
			return "forward:datailEmp";
		}
	}
	
	// 직원 부서 조회
	@GetMapping(value = "listEmpDept")
	public String listEmpDept(Model model) {
		log.info("listEmpDept Start...");
		List<EmpDept> listEmpDept = es.listEmpDept();
		model.addAttribute("listEmpDept", listEmpDept);
		return "listEmpDept";
	}
	
	// 메일 시작
	@RequestMapping(value = "mailTransport")
	public String mailTransport(HttpServletRequest request, Model model) {
		log.info("mailSending");
		String tomail = "khj97041444@gmail.com"; 	// 받는 사람 이메일
		log.info("tomail->{}",tomail);
		String setfrom = "gpdy0102@gmail.com";		// yml 등록된 사람으로 감
		String title = "mailTransport 입니다";		// 제목
		
		try {
			// Mime 전자우편 Internet 표준 Format
			MimeMessage message = mailSender.createMimeMessage();
			MimeMessageHelper messageHelper = new MimeMessageHelper(message, true, "UTF-8");
			messageHelper.setFrom(setfrom);		// 보내는사람 생략하거나 하면 정상작동을 안함
			messageHelper.setTo(tomail);		// 받는 사람 이메일
			messageHelper.setSubject(title);	// 메일제목은 생략이 가능하다
			String tempPassword = (int) (Math.random() * 99999) + 1 + "";
			messageHelper.setText("임시 비밀번호입니다 : " + tempPassword);
			log.info("임시 비밀번호 입니다  : {}",tempPassword);
			DataSource dataSource = new FileDataSource("c:\\log\\hwa.png");
			messageHelper.addAttachment(MimeUtility.encodeText("hwa3.png", "UTF-8", "B"), dataSource); // 첨부문서
			mailSender.send(message);
			model.addAttribute("check", 1);
			// DB tempPassword Logic 구성
		} catch (Exception e) {
			log.info("mailTransport error->{}",e.getMessage());
			model.addAttribute("check", 2); // 메일 전달이 실패 시 model에 2를 담아서 감
		}
		return "mailResult";
	}
	
	// Procedure Test 입력화면
	@RequestMapping(value = "writeDeptIn")
	public String writeDeptIn(Model model) {
		log.info("writeDeptIn Start...");
		return "writeDept3";
	}
	
	// Procedure 통한 Dept 입력후 VO 전달
	@PostMapping(value = "writeDept")
	public String writeDept(DeptVO deptVO, Model model) {
		es.insertDept(deptVO);
		
		if(deptVO == null) {
			log.info("deptVO Null");
		} else {
			log.info("deptVO.getOdeptno()->{}", deptVO.getOdeptno());
			log.info("deptVO.getOdname()->{}", deptVO.getOdname());
			log.info("deptVO.getOloc()->{}", deptVO.getOloc());
			model.addAttribute("msg", "정상 입력 되었습니다 ^^");
			model.addAttribute("dept", deptVO);
		}
		
		return "writeDept3";
	}
	
	// 부서조회
	@GetMapping(value = "writeDeptCursor")
	public String writeDeptCursor(Model model) {
		log.info("writeDeptCursor Start...");
		HashMap<String, Object> map = new HashMap<String, Object>();
		map.put("sDeptno", 30);
		map.put("eDeptno", 60); // 30~60사이를 가져옴
		es.selListDept(map);
		List<Dept> deptLists = (List<Dept>) map.get("dept");
		for(Dept dept : deptLists) {
			log.info("dept.getDname()->{}",dept.getDname());
			log.info("dept.getLoc()->{}",dept.getLoc());
		}
		log.info("deptLists.size()->{}",deptLists.size());
		model.addAttribute("deptList", deptLists);
		
		return "writeDeptCursor";
	}
	
	// interCeptor 시작화면 -> interCeptorForm
	@RequestMapping(value = "interCeptorForm")
	public String interCeptorForm(Model model) {
		log.info("interCeptor Start...");
		return "interCeptorForm";
	}
	
	// 2. interCeptor Number 2
	@RequestMapping(value = "interCeptor")
	public String interCeptor(String id, Model model) {
		log.info("interCeptor Test Start...");
		log.info("interCeptor id->"+id);
		
		// 존재 : 1,  비존재 : 0
		int memCnt = es.memCount(id);
		
		log.info("memCnt ->{}", memCnt);
		
		model.addAttribute("id", id);
		model.addAttribute("memCnt", memCnt);
		log.info("interCeptor Test End");
		
		return "interCeptor";	// User 존재하면 User 이용 조회 Page
	}
	
	// SampleInterceptor 내용을 받아 처리
	@RequestMapping(value = "doMemberWrite", method = RequestMethod.GET)
	public String doMemberWrite(Model model, HttpServletRequest request) {
		String ID = (String) request.getSession().getAttribute("ID");
		log.info("doMemberWrite 부터 하세요");
		model.addAttribute("id", ID);
		return "doMemberWrite";
	}
	
	// interCeptor 진행 Test
	@RequestMapping(value = "doMemberList")
	public String doMemberList(Model model, HttpServletRequest request) {
		String ID = (String) request.getSession().getAttribute("ID");
		log.info("doMemberList Test Start ID ->{}",ID);
		Member1 member1 = null;
		// Member1 List Get Service
		List<Member1> listMem = es.listMem(member1);
		model.addAttribute("ID", ID);
		model.addAttribute("listMem", listMem);
		return "doMemberList";	// User 존재하면 User 이용 조회 Page
	}
}

[com.oracle.oBootMybatis01.model]

  • Member1.java
package com.oracle.oBootMybatis01.model;

import java.util.Date;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class Member1 {
	private String id;
	private String name;
	private String password;
	private Date reg_date;
}

[com.oracle.oBootMybatis01.service]

  • EmpServiceImpl.java
package com.oracle.oBootMybatis01.service;

import java.util.HashMap;
import java.util.List;

import org.springframework.stereotype.Service;

import com.oracle.oBootMybatis01.dao.DeptDao;
import com.oracle.oBootMybatis01.dao.EmpDao;
import com.oracle.oBootMybatis01.dao.Member1Dao;
import com.oracle.oBootMybatis01.model.Dept;
import com.oracle.oBootMybatis01.model.DeptVO;
import com.oracle.oBootMybatis01.model.Emp;
import com.oracle.oBootMybatis01.model.EmpDept;
import com.oracle.oBootMybatis01.model.Member1;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Service
@Slf4j
@RequiredArgsConstructor
public class EmpServiceImpl implements EmpService {
	
	private final EmpDao ed;
	private final DeptDao dd;
	private final Member1Dao md;
	
	@Override
	public int totalEmp() {
		log.info("totalEmp Start...");
		int totEmpCnt = ed.totalEmp();
		log.info("totalEmp totEmpCnt=>{}",totEmpCnt);
		return totEmpCnt;
	}

	@Override
	public List<Emp> listEmp(Emp emp) {
		List<Emp> empList = null;
		log.info("listEmp Start...");
		empList = ed.listEmp(emp);
		log.info("listEmp empList.size()->{}",empList.size());
		return empList;
	}

	@Override
	public Emp detailEmp(int empno) {
		log.info("detailEmp Start...");
		Emp emp = null;
		emp = ed.detailEmp(empno);
		log.info("emp->{}", emp);
		return emp;
	}

	@Override
	public int updateEmp(Emp emp) {
		log.info("updateEmp Start...");
		int updateCount = 0;
		updateCount = ed.updateEmp(emp);
		return updateCount;
		
	}
	
	// emp->관리자
	@Override
	public List<Emp> listManager() {
		log.info("listManager Start...");
		
		List<Emp> listManager = null;
		listManager = ed.listManager(); 
		
		log.info("listManager.size()->{}",listManager.size());
		// ed.listManager();
		return listManager;
	}
	
	// dept->다 가져옴
	@Override
	public List<Dept> deptSelect() {
		log.info("deptSelect Start...");
		
		List<Dept> deptList = null;
		deptList = dd.deptSelect();
		
		log.info("deptList.size()->{}",deptList.size());
		// deptList =  dd.deptSelect();
		return deptList;
	}

	@Override
	public int insertEmp(Emp emp) {
		log.info("insertEmp Start...");
		int result = 0;
		
		result = ed.insertEmp(emp);
		
		return result;
	}

	@Override
	public int deleteEmp(int empno) {
		log.info("deleteEmp Start...");
		int result = 0;
		result = ed.deleteEmp(empno);
		return result;
	}

	@Override
	public List<EmpDept> listEmpDept() {
		log.info("listEmpDept Start...");
		List<EmpDept> listEmpDept = null;
		listEmpDept = ed.listEmpDept();
		log.info("listEmpDept.size()->{}",listEmpDept.size());
		return listEmpDept;
	}

	@Override
	public void insertDept(DeptVO deptVO) {
		log.info("insertDept Start...");
		dd.insertDept(deptVO);
	}

	@Override
	public void selListDept(HashMap<String, Object> map) {
		log.info("selListDept Start...");
		dd.selListDept(map);
	}

	@Override
	public int memCount(String id) {
		log.info("memCount Start...");
		return md.memCount(id);
	}

	@Override
	public List<Member1> listMem(Member1 member1) {
		log.info("listMem Start...");
		return md.listMem(member1);
	}

}

[com.oracle.oBootMybatis01.dao]

  • Member1Dao.java( interface )
package com.oracle.oBootMybatis01.dao;

import java.util.List;

import com.oracle.oBootMybatis01.model.Member1;

public interface Member1Dao {
	int		memCount(String id); // Member1의 Count

	List<Member1> listMem(Member1 member1);
}

  • Member1DaoImpl.java( +interface )
package com.oracle.oBootMybatis01.dao;

import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;

import com.oracle.oBootMybatis01.model.Member1;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Repository
@Slf4j
@RequiredArgsConstructor
public class Member1DaoImpl implements Member1Dao {
	private final SqlSession session;
	
	
	@Override
	public int memCount(String id) {
		int result = 0;
		log.info("id->{}",id);
		try {
			result = session.selectOne("memCount", id);
		} catch (Exception e) {
			log.info("memCount Exception->{}",e.getMessage());
		}
		return result;
	}


	@Override
	public List<Member1> listMem(Member1 member1) {
		log.info("listMem start...");
		List<Member1> listMember1 = null;
		try {
			listMember1 = session.selectList("listMember1", member1);
		} catch (Exception e) {
			log.info("listMember1 Exception->{}",e.getMessage());
		}
		return listMember1;
	}

}

📂 src/main/resources

  • configuration.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>
	<typeAliases>
		<typeAlias alias="Emp" type="com.oracle.oBootMybatis01.model.Emp"/>
		<typeAlias alias="Dept" type="com.oracle.oBootMybatis01.model.Dept" />
		<typeAlias alias="EmpDept" type="com.oracle.oBootMybatis01.model.EmpDept" />
		<typeAlias alias="DeptVO" type="com.oracle.oBootMybatis01.model.DeptVO" />
		<typeAlias alias="Member1" type="com.oracle.oBootMybatis01.model.Member1" />
	</typeAliases>
</configuration>

📂 mappers

  • Member1.xml
<?xml version="1.0" encoding="UTF-8"?>

<!-- ======= mapper 기본설정 ======= -->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!-- ==== 루트 엘리먼트 & 네임스페이스 설정(프로젝트 전체 내에서 유일해야 한다.) ==== -->
<mapper namespace="com.oracle.oBootMybatis01.Member1Mapper">
	<select id="memCount" parameterType="java.lang.String" resultType="int">
		select count(*) from member1 where id = #{id}
	</select>
	
	<select id="listMember1" parameterType="Member1" resultType="Member1">
		select * from member1
	</select>
</mapper>

[com.oracle.oBootMybatis01.service]

  • SampleInterceptor.java( + interface - HandlerInterceptor )
package com.oracle.oBootMybatis01.service;

import java.lang.reflect.Method;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class SampleInterceptor implements HandlerInterceptor {
	public SampleInterceptor() {
	}
	
	// 3번
	@Override
	public void postHandle(HttpServletRequest request, 
						   HttpServletResponse response, 
						   Object handler,
			ModelAndView modelAndView) throws Exception {
		log.info("post handle.........................");
		String ID = (String) modelAndView.getModel().get("id");
		int memCnt = (int) modelAndView.getModel().get("memCnt");
		log.info("postHandle memCnt: {}",memCnt);
		if(memCnt < 1) {
			log.info("memCnt Not exists");
			request.getSession().setAttribute("ID", ID);
			// User가 존재하지 않으면 User interCeptor Page(회원등록) 이동
			response.sendRedirect("doMemberWrite");
		} else {	// 정상 	login	User
			log.info("memCnt exists");
			request.getSession().setAttribute("ID", ID);
			// User가 존재하면 User interCeptor Page(회원 List) 이동
			response.sendRedirect("doMemberList");
		}
	}
	
	// 1번
	@Override
	public boolean preHandle(HttpServletRequest request, 
							 HttpServletResponse response, 
							 Object handler)
			throws Exception {
		log.info("pre handle..........................");
		HandlerMethod method = (HandlerMethod) handler;
		Method methodObj = method.getMethod();
		log.info("Bean: {}",method.getBean());
		log.info("Method: {}",methodObj);
		return true;
	}
}

interceptor 환경설정

[com.oracle.oBootMybatis01.configuration]

  • WebMvcConfiguartion.java ( + interface - WebMvcConfigurer )
package com.oracle.oBootMybatis01.configuration;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import com.oracle.oBootMybatis01.service.SampleInterceptor;

@Configuration
public class WebMvcConfiguartion implements WebMvcConfigurer {
	
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// 누군가 URL / interCeptor --> SampleInterceptor() 처리 해줌
		registry.addInterceptor(new SampleInterceptor()).addPathPatterns("/interCeptor");
	}
}

📂 views

  • doMemberList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="header.jsp" %>    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>회원 정보</h2>
조회자 ID : ${ID}
<table>
	<tr><th>ID</th><th>이름</th><th>비밀번호</th><th>등록일</th></tr>
	<c:forEach var="listMem" items="${listMem}">
		<tr><td>${listMem.id }</td>
		    <td>${listMem.name }</td>
			<td>${listMem.password }</td>
			<td>${listMem.reg_date }</td>
		</tr>
	</c:forEach>
</table>
</body>
</html>
  • doMemberWrite.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>doMemberWrite</title>
</head>
<body>

 <h2>직원정보 입력</h2>
<form action="" method="post" name="frm">
<table>
	<tr><th>사번</th><td><input type="text" name="id" 
		required="required" maxlength="4" value="${id}">
		<input type="button" value="중복확인" 
		onclick="chk()"> </td></tr>
	<tr><th>비밀번호</th><td><input type="text" name="password" 
		required="required"> </td></tr>
	<tr><th>이름</th><td><input type="text" name="name" 
		required="required"></td></tr>

	<tr><td colspan="2"><input type="submit" value="확인"></td></tr>
</table>
</form>

</body>
</html>

0개의 댓글