JDBC -> dataSource
myBatis -> sqlSession
JPA -> Entity Manager
<%@ 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>
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;
}
// 직원 정보 입력
@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";
}
}
-- 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에서 프로시저 실행
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";
}
}
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);
}
}
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 | MAP |
---|---|---|
정의 | Class로 선 정의 | 즉흥적 구성 |
Parameter 전달 | DTO -> Setter Or 생성자 | map.put |
사용용도 | 명확한 정의 | 시간부족/대화부족 |
장점 | 유지보수 용이 | 기능개발 시간 절감 |
<?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>
-- 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;
<%@ 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>
<%@ 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>
<%@ 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>
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
}
}
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;
}
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);
}
}
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);
}
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;
}
}
<?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>
<?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>
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;
}
}
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");
}
}
<%@ 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>
<%@ 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>