<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>dbunit - Naver Ending Study</title>
	<atom:link href="https://nangchang.nes.or.kr/tag/dbunit/feed/" rel="self" type="application/rss+xml" />
	<link>https://nangchang.nes.or.kr</link>
	<description></description>
	<lastBuildDate>Fri, 08 Jun 2012 02:45:45 +0000</lastBuildDate>
	<language>ko-KR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8</generator>
	<item>
		<title>Spring, DbUnit 을 이용한 rollback test</title>
		<link>https://nangchang.nes.or.kr/spring-dbunit-%ec%9d%84-%ec%9d%b4%ec%9a%a9%ed%95%9c-rollback-test/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=spring-dbunit-%25ec%259d%2584-%25ec%259d%25b4%25ec%259a%25a9%25ed%2595%259c-rollback-test</link>
					<comments>https://nangchang.nes.or.kr/spring-dbunit-%ec%9d%84-%ec%9d%b4%ec%9a%a9%ed%95%9c-rollback-test/#respond</comments>
		
		<dc:creator><![CDATA[낭창]]></dc:creator>
		<pubDate>Fri, 08 Jun 2012 02:45:45 +0000</pubDate>
				<category><![CDATA[프로그래밍 이야기]]></category>
		<category><![CDATA[dbunit]]></category>
		<category><![CDATA[spring]]></category>
		<guid isPermaLink="false">http://nangchang.nes.or.kr/?p=483</guid>

					<description><![CDATA[<p>Spring으로 개발 중에 DbUnit을 이용해서 DAO 코드를 테스트 하고 있다.(Spring 3.1.0, DbUnit 2.4.8 사용 중이다) 책을 보다보니 rollback 테스트라는게 있어서 적용해 봤는데 잘 안되서 삽질 좀 했다=_= == rollback 테스트라는 개념은 테스트를 시작하기 전에 트랜잭션을 시작해 주고,테스트 종료 시 rollback 시켜 버리는 것이다.마지막에 rollback을 해버리니 테스트 중에 무슨 짓을 해버려도 상관없다. 심지어 데이터를 다 날려도..따로 [&#8230;]</p>
<p>The post <a href="https://nangchang.nes.or.kr/spring-dbunit-%ec%9d%84-%ec%9d%b4%ec%9a%a9%ed%95%9c-rollback-test/">Spring, DbUnit 을 이용한 rollback test</a> first appeared on <a href="https://nangchang.nes.or.kr">Naver Ending Study</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>Spring으로 개발 중에 DbUnit을 이용해서 DAO 코드를 테스트 하고 있다.<br />(Spring 3.1.0, DbUnit 2.4.8 사용 중이다)</p>
<p>책을 보다보니 rollback 테스트라는게 있어서 적용해 봤는데 잘 안되서 삽질 좀 했다=_=</p>
<p>==</p>
<p>rollback 테스트라는 개념은 테스트를 시작하기 전에 트랜잭션을 시작해 주고,<br />테스트 종료 시 rollback 시켜 버리는 것이다.<br />마지막에 rollback을 해버리니 테스트 중에 무슨 짓을 해버려도 상관없다. 심지어 데이터를 다 날려도..<br />따로 테스트 DB를 사용하지 않아도 되고, 같은 DB로 여러명이 동시에 테스트를 돌려도 서로<br />영향을 받지 않으니 꽤 유용할 거 같아서 적용을 해보기로 했다.</p>
<p>트랜잭션은 @Transactional 어노테이션을 사용해서 걸어준다.<br />우선 컨텍스트 설정 파일에 다음을 추가해 준다.</p>
<blockquote><p>&lt;tx:annotation-driven /&gt;</p></blockquote>
<p>그리고, Test 클래스에 @Transactional 을 붙여 준다.</p>
<blockquote><p>@RunWith(SpringJUnit4ClassRunner.class)<br />@ContextConfiguration(locations={&#8220;/z/y/x/test-context.xml&#8221;})<br /><strong>@Transactional</strong><br />public class AppDaoTest {<br />&#8230;</p></blockquote>
<p>그냥 요렇게만 붙여 주면, 마지막에 그냥 rollback이 된다고 한다.</p>
<blockquote><p>트랙잭션 시작 -&gt; @Before 매소드 실행 -&gt; @Test 매소드 실행 -&gt; @After 매소드 실행 -&gt; rollback</p></blockquote>
<p>요런 순서로 진행이 되므로, @Before가 붙은 매소드에서 데이터 초기화 등을 해주면 된다.<br />AOP로 트랜잭션을 쓸때는 괜찮았는데, 어노테이션으로 하니가 CGLIB가 필요해서 maven에 추가해줬다.</p>
<blockquote><p><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;dependency&gt;<br /><span class="Apple-tab-span" style="white-space:pre">			</span>&lt;groupId&gt;cglib&lt;/groupId&gt;<br /><span class="Apple-tab-span" style="white-space:pre">			</span>&lt;artifactId&gt;cglib&lt;/artifactId&gt;<br /><span class="Apple-tab-span" style="white-space:pre">			</span>&lt;version&gt;2.2.2&lt;/version&gt;<br /><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;/dependency&gt;</p></blockquote>
<p>다음으로, DbUnit 에서 Spring 에서 트랜잭션을 시작한 것과 동일한 커넥션을 사용하도록 해주는 것이 핵심인데,<br />여기서 문제가 발생해서 고생을 좀 했다.=_=<br />원래 IDatabaseTester 를 사용해서 테스트 중인데, 참고한 책이나 구글신께 물어 봐도 이거 말고 다른걸 사용한<br />예제가 많이 나온다. 난 그걸로 하니까 먼가 문제가 자꾸 생겨서 이걸로 테스트 중이다.<br />어쨌든, 중요한건 동일한 커넥션을 쓰면 되니까..</p>
<blockquote><p><span class="Apple-tab-span" style="white-space: pre; ">	</span>&nbsp;&#8230; </p>
<p><span class="Apple-tab-span" style="white-space:pre">	</span>@Inject<br /><span class="Apple-tab-span" style="white-space:pre">	</span>private DataSource dataSource;</p>
<p><span class="Apple-tab-span" style="white-space: pre; ">	</span>private IDatabaseTester databaseTester;<br /><br class="Apple-interchange-newline"><span class="Apple-tab-span" style="white-space: pre; ">	</span>@Before</p>
<p><span class="Apple-tab-span" style="white-space:pre">	</span>public void setUp() {</p>
<p><span class="Apple-tab-span" style="white-space:pre">			</span>final Connection conn = DataSourceUtils.getConnection(dataSource);<br /><span class="Apple-tab-span" style="white-space:pre">			</span>final DatabaseConnection dbConn = new DatabaseConnection(conn);<br /><span class="Apple-tab-span" style="white-space:pre">			</span><br /><span class="Apple-tab-span" style="white-space:pre">			</span>databaseTester = new DefaultDatabaseTester(dbConn);</p>
<p><span class="Apple-tab-span" style="white-space: pre; ">	</span><span class="Apple-tab-span" style="white-space:pre">		</span>databaseTester.setDataSet(getDataSet());<br /><span class="Apple-tab-span" style="white-space:pre">	</span><span class="Apple-tab-span" style="white-space: pre; ">	</span><span class="Apple-tab-span" style="white-space: pre; ">	</span>databaseTester.onSetup();<br /><span class="Apple-tab-span" style="white-space: pre; ">	</span>&nbsp;}</p>
<p><span class="Apple-tab-span" style="white-space: pre; ">	</span>&nbsp;&#8230;</p></blockquote>
<p>dataSource 를 inject 받은 다음에 connection을 외부에서 받아서 쓰는 DefaultDatabaseTester 객체를 만들었다.<br />DefaultDatabaseTester 는 커넥션을 만드는 방법은 모르고, 단지 외부에서 받은 커넥션을 사용할 뿐이다.</p>
<p>자.. 이제 테스트를 돌리면&#8230; 전부 실패=_=<br />이런..도대체 머가 문제지? 메시지를 보면 죄다 커넥션이 이미 close 됐다는 에러다. <br />헉.. 도저히 알 수 없는 상황;;;;</p>
<p>이런 저런 삽질하다가, 메시지를 자세히 살펴보니&#8230; setUp()은 정상적으로 진행되고, 그 다음에 에러가 나는거 같다.<br />그럼, setUp() 후에 커넥션이 닫혔다는 말인데&#8230; 도저히 이해가 안되는 상황&#8230; <br />DefaultDatabaseTester &nbsp;를 쓰면 안되는가 싶어서 다른 것도 써보고, 이래저래 찾아 봤지만.. 미궁 속이다.</p>
<p>결국 log4jdbc 디버그 메시지를 찍고 DbUnit 소스까지 뒤져서 알아낸 사실은&#8230;</p>
<p>DefaultDatabaseTester.onSetup() 호출 마지막에 커넥션을 닫아 버린다는것=_=;;;</p>
<p>DefaultDatabaseTester는 AbstractDatabaseTester를 상속하고, AbstractDatabaseTester에서는<br />IOperationListener 를 사용해서 커넥션을 가져온 후, onSetUp() 호출 후, onTearDown() 호출 후 작업을 처리한다.<br />여기서 디폴트로 쓰는 리스너가 DefaultOperationListener 인데, 얘는, onSetUp(), onTearDown() 후 무조건<br />커넥션을 종료하도록 되어 있는 것이다;;</p>
<p>외부에서 커넥션을 받아쓰는 DefaultDatabaseTester 에서 이 동작을 오버라이딩 안 했다는건<br />좀 이해하기 어려운데.. 버그인지 먼지 모르겠지만.. 어쨌든 안되면 바꿔야지=_=<br />다행히(?) IOperationListener는 변경이 가능하다.</p>
<p>그래서, 아무것도 안하는 DummyOperationListener를 정의해 주고,</p>
<blockquote><p><span class="Apple-tab-span" style="white-space:pre">	</span>private class DummyOperationListener implements IOperationListener {<br /><span class="Apple-tab-span" style="white-space:pre">		</span>@Override<br /><span class="Apple-tab-span" style="white-space:pre">		</span>public void connectionRetrieved(IDatabaseConnection connection) {<br /><span class="Apple-tab-span" style="white-space:pre">			</span>// do nothing<span class="Apple-tab-span" style="white-space:pre">			</span><br /><span class="Apple-tab-span" style="white-space:pre">		</span>}</p>
<p><span class="Apple-tab-span" style="white-space:pre">		</span>@Override<br /><span class="Apple-tab-span" style="white-space:pre">		</span>public void operationSetUpFinished(IDatabaseConnection connection) {<br /><span class="Apple-tab-span" style="white-space:pre">			</span>// do nothing<span class="Apple-tab-span" style="white-space:pre">			</span><br /><span class="Apple-tab-span" style="white-space:pre">		</span>}</p>
<p><span class="Apple-tab-span" style="white-space:pre">		</span>@Override<br /><span class="Apple-tab-span" style="white-space:pre">		</span>public void operationTearDownFinished(IDatabaseConnection connection) {<br /><span class="Apple-tab-span" style="white-space:pre">			</span>// do nothing<span class="Apple-tab-span" style="white-space:pre">			</span><br /><span class="Apple-tab-span" style="white-space:pre">		</span>}<br /><span class="Apple-tab-span" style="white-space:pre">	</span>}</p></blockquote>
<p>IDatabaseTester 객체 생성 후, operation listener로 설정해 줬다.</p>
<blockquote>
<div><span class="Apple-tab-span" style="white-space: pre; ">	</span>&nbsp;&#8230; </p>
<p><span class="Apple-tab-span" style="white-space: pre; ">	</span>@Inject<br /><span class="Apple-tab-span" style="white-space: pre; ">	</span>private DataSource dataSource;<br /><span class="Apple-tab-span" style="white-space: pre; ">	</span>private IDatabaseTester databaseTester;<br /><br class="Apple-interchange-newline"><br /><span class="Apple-tab-span" style="white-space: pre; ">	</span>@Before<br /><span class="Apple-tab-span" style="white-space: pre; ">	</span>public void setUp() {</p>
<p><span class="Apple-tab-span" style="white-space: pre; ">			</span>final Connection conn = DataSourceUtils.getConnection(dataSource);<br /><span class="Apple-tab-span" style="white-space: pre; ">			</span>final DatabaseConnection dbConn = new DatabaseConnection(conn);<br /><span class="Apple-tab-span" style="white-space: pre; ">			</span><br /><span class="Apple-tab-span" style="white-space: pre; ">			</span>databaseTester = new DefaultDatabaseTester(dbConn);<span class="Apple-tab-span" style="white-space: pre; ">			</span><strong>databaseTester.setOperationListener(new DummyOperationListener());</strong></p>
<p><span class="Apple-tab-span" style="white-space: pre; ">	</span><span class="Apple-tab-span" style="white-space: pre; ">		</span>databaseTester.setDataSet(getDataSet());<br /><span class="Apple-tab-span" style="white-space: pre; ">	</span><span class="Apple-tab-span" style="white-space: pre; ">	</span><span class="Apple-tab-span" style="white-space: pre; ">	</span>databaseTester.onSetup();<br /><span class="Apple-tab-span" style="white-space: pre; ">	</span>&nbsp;}</p>
<p><span class="Apple-tab-span" style="white-space: pre; ">	</span>&nbsp;&#8230;</div>
</blockquote>
<p>이제 테스트를 돌려보면&#8230; 짜잔~ 성공.</p><p>The post <a href="https://nangchang.nes.or.kr/spring-dbunit-%ec%9d%84-%ec%9d%b4%ec%9a%a9%ed%95%9c-rollback-test/">Spring, DbUnit 을 이용한 rollback test</a> first appeared on <a href="https://nangchang.nes.or.kr">Naver Ending Study</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://nangchang.nes.or.kr/spring-dbunit-%ec%9d%84-%ec%9d%b4%ec%9a%a9%ed%95%9c-rollback-test/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
