spring을 만들면서 아래 log4j.xml이 자동으로 만들어졌다. 그런데 x표시가 되고 있으므로 한번 살펴주도록 한다.
빨간 상자를 보면 PUBLIC으로 되어있어서 X표시가 되는 듯하다. 그래서 SYSTEM으로 바꿔주기로 한다.
아래 사진처럼 SYSTEM으로 바꿔주었다.
코드는 아래와 같으니 참고하도록 한다.
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
----------------------------------------------------------------------------------------------------------------------------------
어제 Mybatis에 대해서 배웠다. 그리고 dept와 관련된 MybatisDAO를 만들어 보았는데 이번에는 Emp와 관련된 MybatisDAO를 만들기 위해 empMapper.xml 부터 만들도록 하겠다.
그리고 아래와 같이 코드해주었다. 아래에서 parametertype을 map을 보낸 것이 있는데 그 이유는 조금 이다가 알아보도록 하겠다.
<?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">
<!-- namespace는 id를 접근할때 namespace를 붙이고 selectAll을 붙여서 충돌이 나지 않도록 할 수 있다. -->
<!-- 이름이 절대 충돌하지 않도록 하기위해서 보통회사 url을 사용한다. namespace="aa"라고 써도 된다.-->
<mapper namespace="com.kosta.emp">
<!--
<resultMap type="com.kosta.model.EmpVO" id="empResult"> 이렇게 쓰거나 아래 type="evo"
처럼 쓸수 있다. 별명을 주는게 좋긴하다. sqlConfig.xml에 별명을 따로 설정해주면 된다.
-->
<!-- db에있는 이름은 이건데 column은 이거다를 정의해준다. -->
<resultMap type="evo" id="empResult">
<!-- vo에 있는 이름이 다를경우 아래처럼 두개를 연결시켜줄수있다. -->
<result property="employee_id" column="employee_id"/>
<result property="first_name" column="first_name"/>
<result property="last_name" column="last_name"/>
<!-- 다른 이름들만 위처럼 매핑해주면 된다. -->
<!-- <result property="email" column="email"/>
<result property="phone_number" column="phone_number"/>
<result property="hire_date" column="hire_date"/>
<result property="job_id" column="job_id"/>
<result property="salary" column="salary"/>
<result property="commission_pct" column="commission_pct"/>
<result property="manager_id" column="manager_id"/>
<result property="department_id" column="department_id"/> -->
</resultMap>
<select id="loginChk" resultType="evo" parameterType="map">
<!-- key의 이름이 empidzz였다. -->
select * from employees
where employee_id = #{empidzz}
and email = #{emailzz}
</select>
<select id="selectAllJobs" resultType="jvo">
select * from jobs order by 1
</select>
<delete id="deleteEmp" parameterType="int">
delete from employees where employee_id = #{abcdefghigk}
</delete>
<update id="updateEmp11" parameterType="com.kosta.model.EmpVO">
update employees set
first_name = #{first_name},
last_name = #{last_name},
email = #{email},
phone_number = #{phone_number},
hire_date = #{hire_date},
job_id = #{job_id},
salary = #{salary},
commission_pct = #{commission_pct},
manager_id = #{manager_id},
department_id = #{department_id}
where employee_id = #{employee_id}
</update>
<insert id="insertemp" parameterType="evo">
insert into employees(employee_id,first_name,last_name,email,phone_number,hire_date,job_id,salary,commission_pct,manager_id,department_id)
values(
#{employee_id},
#{first_name},
#{last_name},
#{email},
#{phone_number, jdbcType=VARCHAR},
#{hire_date},
#{job_id},
#{salary},
#{commission_pct, jdbcType=DECIMAL},
#{manager_id},
#{department_id})
<!-- #{employee_id}는 getter에서 읽어오는것이다. -->
</insert>
<select id="selectAll" resultType="evo">
select * from employees order by 1
</select>
<select id="selectAllManager" resultType="com.kosta.model.ManagerVO">
select employee_id as manager_id, first_name||last_name fullname
from employees
where employee_id in (
select distinct manager_id
from employees)
</select>
<select id="selectAllDept" resultType="com.kosta.model.DeptVO">
select * from departments
</select>
<select id="selectById" resultType="evo" parameterType="int">
<!-- 들어오는게 하나이기 때문에 아무거나 적어도 된다. abc라고 넣었다. -->
select * from employees where employee_id = #{abc}
</select>
<select id="selectByDept" resultType="evo" parameterType="int">
<!-- 들어오는게 하나이기 때문에 아무거나 적어도 된다. 마음대로 적어보았다. -->
select * from employees where department_id = #{aabbccdd}
</select>
<select id="selectByjobid" resultType="evo" parameterType="int">
select * from employees where job_id = #{job_id}
</select>
<select id="selectBySalary" resultType="evo" parameterType="map">
select * from employees where salary between #{min} and #{max}
</select>
<select id="selectByHiredate" resultType="evo" parameterType="map">
select * from employees where hire_date between #{sdate} and #{edate}
</select>
<select id="selectByHiredate2" resultType="evo" parameterType="map">
select * from employees where hire_date between #{sdate} and #{edate}
</select>
<select id="selectByName" resultType="evo" parameterType="String">
select * from employees where first_name like #{aabbccddeeff}
</select>
</mapper>
위 코드에서 NAMESPACE를 붙이는 이유를 살펴보자면 아래 사진에 namespace라는 것을 붙여주어 id가 겹치더라도 해당 namespace에 맞는 select문이 실행되게 하기 위해서이다.
실제 위 empMapper를 사용할때, 아래 EmpDAOMybatis.java에서 다음과 같이 사용한다. 따라서 empMapper.xml에서 설정한 id가 겹치더라도 namespace가 다르기 때문에 다른 sql문이 실행될 수 있다.(이해를 돕기위해 완성된 부분중 한 곳을 캡쳐해온 상태이고 아직 EmpDAOMybatis.java를 만들지 않았다.)
지난 시간에 배웠던 것 처럼 필요하다면 별도의 별명을 sqlConfig.xml에서 설정할 수 있다. 추가 내용이 필요하다면 지난 시간에 배웠던 내용을 참고하도록 하자.
자 이제 EmpDAOMybatis.java를 만들어보도록 하자. 아래 사진처럼 com.kosta.business package아래에 EmpDAOMybatis를 만들어 주었다.
그리고 그 안에 아래와 같이 코드해주었다.
package com.kosta.business;
import java.sql.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.kosta.model.DeptVO;
import com.kosta.model.EmpVO;
import com.kosta.model.JobVO;
import com.kosta.model.ManagerVO;
@Repository
//이름을 안주면 아래 empDAOMybatis가 이름이 된다.
public class EmpDAOMybatis implements EmpDAOInterface{
@Autowired
SqlSession sqlsession;
String namespace="com.kosta.emp.";
Logger logger = LoggerFactory.getLogger(EmpDAOMybatis.class);
@Override
public EmpVO loginChk(int empid, String email) {
Map<String, Object> empInfo = new HashMap<String, Object>();
empInfo.put("empidzz", empid);
empInfo.put("emailzz", email);
//parameter를 한개밖에 못쓴다.sqlsession.selectOne(namespace+"loginChk",여기에하나만쓸수있다.)
EmpVO emp = sqlsession.selectOne(namespace+"loginChk",empInfo);
return emp;
}
@Override
public List<JobVO> selectAllJobs() {
List<JobVO> joblist = sqlsession.selectList(namespace+"selectAllJobs");
logger.info("{}건의 job이 있다.",joblist.size()); //placeholder
return joblist;
}
@Override
public int deleteEmp(int empid) {
int result = sqlsession.delete(namespace+"deleteEmp",empid);
logger.info("{}건 삭제",result);
return result;
}
@Override
public int updateEmp(EmpVO emp) {
int result = sqlsession.update(namespace+"updateEmp11",emp);
logger.info("{}건 수정",result);
return result;
}
@Override
public int insertemp(EmpVO emp) {
//emp.setPhone_number(null);
//null이라고 가정해서 전화번호가 없다고 가정해보자. 이때 mybatis는 어떻게 반응할까?
int result = sqlsession.insert(namespace+"insertemp",emp);
logger.info("{}건 입력",result);
return result;
}
@Override
public List<EmpVO> selectAll() {
List<EmpVO> emplist = sqlsession.selectList(namespace+"selectAll");
logger.info("{}건의 직원정보가 있다.",emplist.size());
return emplist;
}
@Override
public List<ManagerVO> selectAllManager() {
return sqlsession.selectList(namespace+"selectAllManager");
}
@Override
public List<DeptVO> selectAllDept() {
return sqlsession.selectList(namespace+"selectAllDept");
}
@Override
public EmpVO selectById(int empid) {
EmpVO emp = sqlsession.selectOne(namespace+"selectById",empid);
return emp;
}
@Override
public List<EmpVO> selectByDept(int deptid) {
List<EmpVO> emplist = sqlsession.selectList(namespace+"selectByDept",deptid);
logger.info("selectBydept: {}건이다.",emplist.size());
return emplist;
}
@Override
public List<EmpVO> selectByjobid(String jobid) {
return sqlsession.selectList(namespace+"selectByjobid",jobid);
}
@Override
public List<EmpVO> selectBySalary(int minsal, int maxsal) {
Map<String, Object> salmap = new HashMap<String, Object>();
salmap.put("min", minsal);
salmap.put("max", maxsal);
List<EmpVO> emplist = sqlsession.selectList(namespace+"selectBySalary",salmap);
logger.info("selectBySalary: {}건이다.",emplist.size());
return emplist;
}
@Override
public List<EmpVO> selectByHiredate(String sdate, String edate) {
Map<String, String> datemap = new HashMap<>();
datemap.put("sdate", sdate);
datemap.put("edate", edate);
List<EmpVO> emplist = sqlsession.selectList(namespace+"selectByHiredate",datemap);
logger.info("selectByHiredate: {}건이다.",emplist.size());
return emplist;
}
@Override
public List<EmpVO> selectByHiredate2(Date sdate, Date edate) {
Map<String, Date> datemap = new HashMap<>();
datemap.put("sdate", sdate);
datemap.put("edate", edate);
List<EmpVO> emplist = sqlsession.selectList(namespace+"selectByHiredate2",datemap);
logger.info("selectByHiredate2: {}건이다.",emplist.size());
return emplist;
}
@Override
public List<EmpVO> selectByName(String ch) {
List<EmpVO> emplist = sqlsession.selectList(namespace+"selectByName","%"+ch+"%");
logger.info("selectByName:{}건이다.",emplist.size());
return emplist;
}
@Override
public List<EmpVO> selectByCondition(int deptid, String jobid, int sal, Date hdate) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("deptid", deptid);
map.put("jobid", jobid);
map.put("sal", sal);
map.put("hdate", hdate);
List<EmpVO> emplist = sqlsession.selectList(namespace+"selectByCondition",map);
return emplist;
}
@Override
public List<EmpVO> selectBydeptmany(List<Integer> deptidList) {
List<EmpVO> emplist = sqlsession.selectList(namespace+"selectBydeptmany",deptidList);
return emplist;
}
}
구현한 메서드중 하나를 살펴보면 메서드 실행시 들어오는 파라미터 값을 MAP으로 담은 이유는 Sqlsession 객체 실행시 넘어갈 수 있는 paramter가 1개이기 때문이다.아래처럼 loginChk메서드가 실행되면 sqlsession이 mapper에서 해당 sql문을 찾는다.
아래 Mapper에 empInfo라고 담은 map이 넘어오게되고 받아온 parameter Map에서 #{key}라고 쓰면 value가 나오게 되고 value가 sql문에 들어가서 select문이 실행되고 evo를 반환하게 된다.
자 이제 EmpDAOMybatis를 EmpServiceImpl에서 읽어와서 사용하도록 해보겠다. EmpServiceImpl에서 EmpDAOMybatis를 읽어갈때 별도로 이름을 주지 않으면 class이름의 첫글자만 소문자로 바꾼것을 읽어간다.
그리고 EmpServiceImpl에서 EmpDAOMybatis를 dao로 읽어오기 위해서 @Qualifer를 사용해서 읽어왔다.
----------------------------------------------------------------------------------------------------------------------------------
자 이제 실제 실행을 해서 테스트를 해보도록 하겠다. 그전에 아래내용을 먼저 인지하고 테스트를 하도록 하겠다. empMapper.xml에 update를 아래와 같이 만들어주었다. update는 int를 반환하므로 별도의 resultType이 없다.
EmpDAOMybatis.java에서 아래 처럼 updateEmp를 사용했다. 바꿀 EmpVO를 인자로 받고 그 인자를 sqlsession.update시 파라미터로 보낸다. 그리고 그 결과는 int타입으로 출력된다.
그럼 이제 url로 실행시켜서 update를 테스트해보도록하자. EmpController.java에서 아래와 같이 구현되어있다.
Url에 emp/emplist.do를 하게되면 empservice.selectAll메서드를 실행하고 반환된 “emplist”를 emp폴더안에 emplist.jsp로 넘기게 된다.
emplist.jsp에서는 forEach문을 돌면서 emplist들을 <td></td>에 담아낸다. 그러면 아래 처럼 보이게된다.
잘 보면 직원 ID에 href가 걸린 것을 볼 수 있다. 이 href를 살펴보기 위해 emplist.jsp를 보면 parameter로 employee_id가 name = empid에 담겨 라는 empdetail.do url로 넘어가는 것을 볼 수 있다.
직원ID 하이퍼링크중 하나를 클릭하게되면 emplist.jsp에서 empid가 parameter로 empdetail.do로 넘어오고 empdetail.do에서는 이 empid로 emp를 찾는다. 그리고 이 emp와 dlist,jlist,mlist를 empdetail로 넘긴다.
그리고 empdetail.jsp를 살펴보면 다음과 같다.
empdetail.jsp 코드는 아래와 같다. jsp에서 input으로 되어 있는 곳은 emp에서 받아온 것들을 value에 그대로 보여주고 selectbox로 된 것은 전체 dlist,jlist,mlist중 emp와 일치하는 것은 selected되도록 코드되어있다.
<%@page import="com.kosta.model.EmpVO"%>
<%@page import="com.kosta.model.JobVO"%>
<%@page import="com.kosta.model.ManagerVO"%>
<%@page import="com.kosta.model.DeptVO"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<h1>직원정보 상세보기</h1>
<h1>${appInfo}</h1>
<jsp:include page="../common/header.jsp"></jsp:include>
<form id="myfrm" action="empdetail.do" method="post">
직원번호:<input type="number" name="employee_id" value="${emp.employee_id}" readonly="readonly"><br>
이름:<input type="text" name="last_name" value="${emp.last_name}"><br>
성:<input type="text" name="first_name" value="${emp.first_name}"><br>
급여:<input type="number" name="salary" value="${emp.salary}"><br>
부서:
<select name="department_id">
<c:set var="origindeptid" value="${emp.department_id}"/>
<c:forEach var="dept" items="${dlist}">
<option ${emp.department_id==dept.department_id?"selected":""} value ="${dept.department_id}">${dept.department_name}</option>
</c:forEach>
</select><br>
매니저ID:
<select name="manager_id">
<c:set var="originmanagerid" value="${emp.manager_id}"/>
<c:forEach var="manager" items="${mlist}">
<c:choose>
<c:when test="${originmanagerid eq manager.manager_id}">
<option selected value ="${manager.manager_id}">${manager.fullname}</option>
</c:when>
<c:otherwise>
<option value ="${manager.manager_id}">${manager.fullname}</option>
</c:otherwise>
</c:choose>
</c:forEach>
</select><br>
전화번호:<input type="text" name="phone_number" value="${emp.phone_number}"><br>
<img src="/webShop/upload/${emp.phone_number}">
커미션:<input type="text" name="commission_pct" value="${emp.commission_pct}"><br>
채용일:<input type="text" name="hire_date" value="${emp.hire_date}"><br>
직업ID:
<select name="job_id">
<c:set var="originjobid" value="${emp.job_id}"/>
<c:forEach var="job" items="${jlist}">
<c:choose>
<c:when test="${originjobid eq job.job_id}">
<option selected value ="${job.job_id}">${job.job_title}</option>
</c:when>
<c:otherwise>
<option value ="${job.job_id}">${job.job_title}</option>
</c:otherwise>
</c:choose>
</c:forEach>
</select><br>
이메일:<input type="text" name="email" value="${emp.email}"><br>
<input type="submit" value="수정하기">
<input type="button" id="btnUpdate" value="수정하기2">
<input type="button" id="btnUpdate2" value="수정하기(rest)">
<input type="button" id="btnRetrieve" value="전체직원조회하기">
<input type="button" id="btnDelete" value="삭제하기" mydata="${emp.employee_id}">
<input type="button" id="btnDelete2" value="삭제하기(rest)" mydata="${emp.employee_id}">
</form>
<script>
$(function(){
$("#btnUpdate").on("click",function(){
$("#myfrm").submit();
})
$("#btnRetrieve").on("click",function(){
location.href = "emplist.do";
})
$("#btnDelete").on("click",function(){
alert($(this).attr("mydata"));
location.href = "empdelete.do?empid="+$(this).attr("mydata");
})
$("#btnDelete2").on("click",function(){
alert($(this).attr("mydata"));
var url = "${pageContext.request.contextPath}/emp2/empDelete.do/"+$(this).attr("mydata");
$.ajax({
"url" : url,
type:"delete",
success:function(responseData){
alert(responseData);
}
});
});
$("#btnUpdate2").on("click",function(){
var emp = $("#myfrm").serializeArray();
alert(emp);
var object = {};
for (var i = 0; i < emp.length; i++){
object[emp[i]['name']] = emp[i]['value'];
}
var json = JSON.stringify(object);
alert(json);
$.ajax({url:"${pageContext.request.contextPath}/emp2/empUpdate.do",
type:"put",
data: json,
contentType:"application/json",
success:function(responseData){alert(responseData);}
});
});
});
</script>
</body>
</html>
실제 페이지는 아래 처럼 보이게 된다.
form코드를 잘 살펴보면 아래에 action= empdetail.do로 되어있어서 Submit이 실행되면 post방식으로 empdetail.do로 넘어가도록 되어있다.
그리고 아래에 input으로 submit이 있다.
수정하기 버튼을 눌러보자. 그러면 잘 실행되는 것을 확인할 수 있다.
-----------------------------------------------------------------------------------------------------------------------------------
이번에는 그럼 emplist.jsp에서 신규등록을 눌렀을때를 살펴보도록하자.
아래는 controller에 코드한 empInsert.do이다. empController는 @Autowired EmpService empservice; 되어있고 empservice에는 @Autowired@Qualifier("empDAOMybatis") EmpDAOInterface empDAO; 라고 코드되어 있어서 empDAOMybatis의 메서드가 실행되게 된다. 처음 insert를 누르면 일단 emp/empInsert.jsp로 가서 입력하는 form을 보여준다.
empInsert.jsp는 아래와 같다.
empInsert.jsp 코드는 아래와 같다.
<%@page import="com.kosta.model.DeptVO"%>
<%@page import="com.kosta.model.JobVO"%>
<%@page import="com.kosta.business.EmpDAO"%>
<%@page import="com.kosta.business.DeptDAO"%>
<%@page import="com.kosta.model.ManagerVO"%>
<%@page import="com.kosta.model.LocationVO"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
form{ border : 5px dotted green;}
</style>
</head>
<body>
<h1>직원 신규등록</h1>
<jsp:include page="../common/header.jsp"></jsp:include>
<h1>${appInfo}</h1>
<form action="empInsert.do" method="post">
직원번호:<input type="number" name="employee_id"><br>
이름:<input type="text" name="last_name"><br>
성:<input type="text" name="first_name"><br>
급여:<input type="number" name="salary" value="3000"><br>
부서명:
<select name="department_id">
<c:forEach var="dept" items="${dlist}">
<option value ="${dept.department_id}">${dept.department_name}</option>
</c:forEach>
</select><br>
매니저이름:
<select name="manager_id">
<c:forEach var="manager" items="${mlist}">
<option value ="${manager.manager_id}">${manager.fullname}</option>
</c:forEach>
</select><br>
전화번호:<!-- <input type="text" name="phone_number" value="010-515-511"> --><br>
커미션:<!-- <input type="text" name="commission_pct" value="0.1"> --><br>
채용일:<input type="text" name="hire_date" value="2021-01-03"><br>
직책명:
<select name="job_id">
<c:forEach var="job" items="${jlist}">
<option value ="${job.job_id}">${job.job_title}</option>
</c:forEach>
</select><br>
이메일:<input type="text" name="email" value="1234@naver.com"><br>
<!-- 20201년 4월 20일 15시 35분 사진업로드 -->
사진:
<input type="submit" value="입력하기">
</form>
</body>
</html>
신규로 등록할 직원의 정보를 입력하고 input submit을 누르면 post방식으로 empInsert.do URL로 넘어간다.
empInsert.do Post방식 URL은 EmpController에서 아래와 같이 코드해주었다.
EmpServiceImpl.java이 EmpDAOMybatis.java에 연결되어 있어 empDAO.insertemp를 하게되면 EmpDAOMybatis의 insertemp메서드가 실행된다.
그러면 아래 처럼EmpDAOMybatis의 insertemp 메서드가 실행된다. 그런데 insert 될때 일부러 null값을 넘기도록 하기 위해서 emp.setPhone_number(null);이라고 해보았다.
또는 전화번호가 들어가는 칸을 아예 막아버렸다. 이때도 넘어가는 값이 없기때문에 null일 것이다.
그러면 아래처럼 에러가 난다.
아래처럼 jdbcType=VARCHAR라고 써주면 phone_number가 null이어도 된다.
그런데 위에서 처럼 일일이 jdbcType=VARCHAR라고 써주는 것은 낭비이다. 그래서 sqlConfig.xml로 가서 아래처럼 적어주면 된다. 그러면 모두 jdbcType=VARCHAR와 같은 설정이 걸리게 된다.
잘되는지 확인하기위해서 전화번호, 커미션 둘다 주석처리해보았다. 그결과 잘 되는것을 확인했다.
아래처럼 일일이 넣는 방법도 있지만 위에서 사용한 방법이 더 좋다.
자 이번에는 empMapper.xml에서 아래와 같이 LoginChk를 만들었다.
그리고 EmpController.java에서 아래와 같이 만들어주었다. return 으로 emp.toString으로 하고 @ResponseBody를 사용해서 별도의 jsp를 만들지 않고 결과가 출력되도록 만들었다.
실행결과는 아래와 같다.
결과가 한글로 잘 출력되게 하고 싶다면 아래처럼 써주면 된다.
그런데 만약 emp가 JSON형태로 그대로 출력하게 만들고 싶다면 어떻게 해야할까? MavenRepository를 찾아가자.
아래 부분을 복사해서
pom.xml에 아래 사진과 같이 붙여넣어준다.
그리고 테스트를 위해서 login2.do를 controller에 만들어주었다. produces에 아래와 같이 적어서 실행했다.
그리고 login2.do를 아래와 같이 파라미터로 id=102&email=LDEHAAN이라고 넣으면 아래처럼 JSON으로 잘 출력되는 것을 확인할 수 있다.
이번에는 loginform.do를 만들어서 잘되는지 확인해보도록 하겠다.
loginform.jsp를만들어주었다. loginform.jsp에서 input submit버튼을 누르면 post방식으로 login3.do로 넘어가게 만들었었으나 수정으로 인해 아래 사진에서는 input submit과 form action에 login3.do를 볼수 없다..ㅠ
loginForm.jsp에서 로그인 버튼을 누르면 login3.do url로넘어가게 된다. 넘어간다음 loginChk메서드를 통해서 emp를 받아오는데 만약 일치하는게 있다면 emplist를 표시하게하고 없다면 loginForm.do로 돌아가 다시 로그인 하게 만들었다.
이번에는 @RestController를 사용해보도록 하겠다. LoginController.java를 별도로 만들어주었다.
@RestController는 Controller+ResponseBody이다. emp받아온 것을 전에 produces해주었던 것처럼 해주지 않아도 json으로 반환해서 표시해준다.
아래 emp/login.do는 위에서 비슷하게 테스트 했기에 emp/emplist.do만 테스트를 해보면 잘 출력되는 것을 확인할 수 있다.
참고로 아래처럼 정리되서 보이는 이유는 chrome에서 jsonview를 설치했기 때문이다.
이번에는 sql문을 동적으로 넣도록 만들어보겠다. empMapper에 아래처럼 selectByCondition을 추가해준다.
EmpDAOMybatis는 아래와 같이 코드해주었다. EmpDaoMybatis에는 아래처럼 메서드를 만들었다.
이제 Empcontroller를 보겠다. 잘 보면 파라미터로 form에서 받아올때 모두 String을 받아오게 했다. 왜냐하면 받아올때 입력하지 않으면 에러가 나서 넘어가지 않는다. 그래서 일단 String으로 모두 받아오고 null이 아니면 해당되는 타입으로 변환하여 service메서드의 매개변수로 넘기도록 했다.
테스트를 해보기 위해서 loginform.jsp에 아래와 같이 만들었다.
해당 조건에 해당하는 것만 잘 동적조회 되는 것을 확인 할 수 있다.
수업중간에 jdbcType=DATE를 추가해주셨는데..왜 추가하셨는지 기억이 나지 않는다. 최종 mapper는 위에 것인데 최종것을 보면 jdbcType=Date가 안들어가있다..
마이바티스 동적조회와 관련된 내용은 마이바티스 사이트에서 확인할수있다.
마지막으로 form에 값이 여러개 넘어올 때 어떻게 할 수 있는지 살펴보도록 한다.
dept_retrieve.jsp아 아래와 같이 form이 있는데 select문이 multiple로 여러 값이 선택될 수 있다.
empservice.selectBydeptmany 메서드의 흐름은 아래와 같다. 먼저 service로 가고 해당 메서드 찾는다.
그리고 empdaomybatis에서 해당 메서드를 찾는다.
empMapper.xml에서 아래처럼 해당 sql문을 실행하고 evo를 반환한다.그리고 return되어 다시 위로 올라간다.
그렇게 해서 emplist에 출력되면 아래와 같다. 해당부서의 직원리스트만 잘 출력되는 것을 볼수 있다.
끝~
'KOSTA' 카테고리의 다른 글
2021-05-14(금) kosta - 스프링수업 7일차(RESTFUL) (0) | 2021.05.17 |
---|---|
2021-05-13(목) kosta - 스프링수업 6일차(LOGGER,TRANSATION,RESTFUL) (0) | 2021.05.15 |
2021-05-11(화) kosta - 스프링수업 4일차(MYBATIS) (0) | 2021.05.12 |
2021-05-10(월) kosta - 스프링수업 3일차(@여러 어노테이션) (0) | 2021.05.10 |
2021-05-07(금) kosta - 스프링수업 2일차(AOP, Spring..) (0) | 2021.05.08 |