<?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>spring - Naver Ending Study</title>
	<atom:link href="https://nangchang.nes.or.kr/tag/spring/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>
		<item>
		<title>Spring + Mybatis + tomcat 사용 중 &#8220;심각: Error listenerStar&#8221; 오류</title>
		<link>https://nangchang.nes.or.kr/error/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=error</link>
					<comments>https://nangchang.nes.or.kr/error/#comments</comments>
		
		<dc:creator><![CDATA[낭창]]></dc:creator>
		<pubDate>Mon, 04 Jun 2012 14:18:35 +0000</pubDate>
				<category><![CDATA[프로그래밍 이야기]]></category>
		<category><![CDATA[mybatis]]></category>
		<category><![CDATA[spring]]></category>
		<category><![CDATA[tomcat]]></category>
		<guid isPermaLink="false">http://nangchang.nes.or.kr/?p=481</guid>

					<description><![CDATA[<p>아아 삽질의 연속 ㅠ.ㅜ JDK 7, Spring 3.1, Mybatis, 3.1, tomcat 7, Ubuntu 12.04 사용 중이다.로컬에서 Eclipse+tomcat 으로 개발 하던 어플리케이션을 서버에 배치해서 테스트 하려고 작업을 했다.서버 설치도 다 됐고, 서버에 war 파일 올렸는데, 어플리케이션 시작이 안된다=_=tomcat 로그에 찍히는 에러 메시지는 다음과 같이 달랑 한줄;; 2012. 6. 4 오후 11:06:18 org.apache.catalina.startup.HostConfig deployWAR정보: Deploying web application [&#8230;]</p>
<p>The post <a href="https://nangchang.nes.or.kr/error/">Spring + Mybatis + tomcat 사용 중 “심각: Error listenerStar” 오류</a> first appeared on <a href="https://nangchang.nes.or.kr">Naver Ending Study</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>아아 삽질의 연속 ㅠ.ㅜ </p>
<p>JDK 7, Spring 3.1, Mybatis, 3.1, tomcat 7, Ubuntu 12.04 사용 중이다.<br />로컬에서 Eclipse+tomcat 으로 개발 하던 어플리케이션을 서버에 배치해서 테스트 하려고 작업을 했다.<br />서버 설치도 다 됐고, 서버에 war 파일 올렸는데, 어플리케이션 시작이 안된다=_=<br />tomcat 로그에 찍히는 에러 메시지는 다음과 같이 달랑 한줄;;</p>
<blockquote><p>2012. 6. 4 오후 11:06:18 org.apache.catalina.startup.HostConfig deployWAR<br />정보: Deploying web application archive /var/lib/tomcat7/webapps/app.war<br />2012. 6. 4 오후 11:06:20 org.apache.catalina.core.StandardContext startInternal<br /><strong>심각: Error listenerStart</strong><br />2012. 6. 4 오후 11:06:20 org.apache.catalina.core.StandardContext startInternal<br />심각: Context [/app] startup failed due to previous errors<br />2012. 6. 4 오후 11:06:20 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc</p></blockquote>
<p>도저히 이유를 알 수 없는 난감한 상황인데.. 구글신께 물어보니 spring 설정이 잘 못된 경우 저 에러가<br />날 수 있단다. 로컬에서는 잘됐는데 설정이 이상할리가.. 라고 생각했지만&#8230; <br />결국 설정을 하나씩 지워가며 테스트 했는데, mybatis 쪽 설정 의심되는 상황.<br />정확한 오류를 알 수 없어 전전긍긍하면서, 로그도 제대로 안 찍어 주는 tomcat를 원망하다 문득 깨달았다.<br />spring mvc template으로 프로젝트를 생성하면 log4j 설정이 console 로 로그를 출력하도록 한다는걸=_=<br />그래서 즉시 파일로 출력하도록 설정을 수정했다.</p>
<blockquote><p>&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;UTF-8&#8243;?&gt;</p>
<p>&lt;!DOCTYPE log4j:configuration PUBLIC &#8220;-//APACHE//DTD LOG4J 1.2//EN&#8221; &#8220;log4j.dtd&#8221;&gt;<br />&lt;log4j:configuration xmlns:log4j=&#8221;http://jakarta.apache.org/log4j/&#8221;&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;!&#8211; Appenders &#8211;&gt;<br /><strong>&nbsp; &nbsp; &nbsp; &nbsp; &lt;appender name=&#8221;fileLog&#8221; class=&#8221;org.apache.log4j.DailyRollingFileAppender&#8221;&gt;</strong><br /><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;param name=&#8221;File&#8221; value=&#8221;/var/lib/tomcat7/webapps/app/log/app.log&#8221; /&gt;</strong><br /><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;param name=&#8221;Append&#8221; value=&#8221;true&#8221; /&gt;</strong><br /><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;layout class=&#8221;org.apache.log4j.PatternLayout&#8221;&gt;</strong><br /><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;param name=&#8221;ConversionPattern&#8221; value=&#8221;%-5p: %c &#8211; %m%n&#8221; /&gt;</strong><br /><strong>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/layout&gt;</strong><br /><strong>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/appender&gt;</strong></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;!&#8211; Application Loggers &#8211;&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &lt;logger name=&#8221;z.y.x&#8221;&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;level value=&#8221;debug&#8221; /&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &lt;/logger&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;!&#8211; 3rdparty Loggers &#8211;&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &lt;logger name=&#8221;org.springframework.core&#8221;&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;level value=&#8221;debug&#8221; /&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &lt;/logger&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;logger name=&#8221;org.springframework.beans&#8221;&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;level value=&#8221;debug&#8221; /&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &lt;/logger&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;logger name=&#8221;org.springframework.context&#8221;&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;level value=&#8221;debug&#8221; /&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &lt;/logger&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;logger name=&#8221;org.springframework.web&#8221;&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;level value=&#8221;debug&#8221; /&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &lt;/logger&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &lt;!&#8211; Root Logger &#8211;&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &lt;root&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;priority value=&#8221;debug&#8221; /&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;appender-ref ref=&#8221;fileLog&#8221; /&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &lt;/root&gt;</p>
<p>&lt;/log4j:configuration&gt;</p></blockquote>
<p>엉엉.. 로그가 정말 잘 찍힌다ㅜ.ㅜ</p>
<blockquote><p>ERROR: org.springframework.web.context.ContextLoader &#8211; Context initialization failed<br />org.springframework.beans.factory.CannotLoadBeanClassException: Error loading class [z.y.x.service.UserServiceImpl] for bean with name &#8216;userServiceImpl&#8217; defined in file [/var/lib/tomcat7/webapps/hadpan_web/WEB-INF/classes/z/y/x/service/UserServiceImpl.class]: problem with class file or dependent class; nested exception is java.lang.UnsupportedClassVersionError: z/y/x/service/UserServiceImpl : <strong>Unsupported major.minor version 51.0 </strong>(unable to load class z.y.x.service.UserServiceImpl)<br />&nbsp; &nbsp; &nbsp; &nbsp; at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1265)</p></blockquote>
<p>음.. 예상과 달리 직접적으로 mybatis 관련된쪽은 아닌데&#8230; Unspported major.minor version 어쩌고 하는 메시지가 보인다.<br />또 구글신께 물어 봤지. 자바 버전 차이에 의해 발생할 수 있는 에러란다.<br />아.. 어플리케이션을 자바7으로 빌드했는데, tomcat7은 JRE6 에서 돌아가고 있었던 거다.</p>
<p>사용 중인 Ubuntu 서버의 tomcat7 실행 스크립트를 보니 다음과 같은 부분이 있다.</p>
<p></p>
<ul>
<li>/etc/init.d/tomcat7</li>
</ul>
<blockquote><p>JDK_DIRS=&#8221;<strong>/usr/lib/jvm/default-java</strong> ${OPENJDKS} /usr/lib/jvm/java-6-openjdk /usr/lib/jvm/java-6-sun&#8221;</p>
<p># Look for the right JVM to use<br />for jdir in $JDK_DIRS; do<br />&nbsp; &nbsp; if [ -r &#8220;$jdir/bin/java&#8221; -a -z &#8220;${JAVA_HOME}&#8221; ]; then<br />&nbsp; &nbsp; &nbsp; &nbsp; JAVA_HOME=&#8221;$jdir&#8221;<br />&nbsp; &nbsp; fi<br />done<br />export JAVA_HOME</p></blockquote>
<p>/usr/lib/jvm/default-java 라는 디렉토리가 있으면 젤 먼저 거기를 JAVA_HOME으로 지정하게 되어있다.<br />해당 파일을 확인해 보니 역시나 버전이 6이다.</p>
<blockquote><p>$ ls -l default-java<br />lrwxrwxrwx 1 root root 23 &nbsp;6월 &nbsp;4 23:10 default-java -&gt; java-1.6.0-openjdk-i386</p></blockquote>
<p>버전 7를 사용하도록 심볼릭 링크를 바꿔줬다.</p>
<blockquote><p>$ rm default-java<br />$ ln -s java-1.7.0-openjdk-i386 default-java</p></blockquote>
<p>그리고 tomcat 재실행.</p>
<blockquote><p>$ service tomcat7 restart </p></blockquote>
<p>멀쩡하게 실행이 되는 구나 ㅜ.ㅠ</p><p>The post <a href="https://nangchang.nes.or.kr/error/">Spring + Mybatis + tomcat 사용 중 “심각: Error listenerStar” 오류</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/error/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Spring 에서 Transaction 설정 시 Service 레벨에서 적용 안되는 문제</title>
		<link>https://nangchang.nes.or.kr/spring-%ec%97%90%ec%84%9c-transaction-%ec%84%a4%ec%a0%95-%ec%8b%9c-service-%eb%a0%88%eb%b2%a8%ec%97%90%ec%84%9c-%ec%a0%81%ec%9a%a9-%ec%95%88%eb%90%98%eb%8a%94-%eb%ac%b8%ec%a0%9c/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=spring-%25ec%2597%2590%25ec%2584%259c-transaction-%25ec%2584%25a4%25ec%25a0%2595-%25ec%258b%259c-service-%25eb%25a0%2588%25eb%25b2%25a8%25ec%2597%2590%25ec%2584%259c-%25ec%25a0%2581%25ec%259a%25a9-%25ec%2595%2588%25eb%2590%2598%25eb%258a%2594-%25eb%25ac%25b8%25ec%25a0%259c</link>
					<comments>https://nangchang.nes.or.kr/spring-%ec%97%90%ec%84%9c-transaction-%ec%84%a4%ec%a0%95-%ec%8b%9c-service-%eb%a0%88%eb%b2%a8%ec%97%90%ec%84%9c-%ec%a0%81%ec%9a%a9-%ec%95%88%eb%90%98%eb%8a%94-%eb%ac%b8%ec%a0%9c/#respond</comments>
		
		<dc:creator><![CDATA[낭창]]></dc:creator>
		<pubDate>Fri, 01 Jun 2012 02:54:20 +0000</pubDate>
				<category><![CDATA[프로그래밍 이야기]]></category>
		<category><![CDATA[spring]]></category>
		<guid isPermaLink="false">http://nangchang.nes.or.kr/?p=480</guid>

					<description><![CDATA[<p>요즘 뒤늦게 spring을 쓴다고 삽질에 여념이 없다=_=어제는 Transaction 설정을 추가했는데, 이럴수가 적용이 안되는 것이다;;;STS에서 transaction 표시도 잘 되고, 설정은 몇 번이나 검토해도 틀린게 없는데 말이다. maven을 위해 pom.xml에 다음과 같이 추가해 주고 &#60;dependency&#62; &#60;groupId&#62;org.springframework&#60;/groupId&#62; &#60;artifactId&#62;spring-tx&#60;/artifactId&#62; &#60;version&#62;${org.springframework-version}&#60;/version&#62; &#60;/dependency&#62; &#60;dependency&#62; &#60;groupId&#62;org.aspectj&#60;/groupId&#62; &#60;artifactId&#62;aspectjweaver&#60;/artifactId&#62; &#60;version&#62;1.5.4&#60;/version&#62; &#60;/dependency&#62; 다음과 같이 spring 에 data source, transaction manager 빈을 추가하고,service 클래스에서 transaction 이 [&#8230;]</p>
<p>The post <a href="https://nangchang.nes.or.kr/spring-%ec%97%90%ec%84%9c-transaction-%ec%84%a4%ec%a0%95-%ec%8b%9c-service-%eb%a0%88%eb%b2%a8%ec%97%90%ec%84%9c-%ec%a0%81%ec%9a%a9-%ec%95%88%eb%90%98%eb%8a%94-%eb%ac%b8%ec%a0%9c/">Spring 에서 Transaction 설정 시 Service 레벨에서 적용 안되는 문제</a> first appeared on <a href="https://nangchang.nes.or.kr">Naver Ending Study</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>요즘 뒤늦게 spring을 쓴다고 삽질에 여념이 없다=_=<br />어제는 Transaction 설정을 추가했는데, 이럴수가 적용이 안되는 것이다;;;<br />STS에서 transaction 표시도 잘 되고, 설정은 몇 번이나 검토해도 틀린게 없는데 말이다.</p>
<p>maven을 위해 pom.xml에 다음과 같이 추가해 주고</p>
<div>
<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;org.springframework&lt;/groupId&gt;<br /><span class="Apple-tab-span" style="white-space:pre">			</span>&lt;artifactId&gt;spring-tx&lt;/artifactId&gt;<br /><span class="Apple-tab-span" style="white-space:pre">			</span>&lt;version&gt;${org.springframework-version}&lt;/version&gt;<br /><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;dependency&gt;<br /><span class="Apple-tab-span" style="white-space:pre">			</span>&lt;groupId&gt;org.aspectj&lt;/groupId&gt;<br /><span class="Apple-tab-span" style="white-space:pre">			</span>&lt;artifactId&gt;aspectjweaver&lt;/artifactId&gt;<br /><span class="Apple-tab-span" style="white-space:pre">			</span>&lt;version&gt;1.5.4&lt;/version&gt;<br /><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;/dependency&gt;</p></blockquote>
<p>다음과 같이 spring 에 data source, transaction manager 빈을 추가하고,<br />service 클래스에서 transaction 이 사용하도록 설정을 했다. </p>
<blockquote><p><span class="Apple-tab-span" style="white-space: pre; ">	</span>&lt;!&#8211; data source &#8211;&gt;<br /><span class="Apple-tab-span" style="white-space:pre">	</span>&lt;bean id=&#8221;dataSource&#8221; class=&#8221;org.apache.commons.dbcp.BasicDataSource&#8221;&gt;<br /><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;property name=&#8221;driverClassName&#8221; value=&#8221;net.sf.log4jdbc.DriverSpy&#8221; /&gt;<br /><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;property name=&#8221;url&#8221; value=&#8221;jdbc:log4jdbc:postgresql://192.168.0.12:5432/db&#8221; /&gt;<br /><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;property name=&#8221;username&#8221; value=&#8221;user&#8221; /&gt;<br /><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;property name=&#8221;password&#8221; value=&#8221;passwd&#8221; /&gt;<br /><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;property name=&#8221;initialSize&#8221; value=&#8221;3&#8243; /&gt;<br /><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;property name=&#8221;maxActive&#8221; value=&#8221;10&#8243; /&gt;<br /><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;property name=&#8221;maxWait&#8221; value=&#8221;3000&#8243; /&gt;<br /><span class="Apple-tab-span" style="white-space:pre">	</span>&lt;/bean&gt;</p>
<p><span class="Apple-tab-span" style="white-space:pre">	</span>&lt;!&#8211; transaction manager &#8211;&gt;<br /><span class="Apple-tab-span" style="white-space:pre">	</span>&lt;bean id=&#8221;transactionManager&#8221;<br /><span class="Apple-tab-span" style="white-space:pre">		</span>class=&#8221;org.springframework.jdbc.datasource.DataSourceTransactionManager&#8221;&gt;<br /><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;property name=&#8221;dataSource&#8221; ref=&#8221;dataSource&#8221; /&gt;<br /><span class="Apple-tab-span" style="white-space:pre">	</span>&lt;/bean&gt;</p></blockquote>
<blockquote><p><span class="Apple-tab-span" style="white-space:pre">	</span>&lt;!&#8211; &nbsp;transaction setting &#8211;&gt;<br /><span class="Apple-tab-span" style="white-space:pre">	</span>&lt;tx:advice id=&#8221;txAdvice&#8221; transaction-manager=&#8221;transactionManager&#8221;&gt;<br /><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;tx:attributes&gt;<br /><span class="Apple-tab-span" style="white-space:pre">			</span>&lt;tx:method name=&#8221;get*&#8221; read-only=&#8221;true&#8221; /&gt;<br /><span class="Apple-tab-span" style="white-space:pre">			</span>&lt;tx:method name=&#8221;list*&#8221; read-only=&#8221;true&#8221; /&gt;<br /><span class="Apple-tab-span" style="white-space:pre">			</span>&lt;tx:method name=&#8221;find*&#8221; read-only=&#8221;true&#8221; /&gt;<br /><span class="Apple-tab-span" style="white-space:pre">			</span>&lt;tx:method name=&#8221;*&#8221; /&gt;<br /><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;/tx:attributes&gt;<br /><span class="Apple-tab-span" style="white-space:pre">	</span>&lt;/tx:advice&gt;<br /><span class="Apple-tab-span" style="white-space:pre">	</span><br /><span class="Apple-tab-span" style="white-space:pre">	</span>&lt;aop:config&gt;<br /><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;aop:advisor advice-ref=&#8221;txAdvice&#8221; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
pointcut=&#8221;execution(* com.acroem.hadpan.service.*Service.*(..))&#8221; /&gt; <br /><span class="Apple-tab-span" style="white-space:pre">	</span>&lt;/aop:config&gt;</p></blockquote>
<p>그리고, MyBatis와 연동해서 쓰는지라 다음과 같이 MyBatis 설정도 추가했다.</p>
<blockquote><p><span class="Apple-tab-span" style="white-space: pre; ">	</span>&lt;bean id=&#8221;sqlSessionFactory&#8221; class=&#8221;org.mybatis.spring.SqlSessionFactoryBean&#8221;&gt;<br /><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;property name=&#8221;dataSource&#8221; ref=&#8221;dataSource&#8221; /&gt;<br /><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;property name=&#8221;typeAliasesPackage&#8221; value=&#8221;z.y.x.bean&#8221; /&gt;<br /><span class="Apple-tab-span" style="white-space:pre">	</span>&lt;/bean&gt;<br /><span class="Apple-tab-span" style="white-space:pre">	</span><br /><span class="Apple-tab-span" style="white-space:pre">	</span>&lt;bean id=&#8221;sqlSession&#8221; class=&#8221;org.mybatis.spring.SqlSessionTemplate&#8221;&gt;<br /><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;constructor-arg ref=&#8221;sqlSessionFactory&#8221; /&gt;<br /><span class="Apple-tab-span" style="white-space:pre">	</span>&lt;/bean&gt;<br /><span class="Apple-tab-span" style="white-space:pre">		</span><br /><span class="Apple-tab-span" style="white-space:pre">	</span>&lt;bean class=&#8221;org.mybatis.spring.mapper.MapperScannerConfigurer&#8221;&gt;<br /><span class="Apple-tab-span" style="white-space:pre">		</span>&lt;property name=&#8221;basePackage&#8221; value=&#8221;z.y.x.dao&#8221; /&gt;<br /><span class="Apple-tab-span" style="white-space:pre">	</span>&lt;/bean&gt;</p></blockquote>
<p>그러나 당최가 transaction이 동작을 하지 않는다=_= service 쪽의 매소드에 일부러 성공하는 SQL과 실패하는 SQL을<br />연속으로 실행 했는데, rollback 되지 않고 첫 번째 결과가 무조건 commit 이 되는 것이다;;<br />이래저래 설정을 바꿔보고, 이것 저것 실험을 해봐서 얻은 결론은 DAO 레벨에서는 transaction이 작동하는데,<br />service 레벨에서는 안한다는것.<br />삽질 끝에 service 클래스에서 @Service 어노테이션을 제거하고, 설정 파일에 bean 설정으로 추가 했더니..<br />동작한다! 먼가 해결의 실마리가 보이는 듯하지만 도대체가 이유를 알 수 없는 상황&#8230;-_-</p>
<p>다시 이래저래 설정을 바꿔가면서 실험해보고, 관련 글들을 찾아서 읽어 봤는데&#8230;<br />결론은 component scan의 과용과 spring context 설정에 대한 무지로 인한 설정 오류&#8230; 랄까..-_-a</p>
<p>STS에서 Spring MVC Template 프로젝트를 사용하여 프로젝트를 생성했는데, 이렇게 하면<br />기본적으로 계층 구조를 갖는 두 개의 context가 생성된다.<br />root context <br />&nbsp;|- servlet context</p>
<p>그리고, root context의 설정 파일은 /WEB-INF/spring/root-context.xml 에,<br />servlet context 의 설정파일은 /WEB-INF/spring/appServlet/servlet-context.xml 에 저장된다.</p>
<p>참고로, root context의 빈은 servlet context 에서 참조 가능하나, 그 반대는 안되고,<br />root context와 servlet context에 동일한 빈이 있으면, root context의 빈은 무시될 수 있다고 한다.</p>
<div>여기서 servlet context 설정 파일에 &lt;context:component-scan basePackage=&#8221;z.y.x&#8221; /&gt; 를 넣은 것이 화근.<br />위의 data source, transaction, mybatis 관련 설정은 모두 root context의 설정에 추가 되어 있으며,</p>
<div>root context 설정 파일에도<br />
&lt;context:component-scan basePackage=&#8221;z.y.x&#8221; /&gt; 가 추가되어있다.</div>
<p>여기서 문제는 AOP 설정은 다른 context에는 영향을 미칠 수 없다는 것과<br />root context와 servlet context에 동일한 빈이 있으면, root context의 빈은 무시될 수 있다는 것.</p>
<p>servlet context에서 &nbsp;&lt;context:component-scan basePackage=&#8221;z.y.x&#8221; /&gt; 을 해버렸기 때문에,</p>
<p>@Component, @Control, @Service, @Repository 가 붙은 모든 빈은 root context에서 무시될 가능성이 높다.<br />거기다 transaction 경계를 설정 하는 AOP 설정이 root context에 있으니&#8230;<br />root context 설정에서 component scan 했다고 하더라도 모조리 무시되니 root context 내에서는 AOP 설정이 안되고,<br />AOP 설정이 servlet context에는 적용되지 않으니, 결국 어디에도 transaction 설정이 되지 않는 것이지=_=</p>
<p>DAO 같은 경우에는 root context에 MyBatis 설정이 있으니, component scan에는 걸리지 않고<br />root context의 빈으로 등록되어 transaction이 잘 적용됐던 것이지. 덴장 OTL<br />망할놈의 STS는 context 간의 관계를 알리가 없으니 설정에 있으면 transaction 표시를 해줬던 것이고;</p>
<p>머.. 암튼 root context 설정에서는 요렇게,</p>
<blockquote><p>&lt;context:component-scan basePackage=&#8221;z.y.x.service&#8221; /&gt;</p></blockquote>
<p>servlet context 설정에서는 요렇게,<br class="Apple-interchange-newline"></p>
<blockquote><p>&lt;context:component-scan basePackage=&#8221;z.y.x.controller&#8221; /&gt;</p></blockquote>
<p>해주는 것으로 모든 문제 해결!</p></div>
</div><p>The post <a href="https://nangchang.nes.or.kr/spring-%ec%97%90%ec%84%9c-transaction-%ec%84%a4%ec%a0%95-%ec%8b%9c-service-%eb%a0%88%eb%b2%a8%ec%97%90%ec%84%9c-%ec%a0%81%ec%9a%a9-%ec%95%88%eb%90%98%eb%8a%94-%eb%ac%b8%ec%a0%9c/">Spring 에서 Transaction 설정 시 Service 레벨에서 적용 안되는 문제</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-%ec%97%90%ec%84%9c-transaction-%ec%84%a4%ec%a0%95-%ec%8b%9c-service-%eb%a0%88%eb%b2%a8%ec%97%90%ec%84%9c-%ec%a0%81%ec%9a%a9-%ec%95%88%eb%90%98%eb%8a%94-%eb%ac%b8%ec%a0%9c/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
