<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=TestDrivenDatabaseDevelopment</id>
	<title>TestDrivenDatabaseDevelopment - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=TestDrivenDatabaseDevelopment"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=TestDrivenDatabaseDevelopment&amp;action=history"/>
	<updated>2026-05-15T05:58:17Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=TestDrivenDatabaseDevelopment&amp;diff=87643&amp;oldid=prev</id>
		<title>Maintenance script: Repair MoniWiki formatting after migration</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=TestDrivenDatabaseDevelopment&amp;diff=87643&amp;oldid=prev"/>
		<updated>2026-03-29T00:34:31Z</updated>

		<summary type="html">&lt;p&gt;Repair MoniWiki formatting after migration&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 00:34, 29 March 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;TDD 로 Database Programming 을 진행하는 방법 &amp;amp; 경험들.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;TDD 로 Database Programming 을 진행하는 방법 &amp;amp; 경험들.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;See Also TdddArticle&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;See Also &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&lt;/ins&gt;TdddArticle&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;----&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;----&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;amp;#91;1002&amp;amp;#93;의 경우 TDD 로 DB 부분을 만들때 어떻게 진행될까 궁리하던중 두가지를 실험해보았다. 보통은 TDD로 DB 부분을 만들때 DB Repository 부분에 대해서 MockObject 를 만들지만, 다음은 Mock 을 안만들고 작성해봤다. 어떤 일이 일어날까를 생각하며.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;amp;#91;1002&amp;amp;#93;의 경우 TDD 로 DB 부분을 만들때 어떻게 진행될까 궁리하던중 두가지를 실험해보았다. 보통은 TDD로 DB 부분을 만들때 DB Repository 부분에 대해서 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&lt;/ins&gt;MockObject&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]] &lt;/ins&gt;를 만들지만, 다음은 Mock 을 안만들고 작성해봤다. 어떤 일이 일어날까를 생각하며.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  import junit.framework.TestCase;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  import junit.framework.TestCase;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=TestDrivenDatabaseDevelopment&amp;diff=85022&amp;oldid=prev</id>
		<title>Maintenance script: Repair batch-0003 pages from live compare</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=TestDrivenDatabaseDevelopment&amp;diff=85022&amp;oldid=prev"/>
		<updated>2026-03-27T00:29:11Z</updated>

		<summary type="html">&lt;p&gt;Repair batch-0003 pages from live compare&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 00:29, 27 March 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l126&quot;&gt;Line 126:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 126:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;어떤 것이 올바른 일일까. --&amp;amp;#91;1002&amp;amp;#93;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;어떤 것이 올바른 일일까. --&amp;amp;#91;1002&amp;amp;#93;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=TestDrivenDatabaseDevelopment&amp;diff=39610&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:28, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=TestDrivenDatabaseDevelopment&amp;diff=39610&amp;oldid=prev"/>
		<updated>2021-02-07T05:28:11Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;TDD 로 Database Programming 을 진행하는 방법 &amp;amp; 경험들.&lt;br /&gt;
