본문 바로가기
Spring

2024_08_08_목~08_12_월

by 알케니브 2024. 8. 8.

오늘의 코딩순서

(폴더: oBootMybatis01)

메인페이지: http://localhost:8387

 (0808 일지) 1. 회원 목록 (기본 CRUD)

1. 기본 틀

  • 기본: application.yml + build.gradle
    DTO: Dept.class + Emp.class +
    DAO: EmpDao.interface + EmpDaoImpl.class
    Service: EmpService.interface + EmpServiceImpl.class
    Controller: EmpController.class
    View: header.jsp + list.jsp + index.html +board.css
    Password 설정: SecurityConfiguration.class

(0808 일지 ~ 0809 일지) 1. 회원 목록 (기본 CRUD)

2. 페이징 작업 - 메인 페이지 + List

  • Paging.class(Service) + application.yml + configuration.xml + Emp.xml + EmpController.class
    + EmpService.interface + EmpServiceImpl.class 
    + EmpDao.interface+ EmpDaoImpl.class

3. 페이징 작업 - 페이지 번호 작동

  • EmpController.class (현장 HW 1)

4. 페이지 조회 (현장 HW 2)

  • detailEmp.jsp +
    (현장 HW 2)  EmpController.class + EmpService.interface + EmpServiceImpl.class 
    + EmpDao.interface+ EmpDaoImpl.class + Empno.xml

5. 게시판 내용 수정

  • updateFormEmp.jsp +
    (현장 HW 3)  EmpController.class + EmpService.interface + EmpServiceImpl.class 
    + EmpDao.interface+ EmpDaoImpl.class + Empno.xml

 (0812 일지)1. 회원 목록 (기본 CRUD)

6.writeFormEmp =>  게시판 내용 새로 입력 + 메시지 전달

  • list.jsp + EmpController.class + writeFormEmp.jsp
    1. writeFormEmp 눌렀을 때, 관리자사번 선택창 나오게 하기
      (현장 HW 1) EmpController.class + EmpService.interface + EmpServiceImpl.class 
      + EmpDao.interface+ EmpDaoImpl.class + Emp.xml
    2. writeFormEmp 눌렀을 때, 부서코드 선택창 나오게 하기
      EmpController.class + EmpService.interface + (현장 HW 2) EmpServiceImpl.class
      + DeptDao.interface + DeptDaoImpl.class + Dept.xml
    3. Submit(확인)버튼 눌렀을 때 이동될 창 만들기
      (현장 HW 3)
      EmpController.class + EmpService.interface + EmpServiceImpl.class
      + EmpDao.interface+ EmpDaoImpl.class + Emp.xml
    4. 중복확인 버튼 JSP 방식으로 작동되게 만들기
      writeFormEmp.jsp + EmpController.class 

7. 게시판 내용 삭제

  • EmpController.class + EmpService.interface + EmpServiceImpl.class
    + EmpDao.interface+ EmpDaoImpl.class + Emp.xml

 


오늘의 코딩 포인트

(폴더: oBootMybatis01)

 

(0808 일지)

 1. 기본 틀

  • application.yml
server:
  port: 8387
# Oracle Connect
spring:
  datasource:
    driver-class-name: oracle.jdbc.OracleDriver
    url: jdbc:oracle:thin:@localhost:1521/xe
    username: scott
    password: tiger
    
  #JPA Setting
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: create

  # View Resolver
  mvc:
    view:
      prefix: /WEB-INF/views/
      suffix: .jsp
  • build.gradle
plugins {
	id 'java'
	id 'org.springframework.boot' version '3.3.2'
	id 'io.spring.dependency-management' version '1.1.6'
}

group = 'com.oracle'
version = 'version.1.0'

java {
	toolchain {
		languageVersion = JavaLanguageVersion.of(17)
	}
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-jdbc'
	implementation 'org.springframework.boot:spring-boot-starter-mail'
	implementation 'org.springframework.boot:spring-boot-starter-security'
	implementation 'org.springframework.boot:spring-boot-starter-validation'
	
	implementation 'org.apache.tomcat.embed:tomcat-embed-jasper'
    implementation group: 'org.glassfish.web', name: 'jakarta.servlet.jsp.jstl', version: '2.0.0'
    implementation 'com.googlecode.json-simple:json-simple:1.1.1'
	
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.boot:spring-boot-starter-websocket'
	implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3'
	compileOnly 'org.projectlombok:lombok'
	runtimeOnly 'com.oracle.database.jdbc:ojdbc11'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
	testImplementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter-test:3.0.3'
	testImplementation 'org.springframework.security:spring-security-test'
	testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

tasks.named('test') {
	useJUnitPlatform()
}
  • Dept.class
package com.oracle.oBootMybatis01.model;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString

public class Dept {
	private int		deptno;
	private	String	dname;
	private String	loc;
	
	// 프로젝트시 DTO파일을 여러개 만드는 것보다,
	// 아래에 @Transient 어노테이션을 걸고 더 추가하는 것이 유지보수에 좋음
	
 }
  • Emp.class
package com.oracle.oBootMybatis01.model;

import jakarta.validation.constraints.NotEmpty;
import lombok.Data;

@Data
public class Emp {
	private int		empno;
	
	@NotEmpty(message = "이름은 필수입니다 흑유흑유")
	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;
	
	// Page 정보
	private String	currentPage;
	
	// 프로젝트시 DTO파일을 여러개 만드는 것보다,
	// 아래에 @Transient 어노테이션을 걸고 더 추가하는 것이 유지보수에 좋음
	
}

 

  • EmpDao.interface
package com.oracle.oBootMybatis01.dao;

public interface EmpDao {

	int			totalEmp();
}
  • EmpDaoImpl.class
    Tip)
    • SqlSession
      • JDBC가 DataSource, JPA가 EntityManager을 사용한다면, Mybatis는 SqlSession을 사용함
package com.oracle.oBootMybatis01.dao;

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

import lombok.RequiredArgsConstructor;

@Repository
@RequiredArgsConstructor
public class EmpDaoImpl implements EmpDao {
	// Mybatis DB 연동 
	private final SqlSession session;

	@Override
	public int totalEmp() {
		// TODO Auto-generated method stub
		return 0;
	}

}
  • EmpService.interface
