본문 바로가기
Java Web Programming/6. Spring | MyBatis

[SpringMVC/MyBatis] SpringMVC 4.0 version 사용해보기 (+ Dynamic SQL - 동적 쿼리, 단위 테스트(JUnit))

by 파프리카_ 2020. 11. 12.
728x90
반응형

[ JUnit으로 단위 테스트 순서 ]

 

1. mapper.xml에 SQL문 작성

2. DAO와 DAOImpl에 메서드 작성

3. TestJUnit에서 JUnit 테스트 진행

4. 작동이 정상적으로 된다면, 문제 발생 시, model은 문제가 없는 것이니, controller나 view를 디버깅하면 된다.


[  Spring MVC Template의 디렉토리 계층 구조 ]

 

/src/main/java - model, controller

/src/main/resources : MyBaits 설정파일 (mapper.xml), log4j.xml

  * MyBatis 설정파일은 영속성 계층에 속하기 때문에 관례적으로 resource 폴더에 둔다.

/src/main/webapp/WEB-INF : DD(web.xml), Spring 설정파일(spring-model.xml, spring-web.xml)

/src/main/webapp/WEB-INF/views : 모든 jsp들

  *webapp/WEB-INF 아래에 DD와 Spring설정파일을 두는 이유 : FrontController 패턴을 정확하게 지키기 위해서

     → 모든 클라이언트의 요청을 하나의 진입점으로 받아, DispatcherServlet을 거친 후 응답하게 하기 위해서이다 (보안성 향상)

           : 모든 요청에 공통된 정책을 부여한다.

/src/test/java: - test class (Junit test)

/src/test/resources :  test를 위한 sql파일들,log4j.xml


문제

 

1번. 사원번호로 사원정보 조회

EmpControllerfindEmpByNo 메서드에서 요청에 대한 응답을 처리

/WEB-INF/views/findemp-ok.jsp에서 사원정보 제공하고,

사원정보가 존재하지 않으면, 

/WEB-INF/views/findemp-fail.jsp에서 '사원번호 [empno]에 해당하는 사원정보가 없습니다' alert 후,

home.jsp로 이동

 

2번. 사원 정보 목록 최신 등록 순으로 조회

findemp-list.jsp에서 사원명단을 제공한다. (table)

 

3번. 사원명이 포함된 사원 정보 조회 

동명이인이 있을 수 있으므로, SQL문에서 LIKE를 이용해서 조회해본다.

(진행 전에 table에 empname에 '제'가 포함된 row를 추가해준다.)

 

4번. 전체 부서 정보 목록 조회 

home.jsp에서 value에는 부서번호(deptno), text(화면)에는 부서명(dname)을 제공해준다.

메인화면(home.jsp)가 뜰 때 부서정보와 부서명이 와야하므로, 

HomeController에서 'home.do'가 실행될 때 진행된다.

 

5번. MyBatis Dynamic SQL (동적 SQL 쿼리) Test  : SQL 쿼리문을 동적으로 변경하여 사용하는 것이다.

<select id="[sql ID]" resultType="[return type]">
  <include refid="[select query id]"/>
  <where>
    <if test="[검색조건]">
    	[컬럼명] = #{인스턴스변수}
    </if>
    <if test="[인스턴스변수2]!=null and [인스턴스변수2]!=''">
    	AND [인스턴스변수2] LIKE '%' || #{[keyword]} || '%'
    </if>
  </where>
</select>

동적 쿼리를 이용해, 사원명, 부서명(value=부서번호)로 사원정보를 조회한다.

1) 검색 조건을 선택하지 않았을 경우 모두 조회

2) 사원명만 입력했을 경우 사원명으로 조회

3) 부서번호만 입력했을 경우 부서번호로 조회

4) 사원명과 부서번호를 입력했을 꼉우 사원명 and 부서번호로 조회


SQL (src/test/resource)

 

1. spring_department 테이블 - 부모 테이블  

 

2. spring_employment 테이블 - 자식 테이블


Maven pom 설정 

 

나의 개발환경에 맞게 몇가지 버전 수정 및 추가를 해주었다. (주석으로 기재되었습니다!)

/pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>org.kosta</groupId>
	<artifactId>springmvc8</artifactId>
	<name>springmvc8</name>
	<packaging>war</packaging>
	<version>1.0.0-BUILD-SNAPSHOT</version>
	<properties>
		<!-- 자바 버전(1.8) 수정 및 스프링 버전(4.3.14) 수정 -->
		<java-version>1.8</java-version>
		<org.springframework-version>4.3.14.RELEASE</org.springframework-version>
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
		<!-- Encoding 설정 (warning 방지) -->
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
	</properties>
	
	<dependencies>
		<!-- Spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework-version}</version>
			<exclusions>
				<!-- Exclude Commons Logging in favor of SLF4j -->
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>

		<!-- AspectJ -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>

		<!-- Logging -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${org.slf4j-version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.15</version>
			<exclusions>
				<exclusion>
					<groupId>javax.mail</groupId>
					<artifactId>mail</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.jms</groupId>
					<artifactId>jms</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jdmk</groupId>
					<artifactId>jmxtools</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jmx</groupId>
					<artifactId>jmxri</artifactId>
				</exclusion>
			</exclusions>
			<scope>runtime</scope>
		</dependency>

		<!-- @Inject -->
		<dependency>
			<groupId>javax.inject</groupId>
			<artifactId>javax.inject</artifactId>
			<version>1</version>
		</dependency>

		<!-- Servlet -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.1</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>

		<!-- Test: Junit (단위테스트) -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			 <!-- Spring4 버전과 연동하기 위해, 4.7 > 4.12로 업데이트 -->
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
		
		<!-- 라이브러리 추가 -->
		
		<!-- spring junit -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>

		<!-- dbcp2 , mybatis -->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-dbcp2</artifactId>
			<version>2.1.1</version>
		</dependency>

		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.4.0</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>

		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.3.0</version>
		</dependency>

		<!-- ajax , json -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.8.3</version>
		</dependency>

		<!-- aop -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.8.9</version>
		</dependency>
		
		<!-- 라이브러리 추가 끝-->
		
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<artifactId>maven-eclipse-plugin</artifactId>
				<version>2.9</version>
				<configuration>
					<additionalProjectnatures>
						<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
					</additionalProjectnatures>
					<additionalBuildcommands>
						<buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
					</additionalBuildcommands>
					<downloadSources>true</downloadSources>
					<downloadJavadocs>true</downloadJavadocs>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.5.1</version>
				<configuration>
					<!-- java 버전과 통일해줌 (1.6 > 1.8) -->
					<source>1.8</source>
					<target>1.8</target>
					<compilerArgument>-Xlint:all</compilerArgument>
					<showWarnings>true</showWarnings>
					<showDeprecation>true</showDeprecation>
				</configuration>
			</plugin>
			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>exec-maven-plugin</artifactId>
				<version>1.2.1</version>
				<configuration>
					<mainClass>org.test.int1.Main</mainClass>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

/src/main/webapp/WEB-INF 

 

DD (Deploytment Descriptor) 설정 

 

/WEB_INF/web.xml 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>myproject</display-name>
  <!-- 모든 요청은 .do 스타일로 받아와서,
       FrontController를 거친 후, 
       controller를 거쳐야만 jsp가 동작되도록한다 -->
  <welcome-file-list>
    <welcome-file>home.do</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- SerlvetConfig init param을 전달하여, Spring 설정을 로딩하게 한다. 
    	 : spring 설정은 /WEB-INF/sping-*.xml인 것으로 설정한다.-->
    <init-param>
    	<param-name>contextConfigLocation</param-name>
    	<param-value>/WEB-INF/spring-*.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  
  <!-- POST 방식에 대한 한글처리 -->
  <filter>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

Spring configure 설정 - spring 설정이 여러개 !

 

spring설정을 model과 web으로 구분하여 분리

 

* namespace에서 'context' 체크

* typeAliasesPackage 설정 시, project명을 기재해주어 경로설정에 주의한다.

 

/WEB_INF/spring-model.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
	
	<!-- 1. DBCP 설정 -->
	<bean id="dbcp" class="org.apache.commons.dbcp2.BasicDataSource">
		<property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
		<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:xe"/>
		<property name="username" value="scott"/>
		<property name="password" value="tiger"/>
	</bean>
	
	<!--2. SqlSessionFactory 설정 -->
	<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- DBCP(datebase connection pool) 주입 -->
		<property name="dataSource" ref="dbcp"/>
		<!-- MyBatis에서 쓸 mapper loation(path) 주입 -->
		<property name="mapperLocations" value="classpath:/mybatis/config/*.xml"/>
		<!-- Package에 별칭주기 
		 	 : project명을 기재해주어 경로설정에 주의한다.-->
		<property name="typeAliasesPackage" value="org.kosta.myapp.model"/>
		<!-- underScore 표기법을 Camel 표기법으로 mapping(변환)해주는 설정 -->
		<property name="configuration">
			<bean class="org.apache.ibatis.session.Configuration">
				<property name="mapUnderscoreToCamelCase" value="true"></property>
			</bean>
		</property>
	</bean>

	<!--3. SqlSessionTemplate설정 : 트랜잭션 제어를 지원-->
	<bean id="SqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg ref="sqlSessionFactoryBean"/>
	</bean>
	
	<!--4. IOC 설정 : <context:component-scan> :  IOC, DI, DL에 대한 설정-->
	<context:component-scan base-package="org.kosta"></context:component-scan>

</beans>

 

* namespace에서 'mvc' 체크

/WEB_INF/spring-web.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

	<!--5. SpringMVC 설정-->
	<mvc:annotation-driven/>

	<!--6. ViewResolver 설정 : client에게 응답하는 view에 대한 설정 -->
	<bean id="ViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/views/"/>
		<property name="suffix" value=".jsp"/>
	</bean>

</beans>

/src/main/webapp/WEB-INF/views

 

View

 

/home.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>My Project HOME</title>
</head>
<body>
	
</body>
</html>

 

/findemp-ok.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>사원 검색 결과</title>
</head>
<body>
	사원번호 : 	${requestScope.evo.empno}<br>
	이름 : 	${requestScope.evo.empname}<br>
	급여 : 	${requestScope.evo.sal}<br>
	부서번호 : 	${requestScope.evo.deptno}
</body>
</html>

 

/findemp-fail.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<script type="text/javascript">
	alert("사원번호 ${param.empno}에 해당하는 사원정보가 없습니다.");
	location.href = "${pageContext.request.contextPath}/home.do";
</script>

 

* bootstrap과 JSTL의 <c:foreach>를 적용하였다.

/findemp-list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- JSTL 선언부 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>사원정보 결과</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
  <h2>사원정보 목록</h2>
  <table class="table table-bordered">
    <thead>
      <tr>
        <th>사원번호</th>
        <th>사원명</th>
        <th>부서번호</th>
      </tr>
    </thead>
    <tbody>
    <c:forEach items="${requestScope.list}" var="evo">
      <tr>
        <td>${evo.empno}</td>
        <td>${evo.empname}</td>
        <td>${evo.deptno}</td>
      </tr>
    </c:forEach>	
    </tbody>
  </table>
</div>
</body>
</html>

/src/main/resources 

 

Log4j 설정 파일 -- 자동으로 생성된다.

 

*선언부 수정해주기

<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">

 

/log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

	<!-- Appenders -->
	<appender name="console" class="org.apache.log4j.ConsoleAppender">
		<param name="Target" value="System.out" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%-5p: %c - %m%n" />
		</layout>
	</appender>
	
	<!-- Application Loggers -->
	<logger name="org.kosta.myproject">
		<level value="warn" />
	</logger>
	
	<!-- 3rdparty Loggers -->
	<logger name="org.springframework.core">
		<level value="warn" />
	</logger>
	
	<logger name="org.springframework.beans">
		<level value="warn" />
	</logger>
	
	<logger name="org.springframework.context">
		<level value="warn" />
	</logger>

	<logger name="org.springframework.web">
		<level value="warn" />
	</logger>

	<!-- Root Logger -->
	<root>
		<priority value="warn" />
		<appender-ref ref="console" />
	</root>
	
</log4j:configuration>

MyBatis 설정 - mapper 

 

/mybatis.config/emp.xml

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

 	<sql id="selectEmp">
 		SELECT empno, empname, sal, deptno
		FROM   spring_employment
 	</sql>
 	
 	<sql id="selectEmp2">
		SELECT   empno, empname, deptno
		FROM     spring_employment
 	</sql>
 	
	<!-- 1. empno로 사원정보 찾기 -->
 	<select id="findEmpByNo" resultType="empVO">
 		<include refid="selectEmp"/>
 		WHERE  empno=#{value}
 	</select>
 	
 	<!-- 2. 전체 사원정보 목록 최신순으로 조회 -->
 	<select id="getAllEmpList" resultType="empVO">
 		<include refid="selectEmp2"/>
		ORDER BY empno DESC
 	</select>
 	
	<!-- 3. 사원명으로 사원 리스트 검색 (LIKE 함수) -->
 	<select id="findEmpListLikeEName" resultType="empVO">
 		<include refid="selectEmp2"/>
 		<!-- SQL문 : WHERE empname LIKE '%제%' -->
 		WHERE    empname LIKE '%' || #{value} || '%'
 	</select>
 	
 	<!-- 5. 동적 쿼리로 사원정보 검색 -->
 	<select id="findEmpListNameAndDeptno" resultType="empVO">
 		<include refid="selectEmp2"/>
 		<where>
 			<!-- [value]가 null이 아니고 공란이 아닐 때 -->
 			<!-- <if test="[검색조건]"> -->
 			<if test="deptno!=null and deptno!=''">
 				<!-- 컬럼명 = #{인스턴스변수} -->
 				deptno = #{deptno}
 			</if>
 			<if test="empname!=null and empname!=''">
 				AND empname LIKE '%' || #{empname} || '%'
 			</if>
 		</where>
 	</select>
</mapper>

 

/mybatis.config/dept.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- Sql Mapper -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dept">
	<!-- 전체 부서정보 조회 -->
 	<select id="getAllDeptList" resultType="DeptVO">
 		SELECT deptno, dname
 		FROM   spring_department 	
 	</select>
</mapper>

Model

 

/src/main/java/org.kosta.myproject.model

 

/EmpVO.java

package org.kosta.myproject.model;

public class EmpVO {
	private String empno;
	private String empname;
	private String sal;
	private String deptno;
	
	public EmpVO() {
		super();
	}

	public EmpVO(String empno, String empname, String sal, String deptno) {
		super();
		this.empno = empno;
		this.empname = empname;
		this.sal = sal;
		this.deptno = deptno;
	}

	public String getEmpno() {
		return empno;
	}

	public void setEmpno(String empno) {
		this.empno = empno;
	}

	public String getEmpname() {
		return empname;
	}

	public void setEmpname(String empname) {
		this.empname = empname;
	}

	public String getSal() {
		return sal;
	}

	public void setSal(String sal) {
		this.sal = sal;
	}

	public String getDeptno() {
		return deptno;
	}

	public void setDeptno(String deptno) {
		this.deptno = deptno;
	}

	@Override
	public String toString() {
		return "EmpVO [empno=" + empno + ", empname=" + empname + ", sal=" + sal + ", deptno=" + deptno + "]";
	}
}

/DeptVO.java

package org.kosta.myproject.model;

public class DeptVO {
	private String deptno;
	private String dname;
	private String loc;
	
	public DeptVO() {
		super();
	}

	public DeptVO(String deptno, String dname, String loc) {
		super();
		this.deptno = deptno;
		this.dname = dname;
		this.loc = loc;
	}

	public String getDeptno() {
		return deptno;
	}

	public void setDeptno(String deptno) {
		this.deptno = deptno;
	}

	public String getDname() {
		return dname;
	}

	public void setDname(String dname) {
		this.dname = dname;
	}

	public String getLoc() {
		return loc;
	}

	public void setLoc(String loc) {
		this.loc = loc;
	}

	@Override
	public String toString() {
		return "DeptVO [deptno=" + deptno + ", dname=" + dname + ", loc=" + loc + "]";
	}
	
}

/EmpDAO.java <<interface>>

package org.kosta.myproject.model;

import java.util.List;

public interface EmpDAO {

	EmpVO findEmpByNo(String empno);

	List<EmpVO> getAllEmpList();
	
	List<EmpVO> findEmpListLikeEName(String empname);

	List<EmpVO> findEmpListNameAndDeptno(EmpVO empVO);
}

 

/EmpDAOImpl.java

package org.kosta.myproject.model;

import java.util.List;

import javax.annotation.Resource;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class EmpDAOImpl implements EmpDAO {

	@Resource
	private SqlSessionTemplate template;
	
	// 1. 사원번호로 사원정보 찾기
	@Override
	public EmpVO findEmpByNo(String empno) {
		return template.selectOne("emp.findEmpByNo", empno);
	}
	
	// 2. 전체 사원정보 최신 등록 순으로 조회
	@Override
	public List<EmpVO> getAllEmpList(){
		return template.selectList("emp.getAllEmpList");
	}

	// 3. 사원명으로 사원 리스트 검색
	@Override
	public List<EmpVO> findEmpListLikeEName(String empname) {
		return template.selectList("emp.findEmpListLikeEName", empname);
	}
	
	// 5. 동적 쿼리를 이용해 사원 정보 검색 (부서 번호, 사원명)
	@Override
	public List<EmpVO> findEmpListNameAndDeptno(EmpVO empVO) {
		return template.selectList("emp.findEmpListNameAndDeptno", empVO);
	}
	
	
}

/DeptDAO.java <<interface>>

package org.kosta.myproject.model;

import java.util.List;

public interface DeptDAO {
	public List<DeptVO> getAllDeptList();
}

 

/DeptDAOImpl.java

package org.kosta.myproject.model;

import java.util.List;

import javax.annotation.Resource;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Repository;

@Repository
public class DeptDAOImpl implements DeptDAO {

	@Resource
	private SqlSessionTemplate template;

	// 4. 전체 부서정보 조회
	@Override
	public List<DeptVO> getAllDeptList() {
		return template.selectList("dept.getAllDeptList");
	}

}

Controller

 

/src/main/java/org.kosta.myproject.controller

 

/HomeController.java

package org.kosta.myproject.controller;


import java.util.List;

import javax.annotation.Resource;

import org.kosta.myproject.model.DeptDAO;
import org.kosta.myproject.model.DeptVO;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HomeController {
	
	@Resource
	private DeptDAO deptDAO;
	
	@RequestMapping("home.do")
	public ModelAndView home() {
		// 4. 전체 부서정보 조회
		List<DeptVO> deptList = deptDAO.getAllDeptList();
		//viewResolver에 의해 WEB-INF/views/home.jsp가 실행
		return new ModelAndView("home", "deptList", deptList);
	}
	
}

 

/EmpController.java

package org.kosta.myproject.controller;

import java.util.List;

import javax.annotation.Resource;

import org.kosta.myproject.model.EmpDAO;
import org.kosta.myproject.model.EmpVO;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class EmpController {
	@Resource
	private EmpDAO empDAO;
	
	// 1. 사원번호로 사원정보 찾기
	@RequestMapping("findEmpByNo.do")
	public String findEmpByNo(Model model, String empno) {
		String viewName="";
		EmpVO evo = empDAO.findEmpByNo(empno);
		if (evo != null) {
			viewName = "findemp-ok";
			model.addAttribute("evo", evo);
		} else
			viewName = "findemp-fail";
		return viewName;
	}
	
	// 2. 전체 사원정보 최신 등록 순으로 조회
	@RequestMapping("getAllEmpList.do")
	public ModelAndView getAllEmpList() {
		List<EmpVO> list = empDAO.getAllEmpList();
		return new ModelAndView("findemp-list", "list", list);
	}
	
	// 3. 사원명으로 사원 리스트 검색
	@RequestMapping("findEmpListLikeEName.do")
	public ModelAndView findEmpListByEName(String empname) {
		List<EmpVO> list = empDAO.findEmpListLikeEName(empname);
		//전체사원정보를 보여주는 view를 재활용할 수 있다.
		return new ModelAndView("findemp-list", "list", list);
	}
	
	// 5. 동적쿼리로 사원정보 검색
	@RequestMapping("findEmpListNameAndDeptno.do")
	public ModelAndView findEmpListNameAndDeptno(EmpVO empVO) {
		//아무 값도 입력하지 않고 submit하면 ""(공란)으로 값이 넘겨져온다
		//System.out.println(empVO.getEmpname().equals("")); 
		//System.out.println(empVO.getDeptno().equals(""));
		List<EmpVO> list = empDAO.findEmpListNameAndDeptno(empVO);
		return new ModelAndView("findemp-list", 
				"list", list);
	}

}

Test - 단위 테스트

 

/src/test/java/org.kosta.myproject

// JUnit에 red or green 결과가 나온다
Assert.assertEquals([기대값], [실제값])

// JUnit에 not null이라 확신되는 것을 적어 red or green 결과를 본다.
Assert.assertNotNull([확신값]);

 

/TestEmpJUnit.java

package org.kosta.myproject;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.kosta.myproject.model.DeptDAO;
import org.kosta.myproject.model.EmpDAO;
import org.kosta.myproject.model.EmpVO;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
//객체 테스트이기 때문에, <context:component-scan>이 있는 
//spring-model.xml을 locatios로 지정한다.
@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring-model.xml"})
public class TestEmpJUnit {
	
	@Resource
	private EmpDAO empDAO;
	@Resource
	private DeptDAO deptDAO;
	
	//@Test annotaion을 표시해준다.
	/*@Test
	public void empTest() {
		//Assert.assertEquals([기대값], [실제값])
		//Assert.assertNotNull([기대값]);
		
		//test1.
		//System.out.println(empDAO.findEmpByNo("1"));
		
		//test2.
		//System.out.println(empDAO.getAllEmpList());
		
		//test3.
		//System.out.println(empDAO.findEmpListLikeEName("제"));

		//test4.
		//System.out.println(deptDAO.getAllDeptList());
	}*/
	
	@Test
	public void dynamicSQLTest() {
		//test5.
		//5-1. 부서와 사원명을 입력하지 않았을 경우, 모두 조회
		EmpVO empVO = new EmpVO();
		//System.out.println(empDAO.findEmpListNameAndDeptno(empVO));
		
		//5-2. 부서 번호만 입력했을 경우, 해당 부서 사원만 조회
		EmpVO empVO1 = new EmpVO(null, null, null, "10");
		//System.out.println(empDAO.findEmpListNameAndDeptno(empVO1));
		
		//5-3. 사원명만 입력했을 경우, 사원명이 포함된 사원만 조회
		EmpVO empVO2 = new EmpVO(null, "제", null, null);
		//System.out.println(empDAO.findEmpListNameAndDeptno(empVO2));
		
		//5-4. 부서번호와 사원명 둘 다 입력했을 경우,
		//     부서번호와 사원명에 맞는 사원정보 조회
		EmpVO empVO3 = new EmpVO(null, "제", null, "10");
		System.out.println(empDAO.findEmpListNameAndDeptno(empVO3));
	}
}

[ Template 결과 화면 ] 

 

1. home.jsp 화면

 

2.  사원번호 입력 후, 사원 검색 결과

 

3.  없는 사원번호 입력 후, alert 후 home.do로 인해 home.jsp로 이동한다.

 

4.  '전체 사원 명단 조회' 링크 클릭하면, getAllEmpList.do로 이동해, findEmp-list.jsp가 작동된다.

 

5.  사원명에 '제'를 검색하면, 사원명에 '제'가 들어간 사원 목록이 조회된다.

 

6.  home화면에서 <select>에 부서명<option>이 나온다.

 

7.  아무 것도 입력하지 않고 '검색'을 누를 경우

 

8.  사원명만 입력하고 '검색'을 누를 경우 ('제'를 입력함)

 

9.  부서번호만 입력하고 '검색'을 누를 경우

 

10.  사원명과 부서번호를 입력하고 '검색'을 누를 경우 ('제'를 입력하고, '전략기획'을 선택함)

 

728x90
반응형