<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>회원관리</h1>
<a href="/writeFormEmp">회원 가입</a><p>
<a href="/listEmp">회원 목록(기본 CRUD)</a><p>
<a href="/listEmpDept">직원부서조회(Join/Mail)</a><p>
<a href="/writeDeptIn">PL/SQL(부서입력)</a><p>
<a href="/writeDeptCursor">PL/SQL(부서조회 Cursor)</a><p>
<a href="/interCeptorForm">interCeptor(가로채기)</a><p>
<a href="/upLoadFormStart">Upload(이미지 올리기)</a><p>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
UpLoad Image : <img alt="UpLoad Image" src="${pageContext.request.contextPath}/upload/${savedName}">
<form id="form1" action="uploadForm" method="post" enctype="multipart/form-data" >
<input type="file" name="file1"> <p>
<input type="text" name="title"> <p>
<input type="submit">
</form>
<a href="uploadFileDelete">upLoad삭제Test</a>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
KKK : ${kkk} <p>
Image : ${savedName} <p>
UpLoad Image : <img alt="UpLoad Image" src="${pageContext.request.contextPath}/upload/${savedName}">
</body>
</html>
package com.oracle.oBootMybatis01.controller;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import lombok.extern.slf4j.Slf4j;
@Controller
@Slf4j
public class UploadController {
// upLoadForm 시작화면
@RequestMapping(value = "upLoadFormStart")
public String upLoadFormStart(Model model) {
log.info("upLoadFormStart Start...");
return "upLoadFormStart";
}
// 이미지 업로드
@PostMapping(value = "uploadForm")
public String uploadForm(HttpServletRequest request, MultipartFile file1, Model model) throws IOException, Exception {
// Servlet 상속 받지 못했을 때 realPath 불러 오는 방법
String uploadPath = request.getSession().getServletContext().getRealPath("/upload/");
log.info("uploadForm POST Start...");
log.info("originalName: {}", file1.getOriginalFilename());
log.info("size: {}", file1.getSize());
log.info("contentType: {}", file1.getContentType());
log.info("uploadPath: {}", uploadPath);
String savedName = uploadFile(file1.getOriginalFilename(), file1.getBytes(), uploadPath);
log.info("savedName: {}", savedName);
model.addAttribute("savedName", savedName);
return "uploadResult";
}
// 이미지 업로드 메서드
private String uploadFile(String originalName, byte[] fileData, String uploadPath) throws Exception {
// universally unique identifier (UUID).
UUID uid = UUID.randomUUID();
// requestPath = requestPath + "/resources/image";
log.info("uploadPath->{}",uploadPath);
// Directory 생성
File fileDirectory = new File(uploadPath);
if (!fileDirectory.exists()) {
fileDirectory.mkdir(); // mkdir 신규 폴더 생성
log.info("업로드용 폴더 생성 : {}", uploadPath);
}
String savedName = uid.toString() + "_" + originalName;
log.info("savedName: {}", savedName);
File target = new File(uploadPath, savedName);
// File target = new File(requestPath, savedName);
// File Upload -> uplaodPath / UUID+_+originalName
FileCopyUtils.copy(fileData, target); // org.springframework.util.FileCopyUtils
return savedName;
}
}
MultipartFile 주요 메서드
- file.getOriginalFilename() : 업로드 파일 명
- file.transferTo() : 파일 저장
파일 사이즈 추가
server:
port : 8391
# Oracle Connect
spring:
datasource:
url: jdbc:oracle:thin:@localhost:1521/xe
username: scott
password: tiger
driver-class-name: oracle.jdbc.driver.OracleDriver
# File Size
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
# Jpa Setting
jpa:
hibernate:
ddl-auto: create # none create update
properties:
hibernate:
default_batch_fetch_size: 500
show_sql: true # System.out에 하이버네이트 실행 SQL
format_sql: true
# view Resolver
mvc:
view:
prefix: /WEB-INF/views/
suffix: .jsp
# gmail Transfer
mail:
host: smtp.gmail.com
port: 587
username: gpdy0102@gmail.com
password: rmhwmslxxsrrqhoz
properties:
mail:
smtp:
auth: true
starttls.enable: true
# Mybatis
mybatis:
config-location: classpath:configuration.xml
mapper-locations: classpath:mappers/*.xml
logging.level:
org.hibernate.SQL: debug # logger를 통해 하이버네이트 실행 SQL
package com.oracle.oBootMybatis01.controller;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import lombok.extern.slf4j.Slf4j;
@Controller
@Slf4j
public class UploadController {
// upLoadForm 시작화면
@RequestMapping(value = "upLoadFormStart")
public String upLoadFormStart(Model model) {
log.info("upLoadFormStart Start...");
return "upLoadFormStart";
}
// 이미지 업로드
@PostMapping(value = "uploadForm")
public String uploadForm(HttpServletRequest request, MultipartFile file1, Model model) throws IOException, Exception {
// Servlet 상속 받지 못했을 때 realPath 불러 오는 방법
String uploadPath = request.getSession().getServletContext().getRealPath("/upload/");
log.info("uploadForm POST Start...");
log.info("originalName: {}", file1.getOriginalFilename());
log.info("size: {}", file1.getSize());
log.info("contentType: {}", file1.getContentType());
log.info("uploadPath: {}", uploadPath);
String savedName = uploadFile(file1.getOriginalFilename(), file1.getBytes(), uploadPath);
log.info("savedName: {}", savedName);
model.addAttribute("savedName", savedName);
return "uploadResult";
}
// 이미지 업로드 메서드
private String uploadFile(String originalName, byte[] fileData, String uploadPath) throws Exception {
// universally unique identifier (UUID).
UUID uid = UUID.randomUUID();
// requestPath = requestPath + "/resources/image";
log.info("uploadPath->{}",uploadPath);
// Directory 생성
File fileDirectory = new File(uploadPath);
if (!fileDirectory.exists()) {
fileDirectory.mkdir(); // mkdir 신규 폴더 생성
log.info("업로드용 폴더 생성 : {}", uploadPath);
}
String savedName = uid.toString() + "_" + originalName;
log.info("savedName: {}", savedName);
File target = new File(uploadPath, savedName);
// File target = new File(requestPath, savedName);
// File Upload -> uplaodPath / UUID+_+originalName
FileCopyUtils.copy(fileData, target); // org.springframework.util.FileCopyUtils
return savedName;
}
// 이미지 삭제
@GetMapping(value = "uploadFileDelete")
public String uploadFileDelete(HttpServletRequest request, Model model) throws Exception {
String uploadPath = request.getSession().getServletContext().getRealPath("/upload/");
String deleteFile = uploadPath + "27583ced-f394-4dad-b3d2-7c71923e0ee7_6.jpg";
log.info("deleteFile: {}", deleteFile);
log.info("uploadFileDelete Start...");
int delResult = upFileDelete(deleteFile);
log.info("deleteFile result -> {}", delResult);
model.addAttribute("deleteFile", deleteFile);
model.addAttribute("delResult", delResult);
return "uploadResult";
}
// 이미지 삭제 메서드
private int upFileDelete(String deleteFileName) throws Exception {
int result = 0;
log.info("upFileDelete result->{}", deleteFileName);
File file = new File(deleteFileName);
if(file.exists()) {
if(file.delete()) {
log.info("파일 삭제 성공");
result = 1;
}
else {
log.info("파일 삭제 실패");
result = 0;
}
}
else {
log.info("파일이 존재하지 않습니다.");
result = -1;
}
return result;
}
}
package com.oracle.oBootMybatis01.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Aspect
@Component
public class LogAop {
// aop3.buz 패키지 안에 있는 모든 메소드
@Pointcut("within(com.oracle.oBootMybatis01.dao.EmpDao*)")
private void pointcutMethod() {
}
@Around("pointcutMethod()")
public Object loggerAop(ProceedingJoinPoint joinpoint) throws Throwable {
String signatureStr = joinpoint.getSignature().toShortString();
log.info( " {} is start.", signatureStr);
long st = System.currentTimeMillis();
try {
Object obj = joinpoint.proceed();
return obj;
} finally {
long et = System.currentTimeMillis();
log.info( "{} is finished.",signatureStr);
log.info( "{} 경과시간 : {}", signatureStr, (et - st));
}
}
@Before("within(com.oracle.oBootMybatis01.dao.EmpDao*)")
public void beforeAdvice() {
log.info("beforeAdvice()");
}
@After("within(com.oracle.oBootMybatis01.dao.EmpDao*)")
public void afterAdvice() {
log.info("AfterAdvice()");
}
}
이게 더 간단하고 이해하기 쉬움
joinPoint.proceed() : Aop가 적용된 메소드를 전체 수행하고 리턴되는 데이터를 받는 메소드
package com.oracle.oBootMybatis01.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Aspect
@Component
public class LogAop {
@Around("execution(* com.oracle.oBootMybatis01.dao.EmpDao..*(..))")
public Object execute(ProceedingJoinPoint joinpoint) throws Throwable {
long start = System.currentTimeMillis();
log.info("Start: {}", joinpoint.toString());
try {
return joinpoint.proceed();
} finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
log.info("END: {} {} ms",joinpoint.toString(),timeMs);
}
}
}
null 체크
package com.oracle.oBootMybatis01.controller;
import java.util.List;
import java.util.Optional;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import com.oracle.oBootMybatis01.domain.Member;
import com.oracle.oBootMybatis01.service.MemberJpaService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Controller
@Slf4j
@RequiredArgsConstructor
public class MemberJpaController {
private final MemberJpaService memberJpaService;
// 회원가입 폼 이동
@GetMapping(value = "/memberJpa/new")
public String createForm() {
log.info("/memberJpa/new Start...");
return "memberJpa/createMemberForm";
}
// 회원가입 저장
@PostMapping(value = "/memberJpa/save")
public String create(Member member) {
log.info("create Start...");
log.info("member.getId()->{}",member.getId());
log.info("member.getName()->{}",member.getName());
memberJpaService.join(member);
return "memberJpa/createMemberForm";
}
// 회원목록
@GetMapping(value = "/members")
public String listMember(Model model) {
log.info("listMember Start...");
List<Member> memberList = memberJpaService.getListAllMember();
model.addAttribute("members", memberList);
return "memberJpa/memberList";
}
// 회원 수정 폼 이동
@GetMapping(value = "/memberJpa/memberUpdateForm")
public String memberUpdateForm(Long id, Model model) {
Member member = null;
String rtnJsp = "";
log.info("memberUpdateForm id->{}", id);
Optional<Member> maybeMember = memberJpaService.findById(id);
if(maybeMember.isPresent()) {
log.info("maybeMember is Not Null");
member = maybeMember.get();
model.addAttribute("member", member);
rtnJsp = "memberJpa/memberModify";
} else {
log.info("maybeMember is Null");
model.addAttribute("message", "member가 존재하지 않으니, 입력부터 수행해주세요");
rtnJsp = "forward/members";
}
return rtnJsp;
}
@GetMapping(value = "/memberJpa/memberUpdate")
public String memberUpdate(Member member, Model model) {
log.info("memberUpdate id->{}", member.getId());
log.info("memberUpdate name->{}",member.getName());
memberJpaService.memberUpdate(member);
return "redirect:/members";
}
}
package com.oracle.oBootMybatis01.service;
import java.util.List;
import java.util.Optional;
import javax.transaction.Transactional;
import org.springframework.stereotype.Service;
import com.oracle.oBootMybatis01.domain.Member;
import com.oracle.oBootMybatis01.repository.MemberJpaRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Service
@Transactional
@RequiredArgsConstructor
@Slf4j
public class MemberJpaService {
private final MemberJpaRepository memberJpaRepository;
// 회원가입
public Long join(Member member) {
log.info("join member.getId()->{}",member.getId());
memberJpaRepository.save(member);
return member.getId();
}
// 전체 회원 조회
public List<Member> getListAllMember() {
List<Member> listMember = memberJpaRepository.findAll();
log.info("listMember.size()->{}",listMember.size());
return listMember;
}
public Optional<Member> findById(Long memberId) {
log.info("findById Start...");
Optional<Member> member = memberJpaRepository.findById(memberId);
return member;
}
public void memberUpdate(Member member) {
log.info("memberUpdate member name->{}",member.getName());
log.info("memberUpdate member id->{}",member.getId());
memberJpaRepository.updateByMember(member);
return;
}
}
package com.oracle.oBootMybatis01.repository;
import java.util.List;
import java.util.Optional;
import com.oracle.oBootMybatis01.domain.Member;
public interface MemberJpaRepository {
Member save(Member member);
List<Member> findAll();
Optional<Member> findById(Long memberId);
void updateByMember(Member member);
}
em.merge vs em.persist
package com.oracle.oBootMybatis01.repository;
import java.util.List;
import java.util.Optional;
import javax.persistence.EntityManager;
import org.springframework.stereotype.Repository;
import com.oracle.oBootMybatis01.domain.Member;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Repository
@RequiredArgsConstructor
public class MemberJpaRepositoryImpl implements MemberJpaRepository {
private final EntityManager em;
@Override
public Member save(Member member) {
log.info("save Start...");
em.persist(member);
return member;
}
@Override
public List<Member> findAll() {
log.info("findAll Start...");
List<Member> memberList = em.createQuery("select m from Member m",Member.class)
.getResultList();
return memberList;
}
@Override
public Optional<Member> findById(Long memberId) {
log.info("findById Start...");
Member member = em.find(Member.class, memberId);
return Optional.ofNullable(member);
}
@Override
public void updateByMember(Member member) {
em.merge(member);
return;
}
}
package com.oracle.oBootMybatis01.domain;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.Getter;
import lombok.Setter;
@Entity
@Getter
@Setter
@Table(name = "member3")
public class Member {
@Id
private Long id;
private String name;
private String password;
private Date reg_date;
}
package com.oracle.oBootMybatis01.controller;
import java.util.List;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.oracle.oBootMybatis01.model.Dept;
import com.oracle.oBootMybatis01.model.SampleVO;
import com.oracle.oBootMybatis01.service.EmpService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
// @Controller + @Repository
@RestController
@Slf4j
@RequiredArgsConstructor
public class EmpRestController {
private final EmpService es;
@RequestMapping("/helloText")
public String helloText() {
log.info("helloText Start...");
String hello = "안녕";
return hello;
}
@RequestMapping("/sample/sendVO2")
public SampleVO sendVO2(int deptno) {
log.info("deptno->{}",deptno);
SampleVO vo = new SampleVO();
vo.setFirstName("길동");
vo.setLastName("홍");
vo.setMno(deptno);
return vo;
}
@RequestMapping("/sendVO3")
public List<Dept> sendVO3() {
log.info("sendVO3 Start...");
List<Dept> deptList = es.deptSelect();
return deptList;
}
}
// ajaxForm 입력 화면
@RequestMapping(value = "ajaxForm")
public String ajaxForm(Model model) {
log.info("ajaxForm Start...");
return "ajaxForm";
}
@ResponseBody
@RequestMapping(value = "getDeptName")
public String getDeptName(String deptno, Model model) {
log.info("deptno->{}",deptno);
return deptno;
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>다양한 Ajax Test</h1>
<a href="/helloText">helloText</a><p>
<a href="/sample/sendVO2?deptno=123">sample/sendVO2</a><p>
<a href="/sendVO3">sendVO3</a><p>
<a href="/getDeptName?deptno=456">getDeptName</a><p>
</body>
</html>
EmpRestController
EmpController
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 org.springframework.web.bind.annotation.ResponseBody;
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:writeFormEmp";
}
// Service, Dao , Mapper명[insertEmp] 까지 -> insert
int insertResult = es.insertEmp(emp);
if(insertResult > 0) {
return "redirect:listEmp";
}
else {
model.addAttribute("msg", "입력 실패 확인해 보세요");
return "forward:writeFormEmp";
}
}
// 중복체크
@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("interCeptorForm 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
}
// ajaxForm 입력 화면
@RequestMapping(value = "ajaxForm")
public String ajaxForm(Model model) {
log.info("ajaxForm Start...");
return "ajaxForm";
}
@ResponseBody
@RequestMapping(value = "getDeptName")
public String getDeptName(String deptno, Model model) {
log.info("deptno->{}",deptno);
String deptName = es.deptName(deptno);
log.info("deptName->{}",deptName);
return deptName;
}
// Ajax List Test
@RequestMapping(value = "listEmpAjaxForm")
public String listEmpAjaxForm(Model model) {
Emp emp = new Emp();
// Parameter emp --> page만 추가 Setting(페이징)
emp.setStart(1); // 시작시 1
emp.setEnd(20); // 시작시 10
log.info("Ajax List Test Start...");
List<Emp> listEmp = es.listEmp(emp);
log.info("listEmp.size()->{}",listEmp.size());
model.addAttribute("result", "kkk");
model.addAttribute("listEmp", listEmp);
return "listEmpAjaxForm";
}
}
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);
}
@Override
public String deptName(String deptno) {
log.info("deptName Start...");
return dd.deptName(deptno);
}
}
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);
}
@Override
public String deptName(String deptno) {
log.info("deptName Start...");
String resultStr = "";
try {
resultStr = session.selectOne("tkDeptName", deptno);
log.info("deptName resultStr->{}",resultStr);
} catch (Exception e) {
log.info("deptName Exception->{}",e.getMessage());
}
return resultStr;
}
}
<?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>
<select id="tkDeptName" parameterType="String" resultType="java.lang.String">
select dname from dept where deptno = #{deptNo}
</select>
</mapper>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="header.jsp" %>
<!DOCTYPE html>
<%
String context = request.getContextPath();
%>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript">
function getDeptName(vDeptno) {
console.log(vDeptno);
alert("vDeptno->"+vDeptno);
// 행동강령: Ajax로 부서번호 보내고 부서명 받음
$.ajax(
{
url:"<%=context%>/getDeptName",
data:{deptno : vDeptno},
dataType:'text',
success:function(data){
alert("success ajax Data -> "+data);
$('#deptName').val(data); /* input Tag */
$('#msg').html(data); /* span id Tag */
}
}
);
}
</script>
</head>
<body>
<h2>회원 정보</h2>
<table>
<tr><th>사번</th><th>이름</th><th>업무</th><th>부서</th><th>근무지</th></tr>
<c:forEach var="emp" items="${listEmp}">
<tr><td>${emp.empno }</td><td>${emp.ename }</td>
<td>${emp.job }</td>
<td>${emp.deptno}
<input type="button" id="btn_idCheck" value="부서명" onmouseover="getDeptName(${emp.deptno })">
</td>
<td>${empDept.loc }</td>
</tr>
</c:forEach>
</table>
deptName: <input type="text" id="deptName" readonly="readonly"><p>
Message : <span id="msg"></span><p>
</body>
</html>