package com.oracle.oBootMybatis01.service;

public interface EmpService {
	int			totalEmp();
}
  • EmpServiceImpl.class
package com.oracle.oBootMybatis01.service;

import org.springframework.stereotype.Service;

import com.oracle.oBootMybatis01.dao.EmpDao;

import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class EmpServiceImpl implements EmpService {
	
	private final EmpDao ed;

	@Override
	public int totalEmp() {
		// TODO Auto-generated method stub
		return 0;
	}

}
  • EmpController.class
package com.oracle.oBootMybatis01.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.oracle.oBootMybatis01.model.Emp;
import com.oracle.oBootMybatis01.service.EmpService;

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

@Controller
@RequiredArgsConstructor
@Slf4j
public class EmpController {
	
	private final EmpService es;
	
	@RequestMapping(value = "listEmpStart")
	public String listEmpStart(Emp emp, Model model) {
		System.out.println("EmpController Start listEmp...");
		
		model.addAttribute("tatalEmp", 5);
		return "list";
		
	}
	
}

 

  • header.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<link href="css/board.css" rel="stylesheet" type="text/css">
  • list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="header.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>회원관리 </h1>

	<h3>사원수 : ${totalEmp }</h3>
	
</body>
</html>
  • index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>회원 관리</h1>
	<a href="/listEmpStart">회원 목록(기본 CRUD)</a><p>
	
</body>
</html>

 

↳ ID는 user, PW는 Console에 나타나는 것으로 입력하기

  • SecurityConfiguration.class
package com.oracle.oBootMybatis01.configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfiguration {
	
	@Bean
	public BCryptPasswordEncoder encodePwd() {
		return new BCryptPasswordEncoder();
	}

//	@Bean
//	protected SecurityFilterChain filterChai(HttpSecurity http) throws Exception {
//		http.authorizeHttpRequests()
//			.anyRequest()
//			.permitAll()
//			;
//		return http.build();
//	}

	@Bean
	protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception  {
		
		 http
         .cors(cors -> cors.disable())
         .csrf(csrf -> csrf.disable());
		
		return http.build();
		
	}	


}

 

 


 (0808 일지 ~ 0809 일지)

2. 페이징 작업 - 메인 페이지 + List

  • Paging.class
package com.oracle.oBootMybatis01.service;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class Paging {
	
	private int currentPage	= 1;
	private int rowPage		= 10;
	private int pageBlock	= 10;
	private int start;			private int end;
	private int startPage;		private int endPage;
	private int total;			private int totalPage;
	
	public Paging(int total, String currentPage1) {
		this.total = total;		//20
		if (currentPage1 != null) {
			this.currentPage = Integer.parseInt(currentPage1);	//2
		}
		//				1				10
		start	= (currentPage - 1) * rowPage + 1;	// 시작시 1		11
		end		= start + rowPage - 1;				// 시작시 10	20
		//									20		10
		totalPage	= (int)Math.ceil((double)total / rowPage); // 시작시 3
		//					1				1			
		startPage	= currentPage - (currentPage - 1) % pageBlock; // 시작시 1
		endPage		= startPage + pageBlock - 1;	//10
		
	// ex:		10		14	
		if (endPage > totalPage) {
			endPage = totalPage;
		}

	}

}
  • application.yml
server:
  port: 8387
# Oracle Connect
spring:
  datasource:
    driver-class-name: oracle.jdbc.OracleDriver
    url: jdbc:oracle:thin:@localhost:1521/xe
    username: scott
    password: tiger
    
  #JPA Setting
  jpa:
    show-sql: true
    hibernate:
      ddl-auto: update

  # View Resolver
  mvc:
    view:
      prefix: /WEB-INF/views/
      suffix: .jsp     
      
  # Mybatis
