๐ ํ ๋น ์คํ๋ง 2์ฅ ์ ๋ฆฌ
main()
๋ก ์์ฑ๋ ํ ์คํธ
public class UserDaoTest {
public static void main(String[] args) throws SQLExption {
ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
UserDao dao = context.getBean("UserDao", UserDao.class);
User user = new User();
user.setId("user");
user.setName("๋ฐฑ๊ธฐ์ ");
user.setPassword("married");
dao.add(user);
System.out.println(user.getId() + "๋ฑ๋ก ์ฑ๊ณต");
User user2 = dao.get(user.getId());
Sysyem.out.println(user2.getName());
System.out.println(user2.getPassword);
System.out.println(user2.getId() + "์กฐํ ์ฑ๊ณต")
}
}
์ ์ฝ๋์์๋ main() ๋ฉ์๋๋ก ํ ์คํธ๋ฅผ ์งํํ๋ค๋ ๊ฒ๊ณผ ํ ์คํธ ๋์์ธ UserDao๋ฅผ ์ง์ ํน์ถํด์ ์ฌ์ฉํ๋ค๋ ์ ์ด ํน์ง์ด๋ค.
๐ฅ ์น์ ํตํ DAO ํ ์คํธ ๋ฐฉ๋ฒ์ ๋ฌธ์ ์
์๋น์ค ํด๋์ค, ์ปจํธ๋กค๋ฌ, JSP ๋ทฐ ๋ฑ ๋ชจ๋ ๋ ์ด์ด์ ๊ธฐ๋ฅ์ ๋ค ๋ง๋ค๊ณ ๋์์ผ ํ ์คํธ๊ฐ ๊ฐ๋ฅํ๋ค๋ ์ ์ด ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ค. ๋ฐ๋ผ์ ์์ ๋จ์๋ก ํ ์คํธ๋ฅผ ์งํํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์
์ด๋ ๋ฏ ์์ ๋จ์๋ก ํ ์คํธ๋ฅผ ํ๋ ๊ฒ์ด ๋จ์ํ ์คํธ(Unit Test)๋ผ๊ณ ํจ. ์ผ๋ฐ์ ์ผ๋ก ๋จ์๋ ์์์๋ก ์ ์
๐ UserDaoTest์ ๋ฌธ์ ์
- ์๋ ํ์ธ ์์
์ ๋ฒ๊ฑฐ๋ก์
- ํ ์คํธ ์ฝ๋๊ฐ ์ ์์ ์ผ๋ก ์๋ํ๋ค๊ณ ํ๋๋ผ๋ set๊ณผ get์ ๊ฒฐ๊ณผ๊ฐ ์ผ์นํ๋์ง ๋์ผ๋ก ํ์ธํด์ผํจ.
- ๊ฒ์ฆํด์ผ ํ๋ ์์ด ๋ง์์ง๋ฉด ๋ฒ๊ฑฐ๋ก์์ง์ ๋ฐ์ฅ ์์
- ์คํ ์์
์ ๋ฒ๊ฑฐ๋ก์
- ๋ง์ฝ์ ์คํํ main()์ด ์๋ฐฑ๊ฐ๋ผ๋ฉด ๋น์ฐํ ํ ์คํธ๋ฅผ ํ๋ ๊ฒ๋ง์ผ๋ก๋ ํฐ ๋ถ๋ด์ด ๋๋ค. ๋ฐ๋ผ์ ๋ง์ฝ์ ์ ์ฒด ๊ธฐ๋ฅ์ ๋ชจ๋ ํ ์คํธํ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฆฌํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ ๋ฒ ํฐ ์์ ์ด ๋ ์ ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก main() ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ๋ณด๋ค ์ข ๋ ํธ๋ฆฌํ๊ณ ์ฒด๊ณ์ ์ผ๋ก ์คํํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ์ด ์ ์คํ ํ์ํ๋ค.
๐ UserDaoTest ๊ฐ์
ํ ์คํธ ๊ฒ์ฆ์ ์๋ํ
๋ชจ๋ ํ
์คํธ์ ๊ฒฐ๊ณผ๋ ์ฑ๊ณต๊ณผ ์คํจ์ด๋ฉฐ ์คํจ๋ ํ
์คํธ๊ฐ ์งํํ๋ ๋์ ์๋ฌ๊ฐ ๋ฐ์ํด์ ์คํจํ๋ ๊ฒ
๊ณผ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์์์ง๋ง, ๊ธฐ๋ํ ๊ฒ๊ณผ ๋ค๋ฅด๊ฒ ๋์ค๋ ๊ฒฝ์ฐ
2๊ฐ์ง๊ฐ ์๋ค. ๋ฐ๋ผ์ ์๋์ ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ํ
์คํธ ๊ฒ์ฆ์ ์๋ํ๋ฅผ ์ด๋ ์ ๋ ํด๊ฒฐํ ์ ์๋ค.
System.out.println(user2.getName());
System.out.println(user2.getPassword());
System.out.println(user2.getId() + " ์กฐํ ์ฑ๊ณต");
โ
if (!user.getName().equal(user2.getName())) {
System.out.println("ํ
์คํธ ์คํจ (name)");
} else if (!user.getPassword().equal(user2.getName())) {
System.out.println("ํ
์คํธ ์คํจ (Password)");
} else {
System.out.println("์กฐํ ํ
์คํธ ์ฑ๊ณต")
}
โ๏ธ ํ ์คํธ์ ํจ์จ์ ์ธ ์ํ๊ณผ ๊ฒฐ๊ณผ ๊ด๋ฆฌ
์์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ ๋ง์ผ๋ก๋ ์์ ์ ์๋น๋ถ๋ถ ํจ์จ์ ์ผ๋ก ์งํํ ์ ์๋ค. ํ์ง๋ง, ์ด๋ฌํ ๊ณผ์ ์ผ๋ก ์ธํด ๋ฒ๊ฑฐ๋ก์ด ์ผ์ด ์ฌ๋ผ์ง ๊ฒ์ ์๋๋ค. ๋ฐ๋ผ์ ํด๋น ๋ถ๋ถ์ ์ข ๋ ํจ์จ์ ์ผ๋ก ์ํํ๊ธฐ ์ํด Junit(Framework)์ด๋ผ๋ ํ ์คํธ ์ง์ ๋๊ตฌ๊ฐ ์๋ค.
Junit์ ํ๋ ์์ํฌ์ด๊ธฐ ๋๋ฌธ์ main() ๋ฉ์๋๋ ํ์์๊ณ ์ค๋ธ์ ํธ๋ฅผ ๋ง๋ค์ด์ ์คํ์ํค๋ ์ฝ๋๋ ํ์์๋ค. ๋ฐ๋ผ์ ๊ธฐ์กด์ main ๋ฉ์๋๋ Junit์ ์ ์ฉํ๊ธฐ ์ ํฉํ์ง ์๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๊ฐ์ฅ ๋จผ์ ํ ์ผ์ main() ๋ฉ์๋์ ์๋ ํ ์คํธ ์ฝ๋๋ฅผ ์ผ๋ฐ ๋ฉ์๋๋ก ์ฎ๊ฒจ์ผํ๋ค. ์๋กญ๊ฒ ๋ง๋ค ๋ฉ์๋๋ Junit ํ๋ ์์ํฌ๊ฐ ์๊ตฌํ๋ 2๊ฐ์ง ์กฐ๊ฑด์ ๋ฐ๋ผ์ผ ํ๋ค.
- ๋ฉ์๋๊ฐ public์ผ๋ก ์ ์ธ๋์ด์ผ ํ๋ค.
- ๋ค๋ฅธ ํ๋๋ ๋ฉ์๋์ @Test๋ผ๋ ์ ๋ ธํ ์ด์ ์ ์ถ๊ฐํด์ผํ๋ค.
junit ํ๋ ์์ํฌ์์ ๋์ํ๋๋ก ํ ์คํธ ๋ฉ์๋๋ฅผ ์ฌ๊ตฌ์ฑํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
import org.junit.Test;
// ...
public class UserDaoTest {
@Test // โ junit์๊ฒ ํ
์คํธ์ฉ ๋ฉ์๋์์ ์๋ ค์ค๋ค.
public void addAndGet() throws SQLException { // junit ํ
์คํธ ๋ฉ์๋๋ ๋ฐ๋์ public์ผ๋ก ์ ์ธ๋์ด์ผ ํ๋ค.
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao dao = context.getBean("userDao", UserDao.class);
}
}
์ด์ ์๊น ์์ฑํ๋ if else ๊ตฌ๋ถ์ junit์ ๋ฒ์ ์ผ๋ก ์ ํํด๋ณด์. ์ด๋ junit์์ assertThat์ด๋ผ๋ ์คํํฑ ๋ฉ์๋๋ฅผ ์ด์ฉํด ๋ณ๊ฒฝํ ์ ์๋ค.
assetThat(user2.getName(), is(user.getName()));
assertThat()
๋ฉ์๋๋ ์ฒซ ๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ ๊ฐ์ ๋ค์ ๋์ค๋ ๋งค์ฒ(matcher)๋ผ๊ณ ๋ถ๋ฆฌ๋ ์กฐ๊ฑด์ผ๋ก ๋น๊ตํด์ ์ผ์นํ๋ฉด ๋ค์์ผ๋ก ๋์ด๊ฐ๊ณ , ์๋๋ฉด ํ
์คํธ๊ฐ ์คํจํ๋๋ก ๋ง๋ค์ด์ค๋ค. is()
๋ ๋งค์ฒ์ ์ผ์ข
์ผ๋ก equals()
๋ก ๋น๊ตํด์ฃผ๋ ๊ธฐ๋ฅ์ ๊ฐ์ก๋ค.
๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก 2๋ฒ์งธ if๋ฌธ๋ ๋ค์๊ณผ ๊ฐ์ด ๋ณ๊ฒฝํ ์ ์๋ค.
asserThat(user2.getPassword(), is(user.getPassword()))
์ค์ํ ๊ฒ์ Junit์ ์์ธ๊ฐ ๋ฐ์ํ๊ฑฐ๋ assertThat()
์์ ์คํจํ์ง ์๊ณ ํ
์คํธ ๋ฉ์๋์ ์คํ์ด ์๋ฃ๋๋ฉด ํ
์คํธ๊ฐ ์ฑ๊ณตํ๋ค๊ณ ์ธ์ํ๋ค. โํ
์คํธ ์ฑ๊ณตโ์ด๋ผ๋ ๋ฉ์ธ์ง๋ฅผ ๊ตณ์ด ์ถ๋ ฅํ ํ์๋ ์๋ค. Junit์ด ํ
์คํธ๋ฅผ ์คํํ๊ณ ๋๋ฉด ํ
์คํธ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ์๋ ค์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด์ ์์ ์์ฑํ๋ UserDaoTest๋ฅผ junit์ผ๋ก ๋ณ๊ฒฝํ ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Asset.assertThat;
//...
public class UserDaoTest {
@Test
public void addAndGet() throws SQLException {
ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
UserDao dao = context.getBean("userDao", UserDao.class);
User user = new User();
user.setId("gyumee");
user.setName("๋ฐ์ฑ์ฒ ");
user.setPassword("spring01");
dao.add(user);
User user2 = dao.get(user.getId());
assertThat(user2,getName(), is(user.getName()));
assertThat(user2.getPassword(), is(user.getPassword));
}
}
์ฝ๋๋ง ๋ง๋ ๋ค๊ณ ๋์ด ์๋๊ณ junit๋ ์๋ฐ ์ฝ๋์์ผ๋ก ์ด๋์ ๊ฐ ํ๋ฒ์ ์ฝ๋๋ฅผ ์คํํด์ค์ผํ๋ค. ์ด๋ฅผ ์ํด์ ์ด๋์๋ main() ๋ฉ์๋๋ฅผ ํ๋ ์ถ๊ฐํ๊ณ ๊ทธ ์์ JUnitCore ํด๋์ค์ main ๋ฉ์๋๋ฅผ ํธ์ถํด์ฃผ๋ ๊ฐ๋จํ ์ฝ๋๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค. ๋ฉ์๋ ํ๋ผ๋ฏธํฐ์๋ @Test ํ ์คํธ ๋ฉ์๋๋ฅผ ๊ฐ์ง ํด๋์ค์ ์ด๋ฆ์ ๋ฃ์ด์ค๋ค. UserDaoTest๋ฅผ ์คํํ ํ ๋ ๋ฆฌ์ค 2-6๊ณผ ๊ฐ์ด springbook.user.dao.UserDaoTest๋ผ๋ ๊ฐ์ ๋๊ฒจ์ค๋ค.
import org.junit.runner.JUnitCore;
// ...
public static void main(String[] args) {
JUnitCore.main("springbook.user.dao.UserDaoTest");
}
ํด๋น main()๋ฅผ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ฉ์ธ์ง๊ฐ ์ถ๋ ฅ๋๋ฉฐ ๋ค์๊ณผ ๊ฐ๋ค.
JUnit version 4.7
Time: 0.578
OK 1 (test)
JUnit์ ๋ฒ์ ๊ณผ ๊ฑธ๋ฆฐ ์๊ฐ, ์ฑ๊ณตํ ํ ์คํธ ๊ฐฏ์๊ฐ ์ถ๋ ฅ๋๋ค. ์ด๋ ๋ง์ฝ์ ์คํจํ๋ฉด ์คํจํ ๋ฉ์๋์ ์ ์คํจํ๋์ง ์๋ ค์ค๋ค.
๐ ํ ์คํธ ๊ฒฐ๊ณผ์ ์ผ๊ด์ฑ
UserDaoTest๋ฅผ ์์ฑํ๋ค๊ณ ํ๋๋ผ๋ ํญ์ ํ ์คํธ ๊ฒฐ๊ณผ๊ฐ ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ค๋ฉด, ์ด์ ํ ์คํธ ๋๋ฌธ์ DB์ ๋ฑ๋ก๋ ์ค๋ณต ๋ฐ์ดํฐ๊ฐ ์์ ์ ์๋ค๋ ์ ์ด๋ค. ๊ฐ์ฅ ์ข์ ํด๊ฒฐ์ฑ ์ addAndGet() ํ ์คํธ๋ฅผ ๋ง์น๊ณ ๋๋ฉด ํ ์คํธ๊ฐ ๋ฑ๋กํ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ญ์ ํ๊ณ ํ ์คํธ๋ฅผ ์ํํ๊ธฐ ์ด์ ์ํ๋ก ๋ง๋ค์ด ๋๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ฉด ํ ์คํธ๋ฅผ ์๋ฌด๋ฆฌ ๋ฐ๋ณตํ์ฌ ์คํํด๋ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๊ณ , ์ด๋ฌํ ๊ฒฐ๊ณผ๋ฅผ ์ป์ด์ผ ์ ๋๋ก ๋ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ค ๋ณผ ์ ์๋ค.
๋ฐ๋ผ์ ์ผ๊ด์ฑ ์๋ ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด UserDaoTest์ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํด์ค๋ค.
-
deleteAll()
,getCount()
deleteAll()
: USER ํ ์ด๋ธ์ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ์ญ์ ํด์ฃผ๋ ๊ฐ๋จํ ๊ธฐ๋ฅ์ด ์๋ค. UserDao ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ์.
public void deleteAll() throws SQLException { connection c = dataSource.getConnection(); PrepareStatement ps = c.prepareStatement("delete from users"); ps.executeUpdate(); ps.close(); c.close(); }
add()
์ ๋น์ทํ๋ฐ ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ์ด ์์ผ๋ฏ๋ก ๋ ๋จ์ํ๋ค.getCount()
: ๋ ๋ฒ์งธ๋ก ์ถ๊ฐํ ๊ฒ์getCount()
๋ก USER ํ ์ด๋ธ์ ๋ ์ฝ๋ ๊ฐ์๋ฅผ ๋๋ ค์ค๋ค. ์ด๋ get ๋ฉ์๋์ ๋น์ทํ ๊ตฌ์กฐ์ด๋ค.
public int getCount() throws SQLException { Connection c = dataSoutce.getConnection(); PrepareStatement ps = c.prepareStatement("select count(*) from users"); ResultSet rs = ps.executeQuery(); rs.next(); int count = rs.getInt(1); rs.close(); ps.close(); c.close(); return count; }
addAndGet()
ํ
์คํธ์ ๋ถํธํ ์ ์ ์คํ ์ ์ ์๋์ผ๋ก USER ํ
์ด๋ธ์ ๋ด์ฉ์ ๋ชจ๋ ์ญ์ ํด์ค์ผ ํ๋ ๊ฒ์ด์๋ค. ํ์ง๋ง deleteAll()
์ ์ฌ์ฉํ๋ฉด ํ
์ด๋ธ์ ๋ชจ๋ ๋ด์ฉ์ ์ญ์ ํ ์ ์์ผ๋ ํ
์คํธ๊ฐ ์์๋ ๋ ์คํํ๋ฉด ์ข์ ๊ฒ์ด๋ค. ๋ง์ฝ ์ ์๋ํ๋ฉด ํ
์คํธ ๋๋ง๋ค ์ผ์ผ์ด ํ
์ด๋ธ์ ์ญ์ ํ์ง ์์๋ ๊ด์ฐฎ์ ๊ฒ์ด๋ค. ํ์ง๋ง deleteAll()
์์ฒด๋ ๊ฒ์ฆ๋์ง ์์๋ค๋ ๊ฒ์ ๊ฐ์ํ๋ฉด ๋ฌดํฑ๋๊ณ ํ
์คํธ์ ์ ์ฉํ๊ธฐ์๋ ๋ถ๋ด์ค๋ฝ๋ค. ๋ฐ๋ผ์ getCount()๋ ํจ๊ป ์ ์ฉํด๋ณด์. ๊ทผ๋ฐ ์ฌ๊ธฐ์ ๋ ๋ฌธ์ ๊ฐ getCount()
๋ ๊ฒ์ฆ๋์ง๋ ์์๋ค. ๊ทธ๋์ getCount()
์ ๋ํ ๊ฒ์ฆ ์์
์ ํ๋ ๋ ์ถ๊ฐํ๋ค. ๋ฌผ๋ก ์ด ๋ชจ๋ ์ฝ๋๋ addAndGet()
๋ฉ์๋์ ์ถ๊ฐํ๋ค.
@Test
public void addAndGet() throws SQLException{
//...
dao.deleteAll();
assertThat(dao.getCount(), is(0));
User user = new User();
user.setId("gyumee");
user.setName("๋ฐ์ฑ์ฒ ");
user.setPassword("springno01");
dao.add(user);
assertThat(dao.getCount(), is(1));
User user2 = dao.get(user.getId());
assertThat(user2.getName(), is(user.getName()));
assertThat(user2.getPassword(), is(user.getPassword()));
}
Junit์ ํ๋์ ํด๋์ค ์์ ์ฌ๋ฌ ๊ฐ์ ํ ์คํธ ๋ฉ์๋๊ฐ ๋ค์ด๊ฐ๋ ๊ฒ์ ํ์ฉํ๋ค. @Test๊ฐ ๋ถ์ด ์๊ณ public ์ ๊ทผ์๊ฐ ์์ผ๋ฉฐ ๋ฆฌํด ๊ฐ์ด voidํ์ด๊ณ ํ๋ผ๋ฏธํฐ๊ฐ ์๋ค๋ ์กฐ๊ฑด์ ์งํค๊ธฐ๋ง ํ๋ฉด ๋๋ค.
ํ ์คํธ๋ฅผ ๋ง๋ค๊ธฐ ์ ์ User ํด๋์ค์ ํ ๋ฒ์ ๋ชจ๋ ์ ๋ณด๋ฅผ ๋ฃ์ ์ ์๋๋ก ์ด๊ธฐํ๊ฐ ๊ฐ๋ฅํ ์์ฑ์๋ฅผ ์ถ๊ฐํ๋ค. User ์ค๋ธ์ ํธ๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ง๋ค๊ณ ๊ฐ์ ๋ฃ์ดํ ํ๋, ํ ๋ฒ์ ์ค์ ๊ฐ๋ฅํ ์์ฑ์๋ฅผ ๋ง๋ค์ด๋๋ฉด ํธ๋ฆฌํ๋ค.
public User(String id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
public User() { // โ ์๋ฐ๋น์ ๊ท์ฝ์ ๋ฐ๋ฅด๋ ํด๋์ค์ ์์ฑ์๋ฅผ
// ๋ช
์์ ์ผ๋ก ์ถ๊ฐํ์ ๋๋ ํ๋ผ๋ฏธํฐ๊ฐ ์๋ ๋ํดํธ ์์ฑ์๋ ํจ๊ป
// ์ ์ํด์ฃผ๋ ๊ฒ์ ์์ง๋ง์.
}
์๋ฅผ ์ด์ฉํ๋ฉด addAndGet()
ํ
์คํธ์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋ตํ ์์ ํ ์ ์๋ค.
UserDao dao = context.getBean("userDao", UserDao.class);
User user = new User("gyumee", "๋ฐ์ฑ์ฒ ", "springno01");
์ด๋ฌํ ๋ฐฉ์์ผ๋ก getCount()
์ ๋ํ ํ
์คํธ ๋ฉ์๋๋ฅผ ์์ฑํ๋ค.
@Test
public void count() throws SQLException {
ApplicationContext context = new GenericXmlApplicaiotnConext("applicationContext.xml");
UserDao dao = context.getBean("userDao", UserDao.class);
User user1 = new User("gyumee", "๋ฐ์ฑ์ฒ ", "springno1");
User user2 = new User("leegw700", "์ด๊ธธ์", "springno2");
User user3 = new User("bumjin", "๋ฐ๋ฒ์ง", "springno3");
dao.deleteAll();
assertThat(dao.getCount(), is(0));
dao.add(user1);
assertThat(dao.getCount(), is(1));
dao.add(user2);
assertThat(dao.getCount(), is(2));
dao.add(user3);
assertThat(dao.getCount(), is(3));
}
๊ทธ๋ฐ๋ฐ get()
์ด ํ๋ผ๋ฏธํฐ๋ก ์ฃผ์ด์ง id์ ํด๋นํ๋ ์ฌ์ฉ์๋ฅผ ๊ฐ์ ธ์จ ๊ฒ์ธ์ง, ์๋๋ฉด ๊ทธ๋ฅ ์๋ฌด๊ฑฐ๋ ๊ฐ์ ธ์จ ๊ฒ์ธ์ง ํ
์คํธ์์ ๊ฒ์ฆํ์ง ๋ชปํ๋ค. ํด๋น ๋ถ๋ถ์ User๋ฅผ ํ๋ ๋ ์ถ๊ฐํด์ id๋ฅผ ์ ํํ ๊ฐ์ ธ์๋์ง ํ์ธํด๋ณด๋ฏ๋ก์ addAndGet()
๋ฅผ ๋ณด์ํ ์ ์๋ค.
@Test
public void addAndGet() throws SQLException {
// ...
UserDao dao = context.getBean("userDao", UserDao.class);
user user1 = new User("gyumee", "๋ฐ์ฑ์ฒ ", "springno1");
user user2 = new User("leegw700", "์ด๊ธธ์", "springno2");
dao.deleteAll();
asserThat(dao.getCount(), is(0));
dao.add(user1);
dao.add(user2);
assertThat(dao.getCount(), is(2));
User userget1 = dao.get(user1.getId());
assertThat(userget1.getName(), is(user1.getName()));
assertThat(userget1.getPassword(), is(user1.getPassword()));
User userget2 = dao.get(user2.getId());
assertThat(userget2.getName(), is(user2.getName()));
assertThat(userget2.getPassword(), is(user2.getPassword()));
}
์ด๋ ๊ฒ ํ๋ฉด id ๊ฐ์ ์ ๊ทผํ user ์ ๋ณด์ ์ ์ฅํ user ์ ๋ณด์ ๋์ผํจ์ ํ์ธํ๋ฏ๋ก์จ get()์ ๋ํด ์ ๋ขฐ๋ฅผ ์ป๊ณ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
๊ทผ๋ฐ ๋ง์ฝ์ id๋ก ์ ๊ทผํ๋๋ฐ, ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น? ์ด๋ด ๋๋ 2๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค.
- null๊ณผ ๊ฐ์ ํน๋ณํ ๊ฐ์ ๋ฆฌํด
- id ์ ๋ณด๋ฅผ ์ฐพ์ ์ ์๋ค๊ณ ๋ฆฌํด
๊ฐ๊ฐ์ ์ฅ๋จ์ด ์๋๋ฐ, ์ผ๋จ 2๋ฒ์ ๋ฐฉ๋ฒ์ ์์๋ณด์.
์ผ๋จ ์คํ๋ง์์ EmptyResultDataAccessException
์ ์์ธ ํด๋์ค์ด๋ค. ์ด๋ฅผ ์ด์ฉํ๋ฉด UserDao์์ ์ฟผ๋ฆฌ๋ฅผ ์คํํด ๊ฐ์ ธ์จ ๊ฒฐ๊ณผ์ ์๋ฌด๊ฒ๋ ์์ ๋ ์์ธ๋ฅผ ๋์ง๋๋ก ๋ง๋ค ์ ์๋ค. ์ฌ๊ธฐ์ ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ ์ด๋ฌํ ํ
์คํธ๋ฅผ ์ด๋ป๊ฒ ์์ฑํด์ผ ํ๋๊ฐ? ์ด๋ค. ์๋ํ๋ฉด, ํ
์คํธ ์ค์ ์์ธ๊ฐ ๋์ ธ์ง๋ฉด ํ
์คํธ ๋ฉ์๋์ ์คํ์ ์ค๋จ๋๊ณ ํ
์คํธ๋ ์คํจํ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทผ๋ฐ ์ด๋ฒ์๋ ๋ฐ๋๋ก ์์ธ๊ฐ ๋์ ธ์ง์ง ์๋๋ค๊ณ ์๊ฐํด๋ณด์ ์ ์์ ์ผ๋ก ํ
์คํธ๊ฐ ๋๋๋ฉด ์ด ๋ํ ์์ธ๋ฅผ ์๊ธฐ์ํ ํ
์คํธ๋ ์คํจํ ๊ฒ ์๋๊ฐ? ์ฆ ์์ธ ๋ฐ์ ์ฌ๋ถ๋ ๋ฉ์๋๋ฅผ ์คํํด์ ๋ฆฌํด ๊ฐ์ ๋น๊ตํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ํ์ธํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ๋ค์ ๋งํด assertThat()
์ผ๋ก๋ ํ์ธ์ด ๋ถ๊ฐ๋ฅํ๋ค. ๋ง์ด ๊ธธ์ด์ก๋๋ฐ, ์ด ๋ถ๋ถ์ Junit์์ ํน๋ณํ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ ์ ์๋ค. ์ผ๋จ ํ
์คํธ ๋ฉ์๋๋ฅผ ํ๋ ๋ ์ถ๊ฐํ์. ๋ฐฉ๋ฒ์ ๊ฐ๋จํ๋ค.
- ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์ง์ด๋ค.
- ์กด์ฌํ์ง ์๋ id๋ก get()์ ํธ์ถํ๋ค.
- ์ด๋ EmptyResultAccessException์ด ๋์ ธ์ง๋ฉด ์ฑ๊ณต์ด๊ณ ์๋๋ฉด ์คํจ๋ค.
@Test(expected=EmptyResultDataAccessException.class) // โ ํ
์คํธ ์ค์ ๋ฐ์ํ ๊ฒ์ผ๋ก ๊ธฐ๋ํ๋ ์์ธ ํด๋์ค๋ฅผ ์ง์
public void getUserFailure() Throws SQLException {
ApplicationContext context = new GenericXmlApplicationContext("applicationContext");
UserDao dao = context.getBean('userDao', UserDao.class);
dao.deleteAll();
assertThat(dao.getCount(), is(0));
dao.get("unknown_id");
}
Test์ฝ๋๋ ๊ฐ๋จํ๋ค. ๋ชจ๋ User ๋ฐ์ดํฐ๋ฅผ ์ง์ฐ๊ณ ์กด์ฌํ์ง ์๋ id๋ก get() ๋ฉ์๋๋ฅผ ์คํํ๋ ๊ฒ ์ ๋ถ๋ค. ์ด ํ ์คํธ์์ ์ค์ํ ๊ฒ์ @Test ์ ๋ ธํ ์ด์ ์ expected ์๋ฆฌ๋ฉํธ๋ค. excepted๋ ํ ์คํธ ๋ฉ์๋ ์คํ ์ค์ ๋ฐ์ํ๋ฆฌ๋ผ ๊ธฐ๋ํ๋ ์์ธ ํด๋์ค๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
@Test์ expected๋ฅผ ์ถ๊ฐํด๋์ผ๋ฉด, ๋ณดํต์ ํ
์คํธ์๋ ๋ฐ๋๋ก ์ ์์ ์ผ๋ก ํ
์คํธ ๋ฉ์๋๋ฅผ ๋ง์น๋ฉด ํ
์คํธ๊ฐ ์คํจํ๊ณ expected์์ ์ง์ ํ ์์ธ๊ฐ ๋์ ธ์ง๋ฉด ํ
์คํธ๊ฐ ์ฑ๊ณตํ๋ค.
๋ฐ๋์ ์์ธ๊ฐ ๋ฐ์ํด์ผํ๋ ๊ฒฝ์ฐ ์ ์ฉํ๊ฒ ์ธ ์ ์์ผ๋ ๊ธฐ์ตํ์. ๊ทผ๋ฐ ์๊ธด๊ฑด ์์ ์ฝ๋ ๋๋ฆฌ๋ฉด ์คํจํ๋ค. ์๋๋ฉด get()๋ฉ์๋์์ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ์ฒซ ๋ฒ์งธ ํ์ ๊ฐ์ ธ์ค๊ฒ ํ๋ rs.next()๋ฅผ ์คํํ ๋ ๊ฐ์ ธ์ฌ ๋ก์ฐ๊ฐ ์๋ค๋ SQLException์ด ๋ฐ์ํ ๊ฒ์ด๊ณ ์ด๊ฑด ๋น์ฐํ๋ค ์์ง UserDao์ ์ ์๋๋ค.
์์ฝ๋๋ฅผ ์ฑ๊ณต์ํค๊ธฐ ์ํด์๋ get๋ฉ์๋๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด์ค๋ค. get์์ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด EmptyResultDataAccessException์ ๋์ง๋ฉด ๋๋ค.
public User get(String id) throws SQLException {
// ...
ResultSet rs = ps.executeQuery();
User user = null; // โ User๋ null ์ํ๋ก ์ด๊ธฐํํด๋๋๋ค.
if(rs.next()) {
user = new User();
user.setId(rs.getSring("id"));
user.setName(rs.getString('name'));
user.setPassword(rs.getString("password")); // id๋ฅผ ์กฐ๊ฑด์ผ๋ก ํ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ์์ผ๋ฉด User
// ์ค๋ธ์ ํธ๋ฅผ ๋ง๋ค๊ณ ๊ฐ์ ์ค๋ค.
}
rs.close();
ps.close();
c. close();
if (user == null) throw new EmptyResultDataAccessException(1);
return user;
}
์์ ์ฝ๋๋ ์ ์์ ์ผ๋ก ์์ฑ๋๋ ๊ฒ์ ์ ์ ์๋ค.
์ง๊ธ ์ฐ๋ฆฌ๊ฐ ์งํํ ์ํฉ์ ๋์ด์ผ๋ณด๋ฉด ํ ๊ฐ์ง ์ฌ๋ฐ๋ ์ ์ ์ฐพ์ ์ ์๋๋ฐ, ์ด๊ฑด ๋จผ์ ๊ธฐ๋ฅ ์ฝ๋๋ฅผ ์์ฑํ์ง ์๊ณ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑ ํ ๊ธฐ๋ฅ ์ฝ๋๋ฅผ ์์ ํ๋ค๋ ์ ์ด๋ค. ์ด๋ฌํ ๊ณผ์ ์ TDD(Test Driven Development)๋๋ TFD(Test First Development)๋ผ๊ณ ํ๋ค.
์ด๋ฌํ ๋ถ๋ถ์ ๋ณด์์ ๋ TDD๋ ๋งค์ฐ ์ค์ํ ๊ฐ๋ฐ ๋ฐฉ์์ด๋ผ๋ ๊ฒ์ ์์ง๋ง์.
๋ํ test์ฝ๋๋ ๋ฆฌํํ ๋ง์ ๋์์ด๋๋ค. ์ข๋ ์ดํดํ๊ธฐ ์ฝ๊ณ ๊ฐ๋ ์ฑ์ด ์ข์ํ๋ ์ฝ๋๋ก ๋ณ๊ฒฝํ๋ ๊ณผ์ ์ ๊ธฐ๋ฅ ๋ถ๋ฌธ๋ฟ๋ง ์๋๋ผ ํ ์คํธ ์ฝ๋๋ ํ์ํ๋ค.
์ฐ๋ฆฌ๋ ์ง๊ธ๊น์ง 3๊ฐ์ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ค. UserDaoTest์ฝ๋๋ฅผ ์ ์ํด๋ณด๋ฉด ๊ธฐ๊ณ์ ์ผ๋ก ๋ฐ๋ณต๋๋ ๋ถ๋ถ์ด ๋์ ๋๋ค.
ApplicationContext context = new GenericXmlApplicationContext("applicationContext.xml");
User dap = context.getBean("userDao",UserDao.class);
์ด ๋ถ๋ถ์ ๋ณ๋์ ๋ฉ์๋๋ก ์ฎ๊ธฐ๊ณ ํด๋น ๋ถ๋ถ ์์ @Before ์ ๋
ธํ
์ด์
์ ์ ์ด์ฃผ๋ฉด ๋๋ค. ์ด๋ฌํ ๋ฉ์๋๋ฅผ setUp()
์ด๋ผ๊ณ ํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด UserDaoTest์ ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋๊ณ ๋ ๊น๋ํ ๋๋์ ๋ฐ์ ์ ์๋ค. ๋ฌผ๋ก ํด๋น ๋ถ๋ถ์ Junit์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ด๋ค.
import org.junit.Before;
// ...
public class UserDaoTest {
private UserDao dao;
@Before
public void setUp() {
ApplicationContext context = new GenericXmlApplicationContextx("applicationContext.xml");
this.dao = context.getBean("UserDao", UserDao.class);
}
// ...
@Test
public void addAndGet() throws SQLException {
// ...
}
@Test
public void count() throws SQLException {
// ...
}
@Test(expected=EmptyResultDataAccessException.class)
public void getUserFailure() throws SQLException {
// ...
}
}
๋ฌผ๋ก ์์ ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ํด์๋ junit์ ๋์ ๋ฐฉ์์ ์ข ์์๋ด์ผํ๋ค.
- ํ ์คํธ ํด๋์ค์ @Test๊ฐ ๋ถ์ public์ด๊ณ voidํ์ด๋ฉฐ ํ๋ผ๋ฏธํฐ๊ฐ ์๋ ํ ์คํธ ๋ฉ์๋๋ฅผ ๋ชจ๋ ์ฐพ๋๋ค.
- ํ ์คํธ ํด๋์ค์ ์ค๋ธ์ ํธ๋ฅผ ํ๋ ๋ง๋ ๋ค.
- @Before๊ฐ ๋ถ์ ๋ฉ์๋๊ฐ ์์ผ๋ฉด ์คํํ๋ค.
- @Test๊ฐ ๋ถ์ ๋ฉ์๋๋ฅผ ํ๋ ํธ์ถํ๊ณ ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํด๋๋ค.
- @After๊ฐ ๋ถ์ ๋ฉ์๋๊ฐ ์์ผ๋ฉด ์คํํ๋ค.
- ๋๋จธ์ง ํ ์คํธ ๋ฉ์๋์ ๋ํด 2~5๋ฒ์ ๋ฐ๋ณตํ๋ค.
- ๋ชจ๋ ํ ์คํธ์ ๊ฒฐ๊ณผ๋ฅผ ์ข ํฉํด์ ๋๋ ค์ค๋ค.
์ค์ ๋ก๋ ์ด๋ณด๋ค ๋ ๋ณต์กํ๋ค๊ณ ํ๋ค. ๋๋ต์ ์ผ๋ก junit ํ ์คํธ๋ ์์ 7๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ ์งํ๋๋ค๊ณ ๋ณผ ์ ์๋ค.
๊ทผ๋ฐ ์ฌ๊ธฐ์ Before์ After๊ฐ ๋๋์ฒด ๋ญ๋? ์๊ฐ์ด ๋ค ์ ์๋๋ฐ, ํ ์คํธ ํ๊ธฐ ์ ์ ์คํํ๋ ๊ฒ์ Before, ํ ์คํธ๊ฐ ์คํ๋ ํ ์คํํ๋ ๊ฒ์ After๋ผ๊ณ ๋ณผ ์ ์๋ค.
์ฌ๊ธฐ์ Junit์ ํ ์คํธ๋ฅผ ์คํํ ๋๋ง๋ค ์๋ก์ด ์ค๋ธ์ ํธ๊ฐ ์์ฑ๋๊ฒ๋ ๋ง๋ค์ด์ ธ ์๋ค. ์ด์ ๋ ๊ฐ ํ ์คํธ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋จ์ ํ์คํ ๋ณด์ฅํ๊ธฐ ์ํด์๋ค. ๋ฌผ๋ก ๊ฒฝ์ฐ์ ๋ฐ๋ผ์ ํจ์จ์ ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ ์๋ ์์ผ๋ฉฐ ๊ณตํต์ ์ธ ํน์ฑ์ ์ง๋ ํ ์คํธ ๋ฉ์๋๋ฅผ ๋ชจ์์ ๋ณ๋์ ํ ์คํธ ํด๋์ค๋ก ๋ง๋๋ ๋ฐฉ๋ฒ๋ ์๊ฐํด๋ณผ ์ ์๋ค.
ํ ์คํธ๋ฅผ ์ํํ๋ ๋ฐ ํ์ํ ์ ๋ณด๋ ์ค๋ธ์ ํธ๋ฅผ ํฝ์ค์ฒ(fixture)๋ผ๊ณ ํ๋ค. ์ผ๋ฐ์ ์ผ๋ก ํฝ์ค์ฒ๋ ์ฌ๋ฌ ํ ์คํธ์์ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ @Before ๋ฉ์๋๋ฅผ ์ด์ฉํด ์์ฑํด์ฃผ๋ฉด ํธ๋ฆฌํ๋ค. UserDaoTest์์๋ dao๊ฐ ํฝ์ค์ฒ์ด๋ค.
public class UserDaoTest{
private UserDao dao;
private User user1;
private User user2;
private User user3;
@Before
public void setUp() {
//...
this.user1 = new User("gyumee", "๋ฐ์ฑ์ฒ ", "springno1");
this.user2 = new User("leegw700", "์ด๊ธธ์", "springno2");
this.user3 = new User("bumjin", "๋ฐ๋ฒ์ง", "springno3");
}
// ...
}
๐ ์นจํฌ์ ๊ธฐ์ ๊ณผ ๋น์นจํฌ์ ๊ธฐ์
์นจํฌ์ ๊ธฐ์ ์ ๊ธฐ์ ์ ์ ์ฉํ์ ๋ ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋์ ๊ธฐ์ ๊ด๋ จ API๊ฐ ๋ฑ์ฅํ๊ฑฐ๋ ํน์ ์ธํฐํ์ด์ค๋ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋๋ก ๊ฐ์ ํ๋ ๊ธฐ์ ์ ๋งํ๋ค. ์นจํฌ์ ๊ธฐ์ ์ ์ฌ์ฉํ๋ฉด ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋๊ฐ ํด๋น ๊ธฐ์ ์ ์ข
์๋๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์จ๋ค.
๋น์นจํฌ์ ๊ธฐ์ ์ ์ ํ๋ฆฌ์ผ์ด์
๋ก์ง์ ๋ด์ ์ฝ๋์ ์๋ฌด๋ฐ ์ํฅ์ ์ฃผ์ง ์๊ณ ์ ์ฉ์ด ๊ฐ๋ฅํ๋ค. ๋ฐ๋ผ์ ๊ธฐ์ ์ ์ข
์์ ์ด์ง ์์ ์์ํ ์ฝ๋๋ฅผ ์ ์งํ ์ ์๊ฒ ํด์ค๋ค.
์คํ๋ง์ ์ด๋ฐ ๋น์นจํฌ์ ์ธ ๊ธฐ์ ์ ๋ํ์ ์ธ ์์ด๋ค. (์ปจํ
์ด๋ ์๋ DIํ
์คํธ๊ฐ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์)
๐ ๋๋ฑ๋ถํ ๊ณผ ๊ฒฝ๊ณ๊ฐ ๋ถ์
- ๋๋ฑ๋ถํ
๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ ๊ฐ์ ๋ฒ์๋ฅผ ๊ตฌ๋ถํด์ ๊ฐ ๋ํ ๊ฐ์ผ๋ก ํ ์คํธ๋ฅผ ํ๋ ๋ฐฉ๋ฒ์ ๋งํ๋ค.
์ด๋ค ์์ ์ ๊ฒฐ๊ณผ true, false ๋๋ ์์ธ ๋ฐ์ ์ธ ๊ฐ์ง๋ผ๋ฉด ๊ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ด๋ ์ ๋ ฅ ๊ฐ์ด๋ ์ํฉ์ ์กฐํฉ์ ๋ง๋ค์ด ๋ชจ๋ ๊ฒฝ์ฐ์ ๋ํ ํ ์คํธ๋ฅผ ํด๋ณด๋ ๊ฒ์ด ์ข๋ค.
- ๊ฒฝ๊ณ๊ฐ ๋ถ์
- ์๋ฌ๋
๋๋ฑ๋ถํ ๋ฒ์์ ๊ฒฝ๊ณ์์ ์ฃผ๋ก ๋ง์ด ๋ฐ์ํ๋ค๋ ํน์ง์ ์ด์ฉํด์ ๊ฒฝ๊ณ์ ๊ทผ์ฒ์ ์๋ ๊ฐ์ ์ด์ฉํด ํ ์คํธ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๋ณดํต ์ซ์์ ์ ๋ ฅ ๊ฐ์ธ ๊ฒฝ์ฐ 0์ด๋ ๊ทธ ์ฃผ๋ณ ๊ฐ ๋๋ ์ ์์ ์ต๋๊ฐ, ์ต์๊ฐ ๋ฑ์ผ๋ก ํ ์คํธํด๋ณด๋ฉด ๋์์ด ๋ ๋๊ฐ ๋ง๋ค.
- ์๋ฌ๋