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