mybatis:
  config-location: classpath:configuration.xml
  mapper-locations: classpath:mappers/*.xml
  • configuration.xml 
    Tip) http://mybatis.org에 들어가서 config.dtd를 검색해도 나옴
    • yml파일의 configuration.xml 설정과 연결됨
    • 여기서 기재했기 때문에 Emp.xml과 configuration.xml 이 연결되어, parameterType과  resultType을 길게 기재할 필요 없어짐
<?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"/>
	</typeAliases>
</configuration>

d

Download external resources like~ 에 체크해두면 빨간줄 안뜸

  • Emp.xml
    Tip)
    • id는 session의 mapper ID와 동일해야함
    • #{} 받고자 하는 필드명
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.oracle.oBootMybatis01.EmpMapper">

	<select id="empTotal" resultType="int">
	
		SELECT Count(*) FROM emp
	 
	</select>
	
	<select id="tkEmpListAll" parameterType="Emp" resultType="Emp">
	
	</select>
	
</mapper>

현장 HW 하기 전

  • +++ Emp.xml( 현장 HW)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.oracle.oBootMybatis01.EmpMapper">

	<select id="empTotal" resultType="int">
	
		SELECT Count(*) FROM emp
	 
	</select>
	
	<select id="tkEmpListAll" parameterType="Emp" resultType="Emp">
		SELECT*
		FROM
		(
    		SELECT rownum rn, a.*
   			FROM
        		(
           			SELECT * FROM emp
            		ORDER BY empno) a
    	)
   		WHERE rn BETWEEN #{start} and #{end}
	
	
	</select>
	
</mapper>

현장 HW 한 뒤

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

import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.oracle.oBootMybatis01.model.Emp;
import com.oracle.oBootMybatis01.service.EmpService;
import com.oracle.oBootMybatis01.service.Paging;

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

@Controller
@RequiredArgsConstructor
@Slf4j
public class EmpController {
	
	private final EmpService es;
	@RequestMapping(value = "listEmpStart")
	public String listEmpStart(Emp emp, Model model) {
		System.out.println("EmpController Start listEmp...");
		
		int totalEmp = es.totalEmp();		
		String currentPage = "1";
		
		// 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); 
		System.out.println("EmpController list listEmp.size()->"+listEmp.size());
		
		model.addAttribute("totalEmp", totalEmp);
		model.addAttribute("listEmp", listEmp);
		model.addAttribute("page", page);		
		
		return "list";
		
	}
	
}
  • EmpService.interface
package com.oracle.oBootMybatis01.service;

import java.util.List;

import com.oracle.oBootMybatis01.model.Emp;

public interface EmpService {
	int			totalEmp();

	List<Emp> 	listEmp(Emp emp);
	
}
  • EmpServiceImpl.class 
package com.oracle.oBootMybatis01.service;

import java.util.List;

import org.springframework.stereotype.Service;

import com.oracle.oBootMybatis01.dao.EmpDao;
import com.oracle.oBootMybatis01.model.Emp;

import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class EmpServiceImpl implements EmpService {
	
	private final EmpDao ed;

	@Override
	public int totalEmp() {
		System.out.println("EmpServiceImpl totalEmp Start...");
		
		int totEmpCnt = ed.totalEmp();
		System.out.println("EmpServiceImpl totalEmp totEmpCnt->"+totEmpCnt);
		
		return totEmpCnt;
	}

	@Override
	public List<Emp> listEmp(Emp emp) {
		List<Emp> empList = null;
		System.out.println("EmpServiceImpl listManager Start...");
		
		empList = ed.listEmp(emp);
		System.out.println("EmpServiceImpl listEmp empList.size()->"+empList.size()); 
		
		return empList;
	}

}
  • EmpDao.interface
package com.oracle.oBootMybatis01.dao;

import java.util.List;

import com.oracle.oBootMybatis01.model.Emp;

public interface EmpDao {

	int			totalEmp();

	List<Emp> 	listEmp(Emp emp);
}
  • EmpDaoImpl.class
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.Emp;

import lombok.RequiredArgsConstructor;

@Repository
@RequiredArgsConstructor
public class EmpDaoImpl implements EmpDao {
	// Mybatis DB 연동 
	private final SqlSession session;

	@Override
	public int totalEmp() {
		int totEmpCount = 0;
		System.out.println("EmpDaoImpl Start totalEmp...");
		
		try {
			totEmpCount = session.selectOne("com.oracle.oBootMybatis01.EmpMapper.empTotal");
			System.out.println("EmpDaoImpl totalEmp totEmpCount->"+totEmpCount);
			
		} catch (Exception e) {
			System.out.println("EmpDaoImpl totalEmp e.getMessage()->"+e.getMessage());
		}

		return totEmpCount;
	}

	@Override
	public List<Emp> listEmp(Emp emp) {
		List<Emp> empList = null;
		System.out.println("EmpDaoImpl listEmp Start...");
		
		try {
			// 					Map ID(Emp tag의 List) , parameter
			//				ID 이름은 유일해야함(unique)
			empList = session.selectList("tkEmpListAll", emp);
			System.out.println("EmpDaoImpl listEmp empList.size()->"+empList.size());
		} catch (Exception e) {
			System.out.println("EmpDaoImpl listEmp e.getMessage()->"+e.getMessage());
		}
		return empList;
	}

}

 

현장 HW 한 뒤 - 메인 페이지 완성


3. 페이징 작업 -  페이지 번호 작동

  • EmpController.class (현장 HW 1)
package com.oracle.oBootMybatis01.controller;

import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.oracle.oBootMybatis01.model.Emp;
import com.oracle.oBootMybatis01.service.EmpService;
import com.oracle.oBootMybatis01.service.Paging;

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

@Controller
@RequiredArgsConstructor
@Slf4j
public class EmpController {
	
	private final EmpService es;
	
	// 1.메인 페이지 + list 조회
	@RequestMapping(value = "listEmpStart")
	public String listEmpStart(Emp emp, Model model) {
		System.out.println("EmpController Start listEmp...");
		
		int totalEmp = es.totalEmp();		
		String currentPage = "1";
		
		// 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); 
		System.out.println("EmpController list listEmp.size()->"+listEmp.size());
		
		model.addAttribute("totalEmp", totalEmp);
		model.addAttribute("listEmp", listEmp);
		model.addAttribute("page", page);		
		
		return "list";
		
	}
	
	// 2. 페이지 번호 이동 
		@RequestMapping(value = "listEmp")
		public String listEmp(Emp emp, Model model) {
			System.out.println("EmpController Start listEmp...");
			
			// 20
			int totalEmp = es.totalEmp();		
			
			// Paging 작업
			Paging	page = new Paging(totalEmp, emp.getCurrentPage());
			
			// Parameter emp ==> Page만 추가 Setting
			emp.setStart(page.getStart());	// 시작시 1
			emp.setEnd(page.getEnd());	// 시작시 10
			
			List<Emp> listEmp = es.listEmp(emp); 
			System.out.println("EmpController list listEmp.size()->"+listEmp.size());
			
			model.addAttribute("totalEmp", totalEmp);
			model.addAttribute("listEmp", listEmp);
			model.addAttribute("page", page);		
			
			return "list";
		}
}

 


4. 페이지 조회

  • detailEmp.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="header.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>직원정보</h2>
	<table>
		<tr><th>사번</th><td>${emp.empno }</td></tr>
		<tr><th>이름</th><td>${emp.ename }</td></tr>
		<tr><th>업무</th><td>${emp.job }</td></tr>
		<tr><th>급여</th><td>${emp.sal }</td></tr>
		<tr><th>입사일</th><td>${emp.hiredate }</td></tr>
		<tr><th>보너스</th><td>${emp.comm }</td></tr>
		<tr><th>관리자사번</th><td>${emp.mgr }</td></tr>
		<tr><th>부서코드</th><td>${emp.deptno }</td></tr>
		
		<tr><td colspan="2">
			<input type="button" value="목록"
				onclick="location.href='listEmp'">
			<input type="button" value="수정"
				onclick="location.href='updateFormEmp?empno=${emp.empno}'">
			<input type="button" value="삭제"
				onclick="location.href='deleteEmp?empno=${emp.empno}'">
			</td>
		</tr>
	</table>

</body>
</html>

(현장 HW 2)

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

import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import com.oracle.oBootMybatis01.model.Emp;
import com.oracle.oBootMybatis01.service.EmpService;
import com.oracle.oBootMybatis01.service.Paging;

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

@Controller
@RequiredArgsConstructor
@Slf4j
public class EmpController {
	
	private final EmpService es;
	
	// 현장HW 2-1
	@GetMapping(value = "detailEmp")
	public String detailEmp(Emp emp1, Model model) {
		System.out.println("EmpController Start detailEmp...");

//		1. EmpService안에 detailEmp method 선언
//		   1) parameter : empno
//		   2) Return      Emp
//
//		2. EmpDao   detailEmp method 선언 
////		                    mapper ID   ,    Parameter
//		emp = session.selectOne("tkEmpSelOne",    empno);
		
		System.out.println("emp->"+emp1);
		Emp emp = es.detailEmp(emp1.getEmpno());
		model.addAttribute("emp", emp);
		
		return "detailEmp";
	}
}
  • EmpService.interface
package com.oracle.oBootMybatis01.service;

import java.util.List;

import com.oracle.oBootMybatis01.model.Emp;

public interface EmpService {
	int			totalEmp();
	List<Emp> 	listEmp(Emp emp);
	
	// 현장HW 2-2
	Emp 		detailEmp(int empno);
}
  • EmpServiceImpl.class 
package com.oracle.oBootMybatis01.service;

import java.util.List;

import org.springframework.stereotype.Service;

import com.oracle.oBootMybatis01.dao.EmpDao;
import com.oracle.oBootMybatis01.model.Emp;

import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class EmpServiceImpl implements EmpService {
	
	private final EmpDao ed;

	// 현장 HW 2-3
		//1. EmpService안에 detailEmp method 선언
		//	1) parameter : empno
		//	2) Return      Emp
	@Override
	public Emp detailEmp(int empno) {
		System.out.println("EmpServiceImpl detailEmp...");
		
		Emp emp = null;
		emp = ed.detailEmp(empno);
		System.out.println("EmpServiceImpl detailEmp emp->"+emp);
		
		return emp;

	}

}
  • EmpDao.interface
package com.oracle.oBootMybatis01.dao;

import java.util.List;

import com.oracle.oBootMybatis01.model.Emp;

public interface EmpDao {

	int			totalEmp();

	List<Emp> 	listEmp(Emp emp);
	
	// 현장 HW 2-4
	Emp 		detailEmp(int empno);
	
}
  • EmpDaoImpl.class
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.Emp;

import lombok.RequiredArgsConstructor;

@Repository
@RequiredArgsConstructor
public class EmpDaoImpl implements EmpDao {
	// Mybatis DB 연동 
	private final SqlSession session;

	// 현장 HW 2-5
		//	2. EmpDao   detailEmp method 선언 
		//						mapper ID   ,    Parameter
		// emp = session.selectOne("tkEmpSelOne",    empno);

	@Override
	public Emp detailEmp(int empno) {
		System.out.println("EmpDaoImpl detailEmp Start...");
		
		Emp emp = new Emp();
		try {
			//					mapper ID   ,    Parameter		
			emp = session.selectOne("tkEmpSelOne",empno);
			System.out.println("EmpDaoImpl detail getEname->"+emp.getEname());
		
		} catch (Exception e) {
			System.out.println("EmpDaoImpl detail Exception->"+e.getMessage());
		}
		return emp;
	}

}
  • Empno.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.oracle.oBootMybatis01.EmpMapper">

	<select id="tkEmpSelOne" parameterType="int" resultType="Emp">
		SELECT * EMP emp
		WHERE empno = #{empno}
	</select>
	
</mapper>


5. 게시판 내용 수정

  • updateFormEmp.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="header.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>직원정보</h2>
	<form action="updateEmp" method="post">
		<input type="hidden" name="empno" value="${emp.empno }">
		<table>
			<tr><th>사번</th><td>${emp.empno }</td></tr>
			<tr><th>이름</th><td>
					<input type="text" name="ename"	required="required" value="${emp.ename }"></td></tr>
			<tr><th>업무</th><td>
					<input type="text" name="job"	required="required" value="${emp.job }"></td></tr>
			<tr><th>급여</th><td>
					<input type="text" name="sal"	required="required" value="${emp.sal }"></td></tr>
			<tr><th>입사일</th><td>		
					<input type="date" name="hiredate"	id="hiredate" value="${emp.hiredate }"></td></tr>
					
			<tr><th>보너스</th><td>		
					<input type="number" name="comm" required="required" value="${emp.comm }"></td></tr>
			<tr><th>관리자사번</th><td>
					<input type="number" name="mgr" value="${emp.mgr }"></td></tr>
			<tr><th>부서코드</th><td>
					<input type="number" name="deptno"	required="required" value="${emp.deptno }"></td></tr>
		
			<tr>
				<td colspan="2">
					<input type="submit" value="확인"> 
				</td>
			</tr>	
		</table>
	</form>
</body>
</html>

(현장 HW 3)

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

import java.util.List;

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 org.springframework.web.bind.annotation.RequestMapping;

import com.oracle.oBootMybatis01.model.Emp;
import com.oracle.oBootMybatis01.service.EmpService;
import com.oracle.oBootMybatis01.service.Paging;

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

@Controller
@RequiredArgsConstructor
@Slf4j
public class EmpController {
	
	private final EmpService es;

	// 3. 게시판 내용 수정
	@GetMapping(value = "updateFormEmp")
	public String updateFormEmp(Emp emp1, Model model) {
		System.out.println("EmpController Start updateFormEmp...");
		
		Emp emp = es.detailEmp(emp1.getEmpno());
		System.out.println("EmpController updateFormEmp emp->"+emp);
		
		// 문제 
		// 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);
		}
		System.out.println("hiredate->"+hiredate);
		
		model.addAttribute("emp", emp);
		
		return "updateFormEmp";
	}

	// 현장HW 3-1
	//  1. EmpService안에 updateEmp method 선언
	//  1) parameter : Emp
	//  2) Return      updateCount (int)
	//
	//2. EmpDao updateEmp method 선언
	////                          mapper ID   ,    Parameter
	//updateCount = session.update("tkEmpUpdate",   emp);
	@PostMapping(value = "updateEmp")
	public String updateEmp(Emp emp, Model model) {
		log.info("updateEmp start...");
		
		int updateCount = es.updateEmp(emp);
		System.out.println("EmpController es.updateEmp updateCount->"+updateCount);
		
		model.addAttribute("upCnt",updateCount);	// Test Controller간 Data 전달
		model.addAttribute("kk3","Message Test");	// Test Controller간 Data 전달
		
	//	return "forward:listEmp"
		return "redirect:listEmp";
	}

}
  • EmpService.interface
package com.oracle.oBootMybatis01.service;

import java.util.List;

import com.oracle.oBootMybatis01.model.Emp;

public interface EmpService {
	int			totalEmp();
	List<Emp> 	listEmp(Emp emp);
	
	// 현장HW 2-2
	Emp 		detailEmp(int empno);
	// 현장HW 3-2
	int 		updateEmp(Emp emp);
}
  • EmpServiceImpl.class 
package com.oracle.oBootMybatis01.service;

import java.util.List;

import org.springframework.stereotype.Service;

import com.oracle.oBootMybatis01.dao.EmpDao;
import com.oracle.oBootMybatis01.model.Emp;

import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class EmpServiceImpl implements EmpService {
	
	private final EmpDao ed;

	// 현장 HW 3-3
	//  1. EmpService안에 updateEmp method 선언
	//  1) parameter : Emp
	//  2) Return      updateCount (int)

	@Override
	public int updateEmp(Emp emp) {
		System.out.println("EmpServiceImpl Update...");
		
		int updateCount = 0;
		updateCount = ed.updateEmp(emp);
		System.out.println("EmpServiceImpl updateEmp updateCount->"+updateCount);
		
		return updateCount;
	}

}
  • EmpDao.interface
package com.oracle.oBootMybatis01.dao;

import java.util.List;

import com.oracle.oBootMybatis01.model.Emp;

public interface EmpDao {

	int			totalEmp();

	List<Emp> 	listEmp(Emp emp);
	
	// 현장 HW 2-4
	Emp 		detailEmp(int empno);
	// 현장 HW 3-4
	int 		updateEmp(Emp emp);

	
}
  • EmpDaoImpl.class
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.Emp;

import lombok.RequiredArgsConstructor;

@Repository
@RequiredArgsConstructor
public class EmpDaoImpl implements EmpDao {
	// Mybatis DB 연동 
	private final SqlSession session;

	// 현장 HW 3-5
		//  2. EmpDao updateEmp method 선언
		//							mapper ID   ,    Parameter
		// updateCount = session.update("tkEmpUpdate",   emp);
		// model.addAttribute("upCnt",updateCount);	// Test Controller간 Data 전달됨
	@Override
	public int updateEmp(Emp emp) {
		System.out.println("EmpDaoImpl update Start...");
		
		int updateCount = 0;
		try {
			//						mapper ID   ,    Parameter		
			updateCount = session.update("tkEmpUpdate", emp);
		} catch (Exception e) {
			System.out.println("EmpDaoImpl updateEmp Exception->"+e.getMessage());
		}
		return updateCount;
	}

}
  • Empno.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.oracle.oBootMybatis01.EmpMapper">
	
	<update id="tkEmpUpdate" parameterType="Emp">
		UPDATE emp SET ename=#{ename}
					 , job=#{job}
					 , mgr=#{mgr}
					 , sal=#{sal}
					 , hiredate=#{hiredate}
					 , comm=#{comm}
					 , deptno=#{deptno}
		where empno = #{empno}
	</update>
	
</mapper>

 

Tip) Foreign Key인 부서코드가 SQL에서 null일 경우, 수정이 되지 않을 수 있다

때문에 게시판의 update 기능을 통해 코드를 입력해주어야 한다


 (0812 일지)

6. writeFormEmp =>  게시판 내용 새로 입력 + 메시지 전달

  • list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="header.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>회원관리 </h1>

	<a href="writeFormEmp">writeFormEmp 입력</a><p>
	<a href="writeFormEmp3">writeFormEmp3 입력(Validation)</a>

<h3>사원수 : ${totalEmp }</h3>
	<p>uptCnt	수정시 전달 Message : ${uptCnt} <p>
	<p>kk3		수정시 전달 Message : ${kk3}<p>

	<c:set var="num" value="${page.total-page.start+1 }"></c:set>		
	
	<table>
		<tr>
			<th>번호</th> <th>사번</th> <th>이름</th> 
			<th>업무</th> <th>급여</th>
		</tr>
		<c:forEach var="emp" items="${listEmp }">
			<tr>
				<td>${num }</td><td>${emp.empno }</td>
				<td><a href="detailEmp?empno=${emp.empno }">${emp.ename }</a></td>
				<td>${emp.job }</td><td>${emp.sal }</td>
			</tr>
			<c:set var="num" value="${num - 1 }"></c:set>
		</c:forEach>	
	</table>
	
	<c:if test="${page.startPage > page.pageBlock }">
		<a href="listEmp?currentPage=${page.startPage-page.pageBlock }">[이전]</a>	
	</c:if>
	<c:forEach var="i" begin="${page.startPage }" end="${page.endPage }">
		<a href="listEmp?currentPage=${i}">[${i}]</a>
	</c:forEach>
	
	<c:if test="${page.endPage < page.totalPage }">
		<a href="listEmp?currentPage=${page.startPage+page.pageBlock }">[다음]</a>
	</c:if>
</body>
</html>
  • EmpController.class
package com.oracle.oBootMybatis01.controller;

import java.util.List;

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 org.springframework.web.bind.annotation.RequestMapping;

import com.oracle.oBootMybatis01.model.Emp;
import com.oracle.oBootMybatis01.service.EmpService;
import com.oracle.oBootMybatis01.service.Paging;

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

@Controller
@RequiredArgsConstructor
@Slf4j
public class EmpController {
	
	private final EmpService es;
	

	// 3. 게시판 내용 수정
	@GetMapping(value = "updateFormEmp")
	public String updateFormEmp(Emp emp1, Model model) {
		System.out.println("EmpController Start updateFormEmp...");
		
		Emp emp = es.detailEmp(emp1.getEmpno());
		System.out.println("EmpController updateFormEmp emp->"+emp);
		
		// 문제 
		// 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);
		}
		System.out.println("hiredate->"+hiredate);
		
		model.addAttribute("emp", emp);
		
		return "updateFormEmp";
	}

	// 현장HW 3-1
	//  1. EmpService안에 updateEmp method 선언
	//  1) parameter : Emp
	//  2) Return      updateCount (int)
	//
	//2. EmpDao updateEmp method 선언
	////                          mapper ID   ,    Parameter
	//updateCount = session.update("tkEmpUpdate",   emp);
	@PostMapping(value = "updateEmp")
	public String updateEmp(Emp emp, Model model) {
		log.info("updateEmp start...");
		System.out.println("EmpController updateEmp emp->"+emp);
		
		int updateCount = es.updateEmp(emp);
		System.out.println("EmpController es.updateEmp updateCount->"+updateCount);
		
		model.addAttribute("upCnt",updateCount);	// Test Controller간 Data 전달
		model.addAttribute("kk3","Message Test");	// Test Controller간 Data 전달
		
		return "forward:listEmp";
		// return "redirect:listEmp";
	}



}
  • writeFormEmp.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="header.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>직원정보 입력</h2>
	<c:if test="${msg!=null}">${msg}</c:if>
		<form action="writeEmp" method="post" name="frm">
			<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"		required="required"></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="${emMngList}">
							<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>
</body>
</html>


1. writeFormEmp 눌렀을 때, 관리자사번 선택창 나오게 하기

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

import java.util.List;

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 org.springframework.web.bind.annotation.RequestMapping;

import com.oracle.oBootMybatis01.model.Emp;
import com.oracle.oBootMybatis01.service.EmpService;
import com.oracle.oBootMybatis01.service.Paging;

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

@Controller
@RequiredArgsConstructor
@Slf4j
public class EmpController {
	
	private final EmpService es;
		
		// (0812) 현장 HW 1
		// 1. service -> listManager
		// 2. Dao     -> listManager
		// 3. mapper  -> tkSelectManager
		System.out.println("EmpController writeForm empList.size()->"+empList.size());
		
		model.addAttribute("empMngList",empList);	// emp Manager List
		// 부서(코드,부서명)
		//	List<Dept> deptList = es.deptSelect(); 
		//	model.addAttribute("deptList", deptList); // dept
		//	System.out.println("EmpController writeForm deptList.size->"+deptList.size());
		
		return "writeFormEmp";
	}



}
  • EmpService.interface
package com.oracle.oBootMybatis01.service;

import java.util.List;

import com.oracle.oBootMybatis01.model.Emp;

public interface EmpService {
	int			totalEmp();
	List<Emp> 	listEmp(Emp emp);
	
	// (0809)현장HW 2-2
	Emp 		detailEmp(int empno);
	// (0809)현장HW 3-2
	int 		updateEmp(Emp emp);
	// (0812)현장 1-2
	List<Emp> 	listManager();
	
	
}
  • EmpServiceImpl.class 
package com.oracle.oBootMybatis01.service;

import java.util.List;

import org.springframework.stereotype.Service;

import com.oracle.oBootMybatis01.dao.EmpDao;
import com.oracle.oBootMybatis01.model.Emp;

import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class EmpServiceImpl implements EmpService {
	
	private final EmpDao ed;

	// (0812)현장 1-3
	@Override
	public List<Emp> listManager() {
		List<Emp> empList = null;
		System.out.println("EmpServiceImpl listManager start...");
		
		empList = ed.listManager();
		System.out.println("EmpServiceImpl listManager empList.size()->"+empList.size());
		
		return empList;
	}

	

}
  • EmpDao.interface
package com.oracle.oBootMybatis01.dao;

import java.util.List;

import com.oracle.oBootMybatis01.model.Emp;

public interface EmpDao {

	int			totalEmp();

	List<Emp> 	listEmp(Emp emp);
	
	// (0809)현장 HW 2-4
	Emp 		detailEmp(int empno);
	// (0809)현장 HW 3-4
	int 		updateEmp(Emp emp);
	// (0812)현장 1-4
	List<Emp> 	listManager();

	
}
  • EmpDaoImpl.class
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.Emp;

import lombok.RequiredArgsConstructor;

@Repository
@RequiredArgsConstructor
public class EmpDaoImpl implements EmpDao {
	// Mybatis DB 연동 
	private final SqlSession session;
	
	// (0812)현장 1-5
	@Override
	public List<Emp> listManager() {
		List<Emp> empList = null;
		System.out.println("EmpDaoImpl listManager Start...");
		
		try {
			//	emp 관리자만 Select			Naming Rule
			empList = session.selectList("tkSelectManager");
		
		} catch (Exception e) {
			System.out.println("EmpDaoImpl listManager Exception->"+e.getMessage());
		}
		
		return empList;
	}

}
  • Emp.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.oracle.oBootMybatis01.EmpMapper">
	
	<select id="tkSelectManager" resultType="Emp">
		SELECT	*
		FROM	emp
		WHERE	empno in (
							SELECT	mgr 
							FROM	emp
										)
		
	
	</select>
	
</mapper>


2. writeFormEmp 눌렀을 때, 부서코드 선택창 나오게 하기

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

import java.util.List;

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 org.springframework.web.bind.annotation.RequestMapping;

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

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

@Controller
@RequiredArgsConstructor
@Slf4j
public class EmpController {
	
	private final EmpService es;

	@RequestMapping(value = "writeFormEmp")
	public String writeFormEmp(Model model) {
		System.out.println("empController writeFormEmp Start...");
		
		// 관리자사번만 Get
		List<Emp> empList = es.listManager();
		
		// (0812) 현장 HW 1
		// 1. service -> listManager
		// 2. Dao     -> listManager
		// 3. mapper  -> tkSelectManager
		System.out.println("EmpController writeForm empList.size()->"+empList.size());
		
		model.addAttribute("empMngList",empList);	// emp Manager List
		// 부서(코드,부서명)
		List<Dept> deptList = es.deptSelect(); 
		model.addAttribute("deptList", deptList); // dept
		System.out.println("EmpController writeForm deptList.size->"+deptList.size());
		
		return "writeFormEmp";
	}



}
  • EmpService.interface
package com.oracle.oBootMybatis01.service;

import java.util.List;

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

public interface EmpService {
	int			totalEmp();
	List<Emp> 	listEmp(Emp emp);
	
	// (0809)현장HW 2-2
	Emp 		detailEmp(int empno);
	// (0809)현장HW 3-2
	int 		updateEmp(Emp emp);
	// (0812)현장 1-2
	List<Emp> 	listManager();
	
	List<Dept> deptSelect();
	
	
}
  • EmpServiceImpl.class
package com.oracle.oBootMybatis01.service;

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.Emp;

import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class EmpServiceImpl implements EmpService {
	
	private final EmpDao ed;
	private final DeptDao dd;
		// 서로 다른 Interface(DAO)를 받은 것이기 때문에 두 개 이상 가능 
	
	// (0812)현장 HW 2-1
	@Override
	public List<Dept> deptSelect() {
		List<Dept> deptList = null;
		System.out.println("EmpServiceImpl deptSelect Start...");
		
		deptList = dd.deptSelect();
		System.out.println("EmpServiceImpl deptSelect deptList.size()->"+deptList.size());
		
		return deptList;
	}

	

}
  • DeptDao.interface
package com.oracle.oBootMybatis01.dao;

import java.util.List;

import com.oracle.oBootMybatis01.model.Dept;

public interface DeptDao {
	List<Dept> deptSelect();

}
  • DeptDaoImpl.class
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.Dept;

import lombok.RequiredArgsConstructor;

@Repository
@RequiredArgsConstructor
public class DeptDaoImpl implements DeptDao {
	// Mybatis 연동
	private final SqlSession session;
	
	// (0812)현장 HW 2-2 
	@Override
	public List<Dept> deptSelect() {
		List<Dept> deptList = null;
		System.out.println("DeptDaoImpl deptSelect Start...");
		
		try {
									// ID: tkSelectDept
			deptList = session.selectList("tkSelectDept");
			
		} catch (Exception e) {
			System.out.println("DeptDaoImpl Exception Exception->"+e.getMessage());
		}
		return deptList;
	}

}
  • Dept.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.oracle.oBootMybatis01.DeptMapper">

	<select id="tkSelectDept" resultType="Dept">
		SELECT	* FROM	dept
	</select>

</mapper>


3. Submit(확인)버튼 눌렀을 때 이동될 창 만들기

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

import java.util.List;

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 org.springframework.web.bind.annotation.RequestMapping;

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

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

@Controller
@RequiredArgsConstructor
@Slf4j
public class EmpController {
	
	private final EmpService es;
	
	@RequestMapping(value = "writeFormEmp")
	public String writeFormEmp(Model model) {
		System.out.println("empController writeFormEmp Start...");
		
		// 관리자사번만 Get
		List<Emp> empList = es.listManager();
		
		// (0812) 현장 HW 1-1
		// 1. service -> listManager
		// 2. Dao     -> listManager
		// 3. mapper  -> tkSelectManager
		System.out.println("EmpController writeForm empList.size()->"+empList.size());
		
		model.addAttribute("empMngList",empList);	// emp Manager List
		// 부서(코드,부서명)
		List<Dept> deptList = es.deptSelect(); 
		model.addAttribute("deptList", deptList); // dept
		System.out.println("EmpController writeForm deptList.size->"+deptList.size());
		
		return "writeFormEmp";
	}

	@PostMapping(value = "writeEmp")
	public String writeEmp(Emp emp, Model model) {
		System.out.println("EmpController writeEmp Start...");
		
		// Service, Dao , Mapper명[insertEmp] 까지 -> insert
		int insertResult = es.insertEmp(emp);
		
		if (insertResult > 0)
			return "redirect:listEmp";
			// insertResult 1일때 입력 성공
		else {
			model.addAttribute("msg", "입력 실패. 확인해 보세요.");
			
			return "forward:writeFormEmp";
			// 입력 실패시 위의 writeFormEmp로 돌아가되 msg의 값을 가져가므로,
			// writeFormEmp의 <c:if test="${msg!=null}">${msg}</c:if> 값이 출력되어
			// 메시지가 나타남
		}
	}


}
  • EmpService.interface
package com.oracle.oBootMybatis01.service;

import java.util.List;

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

public interface EmpService {
	int			totalEmp();
	List<Emp> 	listEmp(Emp emp);
	
	// (0809)현장HW 2-2
	Emp 		detailEmp(int empno);
	// (0809)현장HW 3-2
	int 		updateEmp(Emp emp);
	// (0812)현장 1-2
	List<Emp> 	listManager();
	
	List<Dept> deptSelect();
	// (0812)현장 3-1
	int 		insertEmp(Emp emp);
	
	
}
  • EmpServiceImpl.class
package com.oracle.oBootMybatis01.service;

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.Emp;

import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class EmpServiceImpl implements EmpService {
	
	private final EmpDao ed;
	private final DeptDao dd;
		// 서로 다른 Interface(DAO)를 받은 것이기 때문에 두 개 이상 가능 

	// (0812)현장 3-2
	// Service, Dao , Mapper명[insertEmp] 까지 -> insert
	@Override
	public int insertEmp(Emp emp) {		
		int result = 0;
		System.out.println("EmpServiceImpl Insert Start...");
		result = ed.insertEmp(emp);
		
		return result;
	}
}
  • EmpDao.interface
package com.oracle.oBootMybatis01.dao;

import java.util.List;

import com.oracle.oBootMybatis01.model.Emp;

public interface EmpDao {

	int			totalEmp();

	List<Emp> 	listEmp(Emp emp);
	
	// (0809)현장 HW 2-4
	Emp 		detailEmp(int empno);
	// (0809)현장 HW 3-4
	int 		updateEmp(Emp emp);
	// (0812)현장 1-4
	List<Emp> 	listManager();
	
	// (0812)현장 3-3
	int 	insertEmp(Emp emp);

	
}
  • EmpDaoImpl.class
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.Emp;

import lombok.RequiredArgsConstructor;

@Repository
@RequiredArgsConstructor
public class EmpDaoImpl implements EmpDao {
	// Mybatis DB 연동 
	private final SqlSession session;

	// (0812)현장 3-4
	@Override
	public int insertEmp(Emp emp) {
		int result = 0;
		System.out.println("EmpDaoImpl insert Start...");
		
		try {
			result = session.insert("insertEmp", emp);
			
		} catch (Exception e) {
			System.out.println("EmpDaoImpl insertEmp Exception->"+e.getMessage());
		}
		
		return result;
	}

}
  • Emp.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.oracle.oBootMybatis01.EmpMapper">

	<insert id="insertEmp" parameterType="Emp">
		INSERT into emp values ( #{empno}, #{ename}, #{job}, #{mgr},
						  #{hiredate}, #{sal}, #{comm}, #{deptno}						
						) 
	</insert>
	
</mapper>

입력 실패시 작동되는 화면
입력 성공시 작동되는 화면


4. 중복확인 버튼 JSP 방식으로 작동되게 만들기

  • writeFormEmp.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="header.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<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>
</head>
<body>
<h2>직원정보 입력</h2>
	<c:if test="${msg!=null}">${msg}</c:if>
		<form action="writeEmp" method="post" name="frm">
			<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"		required="required"></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>
</body>
</html>
  • EmpController.class 
package com.oracle.oBootMybatis01.controller;

import java.util.List;

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 org.springframework.web.bind.annotation.RequestMapping;

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

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

@Controller
@RequiredArgsConstructor
@Slf4j
public class EmpController {
	
	private final EmpService es;

	@GetMapping(value = "confirm")
	public String confirm(Emp emp1, Model model) {
		Emp emp = es.detailEmp(emp1.getEmpno());
		model.addAttribute("empno", emp1.getEmpno());
		
		if (emp != null) {
			System.out.println("EmpController confirm 중복된 사번...");
			model.addAttribute("msg", "중복된 사번입니다");
			//return "forward:writeFormEmp";
			
		} else {
			System.out.println("EmpController confirm 사용 가능한 사번...");
			model.addAttribute("msg", "사용 가능한 사번입니다");
			//return "forward:writeFormEmp";
		}
		return "forward:writeFormEmp";
			// return을 최소화하여 효율성 높이기
		}
	}

}


7. 게시판 내용 삭제

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

import java.util.List;

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 org.springframework.web.bind.annotation.RequestMapping;

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

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

@Controller
@RequiredArgsConstructor
@Slf4j
public class EmpController {
	
	private final EmpService es;

	//  7. 데이터 삭제
	// Controller -->  deleteEmp    1.parameter : empno
		// name -> Service, dao , mapper
		// return -> listEmp
	@RequestMapping(value = "deleteEmp")
	public String deleteEmp(Emp emp, Model model) {
		System.out.println("EmpController delete Start...");
		
		int result = es.deleteEmp(emp.getEmpno());
		System.out.println("EmpController es.deleteEmp result->"+result);
		
		return "redirect:listEmp";
	}
	

}
  • EmpService.interface
package com.oracle.oBootMybatis01.service;

import java.util.List;

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

public interface EmpService {
	int			totalEmp();
	List<Emp> 	listEmp(Emp emp);
	
	// (0809)현장HW 2-2
	Emp 		detailEmp(int empno);
	// (0809)현장HW 3-2
	int 		updateEmp(Emp emp);
	// (0812)현장 1-2
	List<Emp> 	listManager();
	
	List<Dept> deptSelect();
	// (0812)현장 3-1
	int 		insertEmp(Emp emp);
	// (0812)현장 4-1
	int 		deleteEmp(int empno);
}
  • EmpServiceImpl.class
package com.oracle.oBootMybatis01.service;

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.Emp;

import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class EmpServiceImpl implements EmpService {
	
	private final EmpDao ed;
	private final DeptDao dd;
		// 서로 다른 Interface(DAO)를 받은 것이기 때문에 두 개 이상 가능 

	//  7. 데이터 삭제
	// (0812)현장 4-2
	@Override
	public int deleteEmp(int empno) {
		int result = 0;
		System.out.println("EmpServiceImpl delete Start...");
		
		result = ed.deleteEmp(empno);
		
		return empno;
	}

}
  •  EmpDao.interface
package com.oracle.oBootMybatis01.dao;

import java.util.List;

import com.oracle.oBootMybatis01.model.Emp;

public interface EmpDao {

	int			totalEmp();

	List<Emp> 	listEmp(Emp emp);
	
	// (0809)현장 HW 2-4
	Emp 		detailEmp(int empno);
	// (0809)현장 HW 3-4
	int 		updateEmp(Emp emp);
	// (0812)현장 1-4
	List<Emp> 	listManager();
	
	// (0812)현장 3-3
	int 		insertEmp(Emp emp);

	// (0812)현장 4-3
	int 		deleteEmp(int empno);
	
}
  • EmpDaoImpl.class
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.Emp;

import lombok.RequiredArgsConstructor;

@Repository
@RequiredArgsConstructor
public class EmpDaoImpl implements EmpDao {
	// Mybatis DB 연동 
	private final SqlSession session;

	//  7. 데이터 삭제
	// (0812)현장 4-4
	@Override
	public int deleteEmp(int empno) {
		System.out.println("EmpDaoImpl delete Start...");
		
		int result = 0;
		try {
			result = session.delete("deleteEmp", empno);
			System.out.println("EmpDaoImpl delete emp.->"+result);
			
		} catch (Exception e) {
			System.out.println("EmpDaoImpl delete Exception->"+e.getMessage());
		}
		
		return result;
	}
	
}
  • Emp.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.oracle.oBootMybatis01.EmpMapper">

	<delete id="deleteEmp" parameterType="int">
		DELETE FROM emp
		WHERE empno = #{empno}
	</delete>
	
</mapper>


질문목록

 


수업교재

05. Mybatis

 

3. spring ORM - myBatis와 Hibernate의 세부특징 비교 ⭐⭐⭐⭐

비교 Mybatis ⭐⭐⭐ Hiberate(JPA)
Mapping Partial Mapping Full Mapping
SQL 필요지식 상대적으로 높음 상대적으로 낮음
DML 적용 객체 Sql Session Entity Manager
적용 기법 SQL Mapper 객체단위
(Repositiry => Entity, Attribute => Table, Column)

오늘의 숙제

'Spring' 카테고리의 다른 글

2024_08_13_화  (0) 2024.08.13
2024_08_12_월  (0) 2024.08.12
2024_08_07_수~08_08_목  (0) 2024.08.07
2024_08_06_화~08_07_수  (0) 2024.08.06
2024_08_05_월~08_06_화  (0) 2024.08.05