See Also TdddArticle&lt;br /&gt;
----&lt;br /&gt;
&amp;amp;#91;1002&amp;amp;#93;의 경우 TDD 로 DB 부분을 만들때 어떻게 진행될까 궁리하던중 두가지를 실험해보았다. 보통은 TDD로 DB 부분을 만들때 DB Repository 부분에 대해서 MockObject 를 만들지만, 다음은 Mock 을 안만들고 작성해봤다. 어떤 일이 일어날까를 생각하며.&lt;br /&gt;
 &lt;br /&gt;
 import junit.framework.TestCase;&lt;br /&gt;
 &lt;br /&gt;
 import java.sql.*;&lt;br /&gt;
 &lt;br /&gt;
 public class SpikeRepositoryTest extends TestCase {&lt;br /&gt;
     private Connection con;&lt;br /&gt;
     protected IRepository repository;&lt;br /&gt;
     private String writer;&lt;br /&gt;
     private String title;&lt;br /&gt;
     private String body;&lt;br /&gt;
 &lt;br /&gt;
     public void setUp() throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException {&lt;br /&gt;
         initConnection();&lt;br /&gt;
         repository= new SpikeRepository(con);&lt;br /&gt;
         repository.initialize();&lt;br /&gt;
 &lt;br /&gt;
         writer = &amp;quot;writer&amp;quot;;&lt;br /&gt;
         title = &amp;quot;title&amp;quot;;&lt;br /&gt;
         body = &amp;quot;body&amp;quot;;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void tearDown() throws SQLException {&lt;br /&gt;
         repository.destroy();&lt;br /&gt;
         uninitConnection();&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void testEdit() throws SQLException {&lt;br /&gt;
         repository.createArticle(writer, title, body);&lt;br /&gt;
         String writerEdited = &amp;quot;writerEdited&amp;quot;;&lt;br /&gt;
         String titleEdited = &amp;quot;titleEdited&amp;quot;;&lt;br /&gt;
         String bodyEdited = &amp;quot;bodyEdited&amp;quot;;&lt;br /&gt;
         repository.edit(1, writerEdited, titleEdited, bodyEdited);&lt;br /&gt;
         Article article = repository.get(1);&lt;br /&gt;
         assertEquals (writerEdited, article.getWriter());&lt;br /&gt;
         assertEquals (titleEdited, article.getTitle());&lt;br /&gt;
         assertEquals (bodyEdited, article.getBody());&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void testTotalArticle() throws SQLException {&lt;br /&gt;
         repository.createArticle(writer, title, body);&lt;br /&gt;
         assertEquals (1, repository.getTotalArticle());&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void testCreateArticle() throws SQLException {&lt;br /&gt;
         repository.createArticle(writer, title, body);&lt;br /&gt;
         assertEquals (1, repository.getTotalArticle());&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void testDelete() throws SQLException {&lt;br /&gt;
         repository.createArticle(writer, title, body);&lt;br /&gt;
         repository.delete(1);&lt;br /&gt;
         assertEquals (0, repository.getTotalArticle());&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void testGet() throws SQLException {&lt;br /&gt;
         repository.createArticle(writer, title, body);&lt;br /&gt;
         Article article2 = repository.get(1);&lt;br /&gt;
         assertEquals(writer, article2.getWriter());&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void testArticleTableInitialize() throws ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException {&lt;br /&gt;
         repository = new SpikeRepository(con);&lt;br /&gt;
         repository.initialize();&lt;br /&gt;
 &lt;br /&gt;
         String articleTableName = &amp;quot;articlelist&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
         String sqlStr=&amp;quot;select id, writer, title, body from &amp;quot; + articleTableName;&lt;br /&gt;
         PreparedStatement pstmt= con.prepareStatement(sqlStr);&lt;br /&gt;
         ResultSet rs = pstmt.executeQuery();&lt;br /&gt;
 &lt;br /&gt;
         assertEquals (0, rs.getRow());&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     private void initConnection() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {&lt;br /&gt;
         String hostname = &amp;quot;localhost&amp;quot;;&lt;br /&gt;
         String dbname = &amp;quot;reset&amp;quot;;&lt;br /&gt;
         String userId = &amp;quot;reset&amp;quot;;&lt;br /&gt;
         String userPass = &amp;quot;reset&amp;quot;;&lt;br /&gt;
         Class.forName(&amp;quot;com.mysql.jdbc.Driver&amp;quot;).newInstance();&lt;br /&gt;
         String url=&amp;quot;jdbc:mysql://&amp;quot;+hostname+&amp;quot;/&amp;quot;+dbname+&amp;quot;?user=&amp;quot;+userId+&amp;quot;&amp;amp;amp;password=&amp;quot;+userPass;&lt;br /&gt;
         con = DriverManager.getConnection(url);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     private void uninitConnection() throws SQLException {&lt;br /&gt;
         con.close();&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void testDuplicatedInitialize() throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {&lt;br /&gt;
         repository.initialize();&lt;br /&gt;
         repository.initialize();&lt;br /&gt;
         repository.initialize();&lt;br /&gt;
         repository.destroy();&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
작성하는중에, DB에 직접 접속해서 확인하는 코드가 테스트에 드러났다. (이는 예상한 일이긴 하다. DB 에 비종속적인 interface 를 제외하더라도 DB 쪽 코드를 계속 쌓아가기 위해선 DB 코드를 어느정도 써야 한다.) 처음 DB 에 직접 데이터를 넣을때는 side-effect가 발생하므로, 테스트를 2번씩 돌려줘서 side-effect를 확인을 했다. 점차적으로 initialize 메소드와 destroy 메소드를 만들고 이를 setUp, tearDown 쪽에 넣어줌으로 테스트시의 side-effect를 해결해나갔다.&lt;br /&gt;
&lt;br /&gt;
프로그래밍을 하다가, 만일 여기서부터 interface 를 추출한뒤에 거꾸로 MockRepository 를 만들 수 있을까 하는 생각을 했다. (interface 를 추출함으로서 같은 메소드에 대해 다른 성격의 Repository, 즉 File Based 나 다른 서버 로부터 데이터를 얻어오는 Repository 등 다형성을 생각해볼 수 있는 것이다.) &lt;br /&gt;
결과는 다음의 문제가 발생하였다. 바로, interface 에 DB Exception 던진것들이 묻어나는것이다.&lt;br /&gt;
 &lt;br /&gt;
 import java.sql.SQLException;&lt;br /&gt;
 &lt;br /&gt;
 public interface IRepository {&lt;br /&gt;
     Article get(int index) throws SQLException;&lt;br /&gt;
 &lt;br /&gt;
     void initialize() throws SQLException;&lt;br /&gt;
 &lt;br /&gt;
     void destroy() throws SQLException;&lt;br /&gt;
 &lt;br /&gt;
     void edit(int index, String writer, String title, String body) throws SQLException;&lt;br /&gt;
 &lt;br /&gt;
     int getTotalArticle() throws SQLException;&lt;br /&gt;
 &lt;br /&gt;
     void createArticle(String writer, String title, String body) throws SQLException;&lt;br /&gt;
 &lt;br /&gt;
     void delete(int index);&lt;br /&gt;
 }&lt;br /&gt;
즉, MockRepository 에서는 Exception 을 던질 필요가 없는데, 메소드마다 전부 throw 를 던져줘야 한다. (한편으로는, 다른 언어에서는 상관없는데 Java 에서의 Checked Exception 의 문제일런지도 모르겠다.&lt;br /&gt;
&lt;br /&gt;
만일 MockRepository를 먼저 만든다면? interface 를 추출한 순간에는 문제가 없겠지만, 다음에 DBRepository 를 만들때가 문제가 된다. interface 의 정의에서는 예외를 던지지 않으므로, interface 를 다시 수정하던지, 아니면 SQL 관련 Exception 을 전부 해당 메소드 안에서 try-catch 로 잡아내야 한다. 즉, Database 에서의 예외처리들에 대해 전부 Repository 안에서 자체해결을 하게끔 강요하는 코드가 나온다. &lt;br /&gt;
&lt;br /&gt;
어떤 것이 올바른 일일까. --&amp;amp;#91;1002&amp;amp;#93;&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>