
๐ก ๋ง์ฝ ๋ฉ์๋์ ์ ๋ฌ๋ ํ๋ฆฌ๋ฏธํฐ ๊ฐ์ด ์์ ๋ ์ด๋ป๊ฒ ํด๊ฒฐํด์ผ ํ ๊น?
ํด๊ฒฐ ๋ฐฉ๋ฒ :
- null๊ณผ ๊ฐ์ ํน๋ณํ ๊ฐ์ ๋ฆฌํด
- ๊ฐ์ ํด๋นํ๋ ์ ๋ณด๋ฅผ ์ฐพ์ ์ ์๋ค๊ณ ์์ธ๋ฅผ ๋์ง๋ค.
1๋ฒ์ ๊ตฌํํ๊ธฐ ๊ฐ๋จํ๋ 2๋ฒ์ ์ฒ์ฒํ ๊ตฌํํด๋ณด์.
๋๋ฒ์งธ ๋ฐฉ๋ฒ์ ์ํด ํด๋นํ๋ ์ ๋ณด๊ฐ ์๋ค๋ ์๋ฏธ๋ฅผ ๊ฐ์ง ์์ธ ํด๋์ค๊ฐ ํ๋ ํ์ํ๋ฐ
์คํ๋ง์ด ๋ฏธ๋ฆฌ ์ ์ํด ๋์ ์์ธ๊ฐ ์กด์ฌํ๋ฉฐ ๊ฐ์ ธ๋ค ์จ๋ ๋๋ค.
์ง๊ธ๋ถํฐ UserDao์ get() ๋ฉ์๋์ ์ ๋ฌ๋ id๊ฐ์ ํด๋นํ๋ ์ฌ์ฉ์ ์ ๋ณด๊ฐ ์์ ๋
์์ธ๋ฅผ ๋์ ธ ํ ์คํธ ํด๋ณด์.
์์ธ ํด๋์ค๋ก๋ EmptyResultDataAccessException์ ์ฌ์ฉํ ๊ฑด๋ฐ,
๋จผ์ java.org.springframework.dao ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋์ง ํ์ธ์ ํด์ค์ผํ๋ค.
์ผ๋ฐ์ ์ธ ํ ์คํธ๋ ๋ค ์ํ์ด ์ํ๋๋ฉด ํ ์คํธ๋ฅผ ์ฑ๊ณต์ธ๋ฐ,
์์ธ์กฐ๊ฑด์ ๋ํ ํ ์คํธ๋ ๋ค๋ฅด๋ค.
์ด ํ ์คํธ๋ ๋ฐ๋๋ก ํ ์คํธ ์งํ ์ค์ ํน์ ์์ธ๊ฐ ๋์ ธ์ง๋ฉด ํ ์คํธ๊ฐ ์ฑ๊ณตํ ๊ฒ์ด๊ณ ,
์์ธ๊ฐ ๋์ ธ์ง์ง ์๊ณ ์ ์์ ์ผ๋ก ์์ ์ ๋ง์น๋ฉด ํ ์คํธ๊ฐ ์คํจํ๋ค๊ณ ํ๋จํ๋ค.
โ๏ธ ๊ตฌํ ๋ฐฉ๋ฒ
@Test ์ ๋ ธํ ์ด์ ์ expected ์จ๋ฆฌ๋จผํธ๋ฅผ ์ฌ์ฉํด์ฃผ๋ฉด ๋๋๋ฐ,
expected์ ํ ์คํธ ๋ฉ์๋ ์คํ ์ค์ ๋ฐ์ํ๋ฆฌ๋ผ ๊ธฐ๋ํ๋ ์์ธ ํด๋์ค๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
@Test(expected=ExceptionClass)
expected๋ฅผ ์ถ๊ฐํ๋ฉด ๋ณดํต์ ํ ์คํธ์ ๋ฐ๋๋ก
์ ์์ ์ผ๋ก ๋ฉ์๋๋ฅผ ๋ง์น๋ฉด ํ ์คํธ๊ฐ ์คํจํ๊ณ , expected์์ ์ง์ ํ ์์ธ๊ฐ ๋์ ธ์ง๋ฉด ํ ์คํธ๊ฐ ์ฑ๊ณตํ๋ค.
์์ธ์กฐ๊ฑด์ ๋ํ getUserFailure ํ ์คํธ ๋ฉ์๋
@Test(expected=EmptyResultDataAccessException.class)
public void getUserFailure() throws SQLException, ClassNotFoundException {
ApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);
UserDao dao = context.getBean("userDao", UserDao.class);
dao.deleteAll();
assertThat(dao.getCount(), is(0));
dao.get("unknown_id");
}
์์ ๊ฐ์ด ๋ณ๊ฒฝํด๋ ์์ง ํ ์คํธ๋ ์ฑ๊ณตํ์ง ์๋๋ค.
์๋ํ๋ฉด,
userDao์์ rs.next()๋ฅผ ์คํ ํ ๋ ๊ฐ์ ธ์ฌ ๋ก์ฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ SQLException์ด ๋ฐ์ํด
ํ ์คํธ ์ฝ๋๋ EmptyResultDataAccessException์ด ์๋ SQLException์ ๋ฐ์ ํ ์คํธ๊ฐ ์คํจํ๋ค๊ณ ๋ฐ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ UserDao์ get() ๋ฉ์๋์ ์ฝ๋๋ ์๋์ ๊ฐ์ด ์์ ์ ํด์ค์ผ ํ๋ค.
public User get(String id) throws ClassNotFoundException, SQLException {
Connection c = dataSource.getConnection();
PreparedStatement ps = c.prepareStatement(
"select * from users where id = ?");
ps.setString(1, id);
ResultSet rs = ps.executeQuery();
User user = null;
if(rs.next()) {
user = new User();
user.setId(rs.getString("id"));
user.setName(rs.getString("name"));
user.setPassword(rs.getString("password"));
}
rs.close();
ps.close();
c.close();
if(user==null) throw new EmptyResultDataAccessException(1);
//user์ ์๋ฌด๊ฐ๋ ์์ ์ EmptyResultDataAccessException ์์ธ๋ฅผ ๋์ ธ์ฃผ๋๋ก ํ์
return user;
}
๐ ์ ๋ฆฌ
์ด๋ ๊ฒ ๊ฐ๋จํ DAO๋ ๋ค์ํ ํ ์คํธ๋ฅผ ํ์ง ์์๋ ๊ด์ฐฎ์์ง๋ ๋ชจ๋ฅด์ง๋ง,
์ฝ๋ ๋ด์ฉ์ ์๊ด ์์ด ํฌ๊ด์ ์ธ ํ ์คํธ๋ฅผ ๋ง๋ค์ด๋๋ ํธํ ํจ์ฌ ์์ ํ๊ณ ์ ์ฉ
๋ํ ๊ฐ๋ฐ์๋ ํ ์คํธ๋ฅผ ์ง์ ๋ง๋ค ๋ ์ฑ๊ณตํ๋ ํ ์คํธ๋ง ๊ณจ๋ผ์ ๋ง๋ค์ง ์๋๋ก ์ฃผ์ํด์ผ ํ๋ค.
"๋ด PC์์๋ ์ ๋๋๋ฐ"๋ผ๋ ๋ณ๋ช ์ ํ์ง ์๋๋ก ํด์ผํ๋ค.
์คํ๋ง์ ์ฐฝ์์์ธ ๋ก๋ ์กด์จ์ด ํ ๋ง ์ฒ๋ผ 'ํญ์ ๋ค๊ฑฐํฐ๋ธ ํ ์คํธ๋ฅผ ๋จผ์ ๋ง๋ค๋ผ' ๋ฅผ ๊ธฐ์ตํ๋ฉฐ,
ํ ์คํธ๋ฅผ ์์ฑํ ๋ ๋ถ์ ์ ์ธ ์ผ์ด์ค๋ฅผ ๋จผ์ ๋ง๋๋ ์ต๊ด์ ๋ค์ด์!!
์ฝ๋ ์ ์ฅ์ : https://github.com/withseungryu
withseungryu - Overview
exchange student at georgia college & state university - withseungryu
github.com
์ฐธ๊ณ ๋ฌธ์ :
ํ ๋น์ ์คํ๋ง3 (์ด์ผ๋ฏผ)
'Back-end > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] JUnit - @Before, @After (0) | 2020.08.12 |
---|---|
[Spring] ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ (TDD) (0) | 2020.08.12 |
[Spring] ํ ์คํธ ์๋ํ - JUnit ๋๊ตฌ ํ์ฉ (0) | 2020.08.06 |
[Spring] XML์ ์ด์ฉํ DI ์์กด๊ด๊ณ ์ค์ ์ ๋ณด (0) | 2020.08.02 |
[Spring] ์์กด์ฑ ์ฃผ์ - DI (0) | 2020.08.02 |