본문 바로가기

BE/Spring

[Spring] 단위 Test, 통합 Test ( Mock, @Transactional )

 

 

 

 

 

단위 Test, 통합 Test

 

Mock = Controller 를 전달 받아 대체

@Transactional = insert, delete 와 같은 쿼리문을 테스트한 뒤 다시 롤백하여 처음 상태로 돌려주는 어노테이션

memberMapper.xml 에 select 문 작성 ( 현재 가져올 컬럼 중 primary key 가 없기 때문에 모두 result 태그를 사용, 만약 가져오는 컬럼 중 primary 키가 있는 컬럼은 result 가 아닌 id 태그로 매핑해줘야 한다 )

result : primary key 가 아닌 컬럼 mapping

id : primary key 인 컬럼 mapping

 

DAO 에 select 문을 실행시킬 list 메소드 작성

 

TestMember.java 에서 단위 테스트 진행 ( DAO 만 실행 테스트 ) >> null 이 아니면 초록색 바

 

MemberService 인터페이스 작성 ( jsp 쪽으로 데이터 전달해 줄 것이므로 model 객체를 전송 ) >> MemberServiceImpl 에서는 해당 model 객체를 받아서 model 객체 안에 list 라는 이름으로 DAO 의 list 메소드가 반환한 값을 addAttribute 로 추가해준다

 

Controller 에서 Service 의 list 메소드 호출할때 model 객체 넘기는 코드 작성

 

통합 테스트 진행 >> 성공

 

index.jsp 작성 후 테스트 >> list 객체 잘 들어오며 사이즈와 데이터 값도 잘 출력되는 것 확인

 

기존 insert 경로는 데이터 추가 후 바로 jsp 파일을 출력해서 list 가 존재하지 않아 출력되지 않았는데 이를 출력해주기 위해 redirect 를 사용해서 클라이언트가 다시 요청해서 데이터를 받게끔 설정 >> 이렇게 리다이렉트를 설정해주면 통합 테스트에서 리다이렉트가 정상적으로 진행되는지를 따로 설정해주지 않으면 오류가 발생되므로 코드를 변경해준다

 

 

 

 

 


728x90

 

 

 

 

 

실습 예제

문제

( 비밀번호는 댓글 )

2_회원가입(JDBC_QUIZ).pdf
0.32MB

 

 

풀이

7_회원가입(JDBC_QUIZ)_3.pdf
0.94MB

 

 

예제 풀이 ( 프로젝트 기본 세팅 )

테이블 생성 및 데이터 삽입

 

Spring Legacy Project 생성

 

pom.xml 버전 설정 후 저장

 

메이븐 프로젝트 업데이트 ( 단축키 Alt + F5 ) >> JRE System Library 에 JavaSE 버전이 1.8 로 변경된 것 확인

※ 꼭 업데이트는 pom.xml 변경 후 저장한뒤 할 것 ※

 

HikariCP 라이브러리 추가

 

Spring JDBC 아무 버전이나 라이브러리 추가 >> 상단에 내가 사용중인 스프링 버전의 변수를 복사 >> 내 스프링 버전으로 변경

 

Oracle DB 버전 확인 후 라이브러리 추가 ( Oracle DB 버전이 11 버전 : ojdbc6 설치, Oracle DB 버전이 19 버전 이상 : ojdbc8 에 맞는 버전으로 설치 ) >> 나는 Oracle DB 버전이 19.3.0.0 버전이므로 ojdbc8 의 19.3.0.0 버전 라이브러리를 추가

 

MyBatis 버전 3.4.6 라이브러리 추가

 

MyBatis 와 Spring 을 연동시켜주는 MyBatis Spring 을 버전 1.3.2 로 설치

 

web.xml 파일에 한글 인코딩 에러 해결 코드 작성

 

Spring 인코딩 UTF-8 로 설정하는 코드

 

[Spring] 인코딩 설정, 포트 에러, Context 에러(경로 충돌 에러), 경로 설정, Controller

인코딩 설정, 포트 에러, Context 에러, 경로 설정, Controller ▼ 인코딩 해결 코드 ▼ 위 파일 내용 복사 후 진행 포트 충돌 에러가 발생하는 경우 경로 충돌 에러가 발생하는 경우 @Controller 어노테이

youngho3358.tistory.com

 

 

 

 

 

예제 풀이 ( 프로젝트 파일 세팅, Mapper 설정, 사용할 라이브러리들을 빈으로 등록 )

MemberMapper.xml 파일은 일반 xml 파일

 

jsp 파일 세팅

 

Mapper.xml 설정 코드

 

mybatis – 마이바티스 3 | 시작하기

 

