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 @@
+
+
+
+