국비학원_79일차(이미지 업로드, AOP, JPA, Ajax)

써니·2022년 11월 14일
0

spring

목록 보기
21/23
post-thumbnail

Upload

🎨이미지 올리기

파일 업로드 참고

📂 static

  • index.html
<!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>

📂 views

  • upLoadFormStart.jsp
<%@ 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>
  • uploadResult.jsp
<%@ 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>

[com.oracle.oBootMybatis01.controller]

  • UploadController.java
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() : 파일 저장


❌이미지 삭제

  • application.yml
    파일 사이즈 추가
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

[com.oracle.oBootMybatis01.controller]

  • UploadController.java
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;
	}
}



AOP

[com.oracle.oBootMybatis01.aop]

  • LogAop.java
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()");
	}	
}

⭐김영한 참고 AOP

이게 더 간단하고 이해하기 쉬움
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);
		}		
	}	
}



Jpa

Optional

null 체크


회원가입, 회원목록, 회원수정

[com.oracle.oBootMybatis01.controller]

  • MemberJpaController.java
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";
	}
}

[com.oracle.oBootMybatis01.service]

  • MemberJpaService.java
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;
		
	}
}

[com.oracle.oBootMybatis01.repository]

  • MemberJpaRepository.java( interface )
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);
}
  • MemberJpaRepositoryImpl.java( +interface )

    em.merge vs em.persist

  • 영속성 관리를 하지 않으면 --> Setter 저장 불가
  • merge --> 현재 Setting된 것만 수정 나머지는 Null
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;
		
	}

}

[com.oracle.oBootMybatis01.domain]

  • Member.java
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;

}




Ajax

@RestController

[com.oracle.oBootMybatis01.controller]

  • EmpRestController.java
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;
	}
}

@ResponseBody

[com.oracle.oBootMybatis01.controller]

  • EmpController.java
	// 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;
	}

📂 views

  • ajaxForm.jsp
<%@ 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

  • /helloText
  • /sample/sendVO2?deptno=123
  • /sendVO3

EmpController

  • /getDeptName?deptno=456

Ajax + Jsp

내가 Dept.xml

[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 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";
	}
}

[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);
	}

	@Override
	public String deptName(String deptno) {
		log.info("deptName Start...");
		return dd.deptName(deptno);
	}

}

[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);
	}
	
	@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;
	}

}

📂 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>
	
	<select id="tkDeptName" parameterType="String" resultType="java.lang.String">
		select dname from dept where deptno = #{deptNo}
	</select>
</mapper>

📂 views

  • listEmpAjaxForm.jsp
<%@ 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>

0개의 댓글