diff --git a/src/applicationContext.xml b/src/applicationContext.xml index d23de1d..f377083 100644 --- a/src/applicationContext.xml +++ b/src/applicationContext.xml @@ -17,6 +17,11 @@ + + + + diff --git a/src/springbook/user/dao/UserDaoJdbc.java b/src/springbook/user/dao/UserDaoJdbc.java index 399d4cd..0cbc794 100644 --- a/src/springbook/user/dao/UserDaoJdbc.java +++ b/src/springbook/user/dao/UserDaoJdbc.java @@ -1,5 +1,11 @@ package springbook.user.dao; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; +import javax.sql.DataSource; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.PreparedStatementCreator; @@ -8,13 +14,6 @@ import springbook.user.domain.Level; import springbook.user.domain.User; -import javax.sql.DataSource; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; - public class UserDaoJdbc implements UserDao { private JdbcTemplate jdbcTemplate; @@ -39,8 +38,10 @@ public User mapRow(ResultSet rs, int rowNum) throws SQLException { public void add(final User user) { - this.jdbcTemplate.update("insert into users(id, name, password, level, login, recommend) values(?, ? , ?,?,?, ?)", - user.getId(), user.getName(), user.getPassword(), user.getLevel().intValue(), user.getLogin(), user.getRecommend()); + this.jdbcTemplate.update( + "insert into users(id, name, password, level, login, recommend, email) values(?, ?, ?, ?, ?, ?, ?)", + user.getId(), user.getName(), user.getPassword(), user.getLevel().intValue(), user.getLogin(), + user.getRecommend(), user.getEmail()); } @@ -56,8 +57,8 @@ public List getAll() { public void update(User user) { this.jdbcTemplate.update( "update users set name = ?, password = ?, level = ?, login = ?," + - "recommend = ? where id = ?", user.getName(), user.getPassword(), - user.getLevel().intValue(), user.getLogin(), user.getRecommend(), + "recommend = ?, email = ? where id = ?", user.getName(), user.getPassword(), + user.getLevel().intValue(), user.getLogin(), user.getRecommend(), user.getEmail(), user.getId()); } diff --git a/src/springbook/user/dao/UserDaoTest.java b/src/springbook/user/dao/UserDaoTest.java index 5ede7a2..51d8cd1 100644 --- a/src/springbook/user/dao/UserDaoTest.java +++ b/src/springbook/user/dao/UserDaoTest.java @@ -1,5 +1,11 @@ package springbook.user.dao; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +import java.sql.SQLException; +import java.util.List; +import javax.sql.DataSource; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -14,13 +20,6 @@ import springbook.user.domain.Level; import springbook.user.domain.User; -import javax.sql.DataSource; -import java.sql.SQLException; -import java.util.List; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; - @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "/test-applicationContext.xml") public class UserDaoTest { @@ -35,13 +34,13 @@ public class UserDaoTest { @Before public void setUp() { - this.user1 = new User("aaaa", "운가용", "sleep", Level.BASIC, 1, 0); - this.user2 = new User("aaab", "로지지징", "gohome", Level.SILVER, 55, 10); - this.user3 = new User("aaac", "메롱", "iiii", Level.GOLD, 100, 40); + this.user1 = new User("aaaa", "운가용", "sleep", "user1@email.com", Level.BASIC, 1, 0); + this.user2 = new User("aaab", "로지지징", "gohome", "user2@email.com", Level.SILVER, 55, 10); + this.user3 = new User("aaac", "메롱", "iiii", "user3@eamil.com", Level.GOLD, 100, 40); } @Test // Junit에게 테스트용 메소드임을 알려준다. - public void addAndGet() throws SQLException, ClassNotFoundException { // JUnit 테스트 메소드는 반드시 public으로 선언돼야한다. + public void addAndGet() { // JUnit 테스트 메소드는 반드시 public으로 선언돼야한다. dao.deleteAll(); assertThat(dao.getCount(), is(0)); dao.add(user1); @@ -139,8 +138,7 @@ public void sqlExceptionTranslate() { } @Test - public void update() - { + public void update() { dao.deleteAll(); dao.add(user1); @@ -155,6 +153,7 @@ public void update() user1.setLevel(Level.GOLD); user1.setLogin(1000); user1.setRecommend(999); + user1.setEmail("hihi@email.com"); dao.update(user1); User user1update = dao.get(user1.getId()); diff --git a/src/springbook/user/domain/User.java b/src/springbook/user/domain/User.java index 3425409..29b7908 100644 --- a/src/springbook/user/domain/User.java +++ b/src/springbook/user/domain/User.java @@ -4,6 +4,7 @@ public class User { String id; String name; String password; + String email; Level level; int login; int recommend; @@ -11,16 +12,16 @@ public class User { public User() { } - public User(String id, String name, String password, Level level, int login, int recommend) { + public User(String id, String name, String password, String email, Level level, int login, int recommend) { this.id = id; this.name = name; this.password = password; + this.email = email; this.level = level; this.login = login; this.recommend = recommend; } - public String getId() { return id; } @@ -69,6 +70,14 @@ public void setRecommend(int recommend) { this.recommend = recommend; } + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + public void upgradeLevel() { Level nextLevel = this.level.nextLevel(); if (nextLevel == null) { diff --git a/src/springbook/user/service/UserService.java b/src/springbook/user/service/UserService.java index a590b96..b5d1cc6 100644 --- a/src/springbook/user/service/UserService.java +++ b/src/springbook/user/service/UserService.java @@ -1,14 +1,19 @@ package springbook.user.service; +import java.util.List; +import javax.sql.DataSource; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.transaction.PlatformTransactionManager; +import org.springframework.transaction.TransactionStatus; +import org.springframework.transaction.support.DefaultTransactionDefinition; import springbook.user.dao.UserDao; import springbook.user.domain.Level; import springbook.user.domain.User; -import java.util.List; - public class UserService { UserDao userDao; UserLevelUpgradePolicy userLevelUpgradePolicy; + PlatformTransactionManager transactionManager; public void setUserDao(UserDao userDao) { this.userDao = userDao; @@ -18,6 +23,10 @@ public void setUserLevelUpgradePolicy(UserLevelUpgradePolicy userLevelUpgradePol this.userLevelUpgradePolicy = userLevelUpgradePolicy; } + public void setTransactionManager(PlatformTransactionManager transactionManager) { + this.transactionManager = transactionManager; + } + public void add(User user) { if (user.getLevel() == null) { user.setLevel(Level.BASIC); @@ -26,12 +35,23 @@ public void add(User user) { } public void upgradeLevels() { - List users = userDao.getAll(); - for (User user : users) { - if (userLevelUpgradePolicy.canUpgradeLevel(user)) { - userLevelUpgradePolicy.upgradeLevel(user); - userDao.update(user); + TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition()); + try { + List users = userDao.getAll(); + for (User user : users) { + upgradeLevel(user); } + transactionManager.commit(status); + } catch (Exception e) { + transactionManager.rollback(status); + throw e; + } + } + + protected void upgradeLevel(User user) { + if (userLevelUpgradePolicy.canUpgradeLevel(user)) { + userLevelUpgradePolicy.upgradeLevel(user); + userDao.update(user); } } } diff --git a/src/springbook/user/service/UserServiceTest.java b/src/springbook/user/service/UserServiceTest.java index 130682f..5d71c83 100644 --- a/src/springbook/user/service/UserServiceTest.java +++ b/src/springbook/user/service/UserServiceTest.java @@ -1,49 +1,77 @@ package springbook.user.service; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.fail; +import static springbook.user.service.UserLevelUpgradePolicyImpl.MIN_LOGCOUNT_FOR_SILVER; +import static springbook.user.service.UserLevelUpgradePolicyImpl.MIN_RECCOMENT_FOR_GOLD; + +import java.util.Arrays; +import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.transaction.PlatformTransactionManager; import springbook.user.dao.UserDao; import springbook.user.domain.Level; import springbook.user.domain.User; -import java.util.Arrays; -import java.util.List; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; -import static springbook.user.service.UserLevelUpgradePolicyImpl.MIN_LOGCOUNT_FOR_SILVER; -import static springbook.user.service.UserLevelUpgradePolicyImpl.MIN_RECCOMENT_FOR_GOLD; - @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "/test-applicationContext.xml") public class UserServiceTest { + static class TestUserService extends UserService { + private String id; + + private TestUserService(String id) { + this.id = id; + } + + @Override + protected void upgradeLevel(User user) { + if (user.getId().equals(this.id)) { + throw new TestUserServiceException(); + } + super.upgradeLevel(user); + } + } + + static class TestUserServiceException extends RuntimeException { + } + @Autowired UserService userService; @Autowired UserDao userDao; + @Autowired + UserLevelUpgradePolicy userLevelUpgradePolicy; + + @Autowired + PlatformTransactionManager transactionManager; + List users; @Before public void setUp() { users = Arrays.asList( - new User("kayoung", "윤가영", "p1", Level.BASIC, MIN_LOGCOUNT_FOR_SILVER - 1, 0), - new User("haneul", "이하늘", "p2", Level.BASIC, MIN_LOGCOUNT_FOR_SILVER, 0), - new User("oieuoa", "윤실버", "p3", Level.SILVER, 60, MIN_RECCOMENT_FOR_GOLD - 1), - new User("silversky", "스카이", "p4", Level.SILVER, 60, MIN_RECCOMENT_FOR_GOLD), - new User("blue", "교수님", "p5", Level.GOLD, 100, Integer.MAX_VALUE) + new User("kayoung", "윤가영", "p1", "kayoung@email.com", Level.BASIC, MIN_LOGCOUNT_FOR_SILVER - 1, 0), + new User("haneul", "이하늘", "p2", "haneul@email.com", Level.BASIC, MIN_LOGCOUNT_FOR_SILVER, 0), + new User("oieuoa", "윤실버", "p3", "oieuoa@email.com", Level.SILVER, 60, MIN_RECCOMENT_FOR_GOLD - 1), + new User("silversky", "스카이", "p4", "silverskey@email.com", Level.SILVER, 60, MIN_RECCOMENT_FOR_GOLD), + new User("blue", "교수님", "p5", "blue@email.com", Level.GOLD, 100, Integer.MAX_VALUE) ); } @Test - public void upgradeLevels() { + public void upgradeLevels() throws Exception { userDao.deleteAll(); - for (User user : users) userDao.add(user); + for (User user : users) { + userDao.add(user); + } userService.upgradeLevels(); @@ -82,4 +110,22 @@ private void checkLevelUpgraded(User user, Boolean upgraded) { } } + @Test + public void upgradeAllOrNothing() { + // user fixture 사용 + TestUserService testUserService = new TestUserService(users.get(3).getId()); + testUserService.setUserDao(this.userDao); // userDao를 수동 DI해줌 + testUserService.setUserLevelUpgradePolicy(this.userLevelUpgradePolicy); + testUserService.setTransactionManager(transactionManager); + userDao.deleteAll(); + for (User user : users) { + userDao.add(user); + } + try { + testUserService.upgradeLevels(); + fail("TetUserSericeException expected"); + } catch (TestUserServiceException e) { + } + checkLevelUpgraded(users.get(1), false); + } } \ No newline at end of file diff --git a/src/test-applicationContext.xml b/src/test-applicationContext.xml index 1c9f56b..393177a 100644 --- a/src/test-applicationContext.xml +++ b/src/test-applicationContext.xml @@ -18,6 +18,11 @@ + + + +