mybatis.org

매핑된 SQL 구문 살펴보기 바로 하단에 있는 코드를 긁어와서 붙여넣으면 된다

 

위 링크에서 Mapper.xml 설정 코드 긁어와서 MemberMapper.xml 에 내용 작성 >>  필요없는 부분 삭제 및 namespace 를 현재 프로젝트의 MemberMapper 로 변경

 

root-context.xml 설정 ( Maven Dependencies 에 추가된 jar 파일 내에 있는 클래스들 중 사용할 것들을 빈 객체로 등록, 히카리 커넥션 풀을 빈으로 등록할때 DB 를 내 DB 의 정보로 변경한 뒤 올려준다 )

 

 

 

 

 

예제 풀이 ( 실제 구현 )

Controller 와 Service 에 어노테이션 추가 및 인터페이스 상속

 

DTO 에 컬럼 값과 동일한 변수 선언, getter / setter 설정

 

MemberMapper.xml 파일에서 DTO 의 변수와 OracleDB 의 컬럼을 resultMap 태그로 매핑해준다

 

기본 Controller 에 get 방식으로 index url 로 접속 시 index.jsp 출력하는 코드 작성

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<style type="text/css">
		ul li{ display:inline; padding:0 10px; }
	</style>
</head>
<body>
	<div align="center" >
		<h1 style="color:burlywood; font-size:60px; font-family:Gabriola;">
			CARE &nbsp; LAB
		</h1>
	</div>
	<div align="right">
		<hr>
		<ul>
			<li><a href="/root/index">HOME</a></li>
			<li><a href="/root/member/login">로그인</a></li>
		</ul>
		<hr>
	</div>
</body>
</html>

header.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div align="center" style="padding-top:100px;">
		<hr>
		<i style="color:pink; font-size:30px; font-family:Gabriola;">
			Copyright ⓒ CARE Lab. All rights reserved.
		</i>
	</div>
</body>
</html>

footer.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div align="center">
		<table>
			<tr>
				<td align="center">
					<h3>내 사전에 불가능은 없다.<br>
						불가능은 소극적인 자의 환영이며<br>
						비겁한 자의 도피처 이다.<br>
					</h3>
				</td>
			</tr>
			<tr>
				<td align="right">
					<h3>- 나폴레옹</h3>
				</td>
			</tr>
		</table>
	</div>
</body>
</html>

main.jsp

 

index.jsp 작성 ( header, main, footer 불러와서 사용 - jstl 사용 )

 

서버 작동 후 /root 경로 충돌로 인해 에러 발생

 

Servers - Tomcat v9.0 Server at localhost-config - server.xml 에서 동일 경로 주석처리 >> 웹 구동 확인

 

로그인 경로를 Controller 에 선언

 

Controller 에 선언 >> login.jsp 작성 >> 확인

 

<%@ 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>
</head>
<body>
	<c:import url="../default/header.jsp"/>
	<div align="center">
		<h1>로그인 페이지 입니다</h1>
	</div>
	<div align="right">
		<form action = " /root/member/user_check" method="post">
			<table>
				<tr>
					<td>
						<input type="text" name="id" placeholder="아이디">
					</td>
					<td rowspan="2">
						<input type="submit" value="로그인"style="width:60px;height:55px;">
					</td>
				</tr>
				<tr>
					<td>
						<input type="text" name="pw" placeholder="비밀번호">
					</td>
				</tr>
				<tr>
					<td colspan="2" align="left">회원가입</td>
				</tr>
			</table>
		</form>
	</div>
	<c:import url="../default/footer.jsp"/>
</body>
</html>

login.jsp

 

Controller 에 사용자가 아이디, 비밀번호 입력 시 이동될 user_check url 작성

 

MemberService 인터페이스에 user_check 메소드 선언 >> MemberServiceImpl 에서는 MemberMapper 를 통해 id 값에 해당하는 DB 저장 값을 가져와 DTO 에 저장하고 해당 값으로 입력된 비밀번호와 일치하면 0을 리턴, 아니면 1을 리턴한다

 

MemberMapper 인터페이스에 user_check 메소드를 추상화 >> MemberMapper.xml 에서 select 문을 작성 ( id : 메소드명, resultMap : 결과를 위에서 선언한 MemberDTO 형태로 매핑하여 가져오겠다는 뜻 )

 

session 의 값들을 처리할 인터페이스 생성 >> Controller 에서는 session 을 처리할 인터페이스인 MemberSessionName 을 상속받은 뒤 사용 >> successLogin.jsp 에서는 세션 값인 loginUser 를 출력 >> 결과

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90