diff --git a/pom.xml b/pom.xml
index d3d9d1852..dd5e99667 100644
--- a/pom.xml
+++ b/pom.xml
@@ -11,7 +11,6 @@
UTF-8
4.2.5.RELEASE
- 8.0.15
@@ -39,7 +38,7 @@
com.google.guava
guava
- 18.0
+ 29.0-jre
@@ -83,7 +82,7 @@
com.fasterxml.jackson.core
jackson-databind
- 2.4.4
+ 2.11.0
@@ -91,19 +90,19 @@
org.apache.tomcat.embed
tomcat-embed-core
- ${tomcat.version}
+ 8.5.57
provided
org.apache.tomcat.embed
tomcat-embed-logging-juli
- ${tomcat.version}
+ 8.0.30
provided
org.apache.tomcat.embed
tomcat-embed-jasper
- ${tomcat.version}
+ 8.5.57
provided
diff --git a/src/main/java/core/jdbc/DataAccessException.java b/src/main/java/core/jdbc/DataAccessException.java
new file mode 100644
index 000000000..4f7a576c3
--- /dev/null
+++ b/src/main/java/core/jdbc/DataAccessException.java
@@ -0,0 +1,25 @@
+package core.jdbc;
+
+public class DataAccessException extends RuntimeException {
+ private static final long serialVersionUID = 1L;
+
+ public DataAccessException() {
+ super();
+ }
+
+ public DataAccessException(final String message, final Throwable cause, final boolean enableSuppression, final boolean writableStackTrace) {
+ super(message, cause, enableSuppression, writableStackTrace);
+ }
+
+ public DataAccessException(final String message, final Throwable cause) {
+ super(message, cause);
+ }
+
+ public DataAccessException(final String message) {
+ super(message);
+ }
+
+ public DataAccessException(final Throwable cause) {
+ super(cause);
+ }
+}
diff --git a/src/main/java/core/jdbc/JdbcTemplate.java b/src/main/java/core/jdbc/JdbcTemplate.java
new file mode 100644
index 000000000..ae6987f43
--- /dev/null
+++ b/src/main/java/core/jdbc/JdbcTemplate.java
@@ -0,0 +1,68 @@
+package core.jdbc;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+public class JdbcTemplate {
+
+ public void update(String sql, PreparedStatementSetter pss) throws DataAccessException {
+ try (Connection con = ConnectionManager.getConnection();
+ PreparedStatement pstmt = con.prepareStatement(sql)) {
+ pss.setValues(pstmt);
+ pstmt.executeUpdate();
+ } catch (SQLException e) {
+ throw new DataAccessException(e);
+ }
+ }
+
+ public void update(String sql, Object... parameters) throws DataAccessException {
+ try (Connection con = ConnectionManager.getConnection();
+ PreparedStatement pstmt = con.prepareStatement(sql)) {
+ for (int i = 0; i < parameters.length; i++) {
+ pstmt.setObject(i + 1, parameters[i]);
+ }
+ pstmt.executeUpdate();
+ } catch (SQLException e) {
+ throw new DataAccessException(e);
+ }
+ }
+
+ public List query(String sql, PreparedStatementSetter pss, RowMapper rowMapper) throws SQLException {
+ Connection con = null;
+ PreparedStatement pstmt = null;
+ ResultSet rs = null;
+ try {
+ con = ConnectionManager.getConnection();
+ pstmt = con.prepareStatement(sql);
+ pss.setValues(pstmt);
+ rs = pstmt.executeQuery();
+ List result = new ArrayList();
+ while (rs.next()) {
+ result.add(rowMapper.mapRow(rs));
+ }
+ return result;
+ } finally {
+ if (rs != null) {
+ rs.close();
+ }
+ if (pstmt != null) {
+ pstmt.close();
+ }
+ if (con != null) {
+ con.close();
+ }
+ }
+ }
+
+ public T queryForObject(String sql, PreparedStatementSetter pss, RowMapper rowMapper) throws SQLException {
+ List result = query(sql, pss, rowMapper);
+ if (result.isEmpty()) {
+ return null;
+ }
+ return result.get(0);
+ }
+}
diff --git a/src/main/java/core/jdbc/PreparedStatementSetter.java b/src/main/java/core/jdbc/PreparedStatementSetter.java
new file mode 100644
index 000000000..d327f197f
--- /dev/null
+++ b/src/main/java/core/jdbc/PreparedStatementSetter.java
@@ -0,0 +1,12 @@
+package core.jdbc;
+
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+/**
+ * callback interface
+ */
+public interface PreparedStatementSetter {
+
+ void setValues(final PreparedStatement pstmt) throws SQLException;
+}
diff --git a/src/main/java/core/jdbc/RowMapper.java b/src/main/java/core/jdbc/RowMapper.java
new file mode 100644
index 000000000..b09685e4a
--- /dev/null
+++ b/src/main/java/core/jdbc/RowMapper.java
@@ -0,0 +1,13 @@
+package core.jdbc;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+/**
+ * callback interface
+ */
+@FunctionalInterface
+public interface RowMapper {
+
+ T mapRow(final ResultSet rs) throws SQLException;
+}
diff --git a/src/main/java/next/controller/CreateUserController.java b/src/main/java/next/controller/CreateUserController.java
index d0be7723a..709b0742f 100644
--- a/src/main/java/next/controller/CreateUserController.java
+++ b/src/main/java/next/controller/CreateUserController.java
@@ -1,14 +1,14 @@
package next.controller;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import core.jdbc.DataAccessException;
+import core.mvc.Controller;
+import next.dao.UserDao;
+import next.model.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import core.db.DataBase;
-import core.mvc.Controller;
-import next.model.User;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
public class CreateUserController implements Controller {
private static final Logger log = LoggerFactory.getLogger(CreateUserController.class);
@@ -17,9 +17,14 @@ public class CreateUserController implements Controller {
public String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
User user = new User(req.getParameter("userId"), req.getParameter("password"), req.getParameter("name"),
req.getParameter("email"));
- log.debug("User : {}", user);
- DataBase.addUser(user);
+ UserDao userDao = new UserDao();
+ try {
+ userDao.insert(user);
+ } catch (DataAccessException e) {
+ log.error(e.getMessage());
+ }
+
return "redirect:/";
}
}
diff --git a/src/main/java/next/controller/HomeController.java b/src/main/java/next/controller/HomeController.java
index ef0a42728..38cac3326 100644
--- a/src/main/java/next/controller/HomeController.java
+++ b/src/main/java/next/controller/HomeController.java
@@ -1,15 +1,16 @@
package next.controller;
+import core.mvc.Controller;
+import next.dao.UserDao;
+
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import core.db.DataBase;
-import core.mvc.Controller;
-
public class HomeController implements Controller {
@Override
public String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
- req.setAttribute("users", DataBase.findAll());
+ UserDao userDao = new UserDao();
+ req.setAttribute("users", userDao.findAll());
return "home.jsp";
}
}
diff --git a/src/main/java/next/controller/ListUserController.java b/src/main/java/next/controller/ListUserController.java
index d1b95ae2f..6d04a072c 100644
--- a/src/main/java/next/controller/ListUserController.java
+++ b/src/main/java/next/controller/ListUserController.java
@@ -1,11 +1,11 @@
package next.controller;
+import core.mvc.Controller;
+import next.dao.UserDao;
+
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import core.db.DataBase;
-import core.mvc.Controller;
-
public class ListUserController implements Controller {
@Override
public String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
@@ -13,7 +13,8 @@ public String execute(HttpServletRequest req, HttpServletResponse resp) throws E
return "redirect:/users/loginForm";
}
- req.setAttribute("users", DataBase.findAll());
+ UserDao userDao = new UserDao();
+ req.setAttribute("users", userDao.findAll());
return "/user/list.jsp";
}
}
diff --git a/src/main/java/next/controller/LoginController.java b/src/main/java/next/controller/LoginController.java
index abd0d3572..423d7c33a 100644
--- a/src/main/java/next/controller/LoginController.java
+++ b/src/main/java/next/controller/LoginController.java
@@ -1,19 +1,20 @@
package next.controller;
+import core.mvc.Controller;
+import next.dao.UserDao;
+import next.model.User;
+
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
-import core.db.DataBase;
-import core.mvc.Controller;
-import next.model.User;
-
public class LoginController implements Controller {
@Override
public String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
String userId = req.getParameter("userId");
String password = req.getParameter("password");
- User user = DataBase.findUserById(userId);
+ UserDao userDao = new UserDao();
+ User user = userDao.findByUserId(userId);
if (user == null) {
req.setAttribute("loginFailed", true);
return "/user/login.jsp";
diff --git a/src/main/java/next/controller/ProfileController.java b/src/main/java/next/controller/ProfileController.java
index 10819e15b..a67fc942c 100644
--- a/src/main/java/next/controller/ProfileController.java
+++ b/src/main/java/next/controller/ProfileController.java
@@ -1,17 +1,18 @@
package next.controller;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import core.db.DataBase;
import core.mvc.Controller;
+import next.dao.UserDao;
import next.model.User;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
public class ProfileController implements Controller {
@Override
public String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
String userId = req.getParameter("userId");
- User user = DataBase.findUserById(userId);
+ UserDao userDao = new UserDao();
+ User user = userDao.findByUserId(userId);
if (user == null) {
throw new NullPointerException("사용자를 찾을 수 없습니다.");
}
diff --git a/src/main/java/next/controller/UpdateFormUserController.java b/src/main/java/next/controller/UpdateFormUserController.java
index 3b1a2594a..96be02780 100644
--- a/src/main/java/next/controller/UpdateFormUserController.java
+++ b/src/main/java/next/controller/UpdateFormUserController.java
@@ -1,18 +1,19 @@
package next.controller;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import core.db.DataBase;
import core.mvc.Controller;
+import next.dao.UserDao;
import next.model.User;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
public class UpdateFormUserController implements Controller {
@Override
public String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
String userId = req.getParameter("userId");
- User user = DataBase.findUserById(userId);
+ UserDao userDao = new UserDao();
+ User user = userDao.findByUserId(userId);
if (!UserSessionUtils.isSameUser(req.getSession(), user)) {
throw new IllegalStateException("다른 사용자의 정보를 수정할 수 없습니다.");
}
diff --git a/src/main/java/next/controller/UpdateUserController.java b/src/main/java/next/controller/UpdateUserController.java
index f9b45244d..f50ff5d67 100644
--- a/src/main/java/next/controller/UpdateUserController.java
+++ b/src/main/java/next/controller/UpdateUserController.java
@@ -1,21 +1,22 @@
package next.controller;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
+import core.mvc.Controller;
+import next.dao.UserDao;
+import next.model.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import core.db.DataBase;
-import core.mvc.Controller;
-import next.model.User;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
public class UpdateUserController implements Controller {
private static final Logger log = LoggerFactory.getLogger(UpdateUserController.class);
@Override
public String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception {
- User user = DataBase.findUserById(req.getParameter("userId"));
+ String userId = req.getParameter("userId");
+ UserDao userDao = new UserDao();
+ User user = userDao.findByUserId(userId);
if (!UserSessionUtils.isSameUser(req.getSession(), user)) {
throw new IllegalStateException("다른 사용자의 정보를 수정할 수 없습니다.");
}
diff --git a/src/main/java/next/dao/UserDao.java b/src/main/java/next/dao/UserDao.java
index db270861f..0dd268350 100644
--- a/src/main/java/next/dao/UserDao.java
+++ b/src/main/java/next/dao/UserDao.java
@@ -1,78 +1,51 @@
package next.dao;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
+import core.jdbc.JdbcTemplate;
+import core.jdbc.PreparedStatementSetter;
+import core.jdbc.RowMapper;
+import next.model.User;
+
import java.sql.ResultSet;
import java.sql.SQLException;
-import java.util.ArrayList;
import java.util.List;
-import core.jdbc.ConnectionManager;
-import next.model.User;
-
public class UserDao {
- public void insert(User user) throws SQLException {
- Connection con = null;
- PreparedStatement pstmt = null;
- try {
- con = ConnectionManager.getConnection();
- String sql = "INSERT INTO USERS VALUES (?, ?, ?, ?)";
- pstmt = con.prepareStatement(sql);
- pstmt.setString(1, user.getUserId());
- pstmt.setString(2, user.getPassword());
- pstmt.setString(3, user.getName());
- pstmt.setString(4, user.getEmail());
-
- pstmt.executeUpdate();
- } finally {
- if (pstmt != null) {
- pstmt.close();
- }
-
- if (con != null) {
- con.close();
- }
- }
+ public void insert(User user) {
+ JdbcTemplate jdbcTemplate = new JdbcTemplate();
+ String sql = "INSERT INTO USERS VALUES (?, ?, ?, ?)";
+ jdbcTemplate.update(sql, user.getUserId(), user.getPassword(), user.getName(), user.getEmail());
}
- public void update(User user) throws SQLException {
- // TODO 구현 필요함.
+ public void update(User user) {
+ JdbcTemplate jdbcTemplate = new JdbcTemplate();
+ String sql = "UPDATE USERS SET password = ?, name = ?, email = ? WHERE userId = ?";
+ jdbcTemplate.update(sql, user.getPassword(), user.getName(), user.getEmail(), user.getUserId());
}
public List findAll() throws SQLException {
- // TODO 구현 필요함.
- return new ArrayList();
+ JdbcTemplate jdbcTemplate = new JdbcTemplate();
+ PreparedStatementSetter pss = pstmt -> {
+ };
+ RowMapper rowMapper = (ResultSet rs) -> new User(
+ rs.getString("userId"),
+ rs.getString("password"),
+ rs.getString("name"),
+ rs.getString("email"));
+
+ String sql = "SELECT userId, password, name, email FROM USERS";
+ return jdbcTemplate.query(sql, pss, rowMapper);
}
public User findByUserId(String userId) throws SQLException {
- Connection con = null;
- PreparedStatement pstmt = null;
- ResultSet rs = null;
- try {
- con = ConnectionManager.getConnection();
- String sql = "SELECT userId, password, name, email FROM USERS WHERE userid=?";
- pstmt = con.prepareStatement(sql);
- pstmt.setString(1, userId);
-
- rs = pstmt.executeQuery();
-
- User user = null;
- if (rs.next()) {
- user = new User(rs.getString("userId"), rs.getString("password"), rs.getString("name"),
- rs.getString("email"));
- }
-
- return user;
- } finally {
- if (rs != null) {
- rs.close();
- }
- if (pstmt != null) {
- pstmt.close();
- }
- if (con != null) {
- con.close();
- }
- }
+ JdbcTemplate jdbcTemplate = new JdbcTemplate();
+ PreparedStatementSetter pss = pstmt -> pstmt.setString(1, userId);
+ RowMapper rowMapper = (ResultSet rs) -> new User(
+ rs.getString("userId"),
+ rs.getString("password"),
+ rs.getString("name"),
+ rs.getString("email"));
+
+ String sql = "SELECT userId, password, name, email FROM USERS WHERE userid = ?";
+ return jdbcTemplate.queryForObject(sql, pss, rowMapper);
}
}
diff --git a/src/test/java/next/dao/UserDaoTest.java b/src/test/java/next/dao/UserDaoTest.java
index a68f75a8c..e3aa99639 100644
--- a/src/test/java/next/dao/UserDaoTest.java
+++ b/src/test/java/next/dao/UserDaoTest.java
@@ -1,17 +1,16 @@
package next.dao;
-import static org.junit.Assert.assertEquals;
-
-import java.util.List;
-
+import core.jdbc.ConnectionManager;
+import next.model.User;
import org.junit.Before;
import org.junit.Test;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils;
import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
-import core.jdbc.ConnectionManager;
-import next.model.User;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
public class UserDaoTest {
@Before