From 9032a4a17487d66d783bd9ef542859e4466661a5 Mon Sep 17 00:00:00 2001 From: Gyumin Kim Date: Mon, 27 Jul 2020 06:20:17 +0900 Subject: [PATCH 1/7] =?UTF-8?q?7.1=20=ED=9A=8C=EC=9B=90=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=EB=A5=BC=20DB=EC=97=90=20=EC=A0=80=EC=9E=A5?= =?UTF-8?q?=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * `UserDao`: `update`, `findAll` 구현 * controller에서 `DataBase` 대신 `UserDao` 사용 --- .../next/controller/CreateUserController.java | 21 ++++--- .../java/next/controller/HomeController.java | 9 +-- .../next/controller/ListUserController.java | 9 +-- .../java/next/controller/LoginController.java | 11 ++-- .../next/controller/ProfileController.java | 11 ++-- .../controller/UpdateFormUserController.java | 11 ++-- .../next/controller/UpdateUserController.java | 15 ++--- src/main/java/next/dao/UserDao.java | 57 ++++++++++++++++--- 8 files changed, 98 insertions(+), 46 deletions(-) diff --git a/src/main/java/next/controller/CreateUserController.java b/src/main/java/next/controller/CreateUserController.java index d0be7723a..583800223 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.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; +import java.sql.SQLException; 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 (SQLException 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..6002caa84 100644 --- a/src/main/java/next/dao/UserDao.java +++ b/src/main/java/next/dao/UserDao.java @@ -1,5 +1,8 @@ package next.dao; +import core.jdbc.ConnectionManager; +import next.model.User; + import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -7,9 +10,6 @@ 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; @@ -28,7 +28,6 @@ public void insert(User user) throws SQLException { if (pstmt != null) { pstmt.close(); } - if (con != null) { con.close(); } @@ -36,12 +35,54 @@ public void insert(User user) throws SQLException { } public void update(User user) throws SQLException { - // TODO 구현 필요함. + Connection con = null; + PreparedStatement pstmt = null; + try { + con = ConnectionManager.getConnection(); + String sql = "UPDATE USERS SET password = ?, name = ?, email = ? WHERE userId = ?"; + pstmt = con.prepareStatement(sql); + pstmt.setString(1, user.getPassword()); + pstmt.setString(2, user.getName()); + pstmt.setString(3, user.getEmail()); + pstmt.setString(4, user.getUserId()); + pstmt.executeUpdate(); + } finally { + if (pstmt != null) { + pstmt.close(); + } + if (con != null) { + con.close(); + } + } } public List findAll() throws SQLException { - // TODO 구현 필요함. - return new ArrayList(); + Connection con = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + try { + con = ConnectionManager.getConnection(); + String sql = "SELECT userId, password, name, email FROM USERS"; + pstmt = con.prepareStatement(sql); + rs = pstmt.executeQuery(); + List users = new ArrayList<>(); + if (rs.next()) { + User user = new User(rs.getString("userId"), rs.getString("password"), rs.getString("name"), + rs.getString("email")); + users.add(user); + } + return users; + } finally { + if (rs != null) { + rs.close(); + } + if (pstmt != null) { + pstmt.close(); + } + if (con != null) { + con.close(); + } + } } public User findByUserId(String userId) throws SQLException { @@ -50,7 +91,7 @@ public User findByUserId(String userId) throws SQLException { ResultSet rs = null; try { con = ConnectionManager.getConnection(); - String sql = "SELECT userId, password, name, email FROM USERS WHERE userid=?"; + String sql = "SELECT userId, password, name, email FROM USERS WHERE userid = ?"; pstmt = con.prepareStatement(sql); pstmt.setString(1, userId); From 2b97199208a0749397319e786bc0ee8448de3721 Mon Sep 17 00:00:00 2001 From: Gyumin Kim Date: Tue, 28 Jul 2020 23:53:04 +0900 Subject: [PATCH 2/7] =?UTF-8?q?7.2=20DAO=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * `JdbcTemplate` 생성, `UserDao`에서 익명 클래스로 구현 --- src/main/java/core/jdbc/JdbcTemplate.java | 32 ++++++++++++ src/main/java/next/dao/UserDao.java | 62 ++++++++++------------- 2 files changed, 59 insertions(+), 35 deletions(-) create mode 100644 src/main/java/core/jdbc/JdbcTemplate.java diff --git a/src/main/java/core/jdbc/JdbcTemplate.java b/src/main/java/core/jdbc/JdbcTemplate.java new file mode 100644 index 000000000..3e230a4b3 --- /dev/null +++ b/src/main/java/core/jdbc/JdbcTemplate.java @@ -0,0 +1,32 @@ +package core.jdbc; + +import next.model.User; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public abstract class JdbcTemplate { + + public void update(final User user) throws SQLException { + Connection con = null; + PreparedStatement pstmt = null; + try { + con = ConnectionManager.getConnection(); + String sql = createQuery(); + pstmt = con.prepareStatement(sql); + setValues(user, pstmt); + pstmt.executeUpdate(); + } finally { + if (pstmt != null) { + pstmt.close(); + } + if (con != null) { + con.close(); + } + } + } + + public abstract String createQuery(); + public abstract void setValues(final User user, final PreparedStatement pstmt) throws SQLException; +} diff --git a/src/main/java/next/dao/UserDao.java b/src/main/java/next/dao/UserDao.java index 6002caa84..de7c1e70e 100644 --- a/src/main/java/next/dao/UserDao.java +++ b/src/main/java/next/dao/UserDao.java @@ -1,6 +1,7 @@ package next.dao; import core.jdbc.ConnectionManager; +import core.jdbc.JdbcTemplate; import next.model.User; import java.sql.Connection; @@ -12,48 +13,39 @@ 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(); + JdbcTemplate jdbcTemplate = new JdbcTemplate() { + @Override + public String createQuery() { + return "INSERT INTO USERS VALUES (?, ?, ?, ?)"; } - if (con != null) { - con.close(); + + @Override + public void setValues(final User user, final PreparedStatement pstmt) throws SQLException { + pstmt.setString(1, user.getUserId()); + pstmt.setString(2, user.getPassword()); + pstmt.setString(3, user.getName()); + pstmt.setString(4, user.getEmail()); } - } + }; + jdbcTemplate.update(user); } public void update(User user) throws SQLException { - Connection con = null; - PreparedStatement pstmt = null; - try { - con = ConnectionManager.getConnection(); - String sql = "UPDATE USERS SET password = ?, name = ?, email = ? WHERE userId = ?"; - pstmt = con.prepareStatement(sql); - pstmt.setString(1, user.getPassword()); - pstmt.setString(2, user.getName()); - pstmt.setString(3, user.getEmail()); - pstmt.setString(4, user.getUserId()); - pstmt.executeUpdate(); - } finally { - if (pstmt != null) { - pstmt.close(); + JdbcTemplate jdbcTemplate = new JdbcTemplate() { + @Override + public String createQuery() { + return "UPDATE USERS SET password = ?, name = ?, email = ? WHERE userId = ?"; } - if (con != null) { - con.close(); + + @Override + public void setValues(final User user, final PreparedStatement pstmt) throws SQLException { + pstmt.setString(1, user.getPassword()); + pstmt.setString(2, user.getName()); + pstmt.setString(3, user.getEmail()); + pstmt.setString(4, user.getUserId()); } - } + }; + jdbcTemplate.update(user); } public List findAll() throws SQLException { From ab11ef8bdd4ac8e7e45cf93df7b7b18350cb4307 Mon Sep 17 00:00:00 2001 From: Gyumin Kim Date: Wed, 29 Jul 2020 22:55:09 +0900 Subject: [PATCH 3/7] =?UTF-8?q?7.2=20DAO=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * `JdbcTemplate`: `User`에 대한 의존관계 제거 --- src/main/java/core/jdbc/JdbcTemplate.java | 24 +++++------------------ src/main/java/next/dao/UserDao.java | 20 ++++++------------- 2 files changed, 11 insertions(+), 33 deletions(-) diff --git a/src/main/java/core/jdbc/JdbcTemplate.java b/src/main/java/core/jdbc/JdbcTemplate.java index 3e230a4b3..e5da34423 100644 --- a/src/main/java/core/jdbc/JdbcTemplate.java +++ b/src/main/java/core/jdbc/JdbcTemplate.java @@ -1,32 +1,18 @@ package core.jdbc; -import next.model.User; - import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; public abstract class JdbcTemplate { - public void update(final User user) throws SQLException { - Connection con = null; - PreparedStatement pstmt = null; - try { - con = ConnectionManager.getConnection(); - String sql = createQuery(); - pstmt = con.prepareStatement(sql); - setValues(user, pstmt); + public void update(String sql) throws SQLException { + try (Connection con = ConnectionManager.getConnection(); + PreparedStatement pstmt = con.prepareStatement(sql)) { + setValues(pstmt); pstmt.executeUpdate(); - } finally { - if (pstmt != null) { - pstmt.close(); - } - if (con != null) { - con.close(); - } } } - public abstract String createQuery(); - public abstract void setValues(final User user, final PreparedStatement pstmt) throws SQLException; + public abstract void setValues(final PreparedStatement pstmt) throws SQLException; } diff --git a/src/main/java/next/dao/UserDao.java b/src/main/java/next/dao/UserDao.java index de7c1e70e..07f632e06 100644 --- a/src/main/java/next/dao/UserDao.java +++ b/src/main/java/next/dao/UserDao.java @@ -15,37 +15,29 @@ public class UserDao { public void insert(User user) throws SQLException { JdbcTemplate jdbcTemplate = new JdbcTemplate() { @Override - public String createQuery() { - return "INSERT INTO USERS VALUES (?, ?, ?, ?)"; - } - - @Override - public void setValues(final User user, final PreparedStatement pstmt) throws SQLException { + public void setValues(final PreparedStatement pstmt) throws SQLException { pstmt.setString(1, user.getUserId()); pstmt.setString(2, user.getPassword()); pstmt.setString(3, user.getName()); pstmt.setString(4, user.getEmail()); } }; - jdbcTemplate.update(user); + String sql = "INSERT INTO USERS VALUES (?, ?, ?, ?)"; + jdbcTemplate.update(sql); } public void update(User user) throws SQLException { JdbcTemplate jdbcTemplate = new JdbcTemplate() { @Override - public String createQuery() { - return "UPDATE USERS SET password = ?, name = ?, email = ? WHERE userId = ?"; - } - - @Override - public void setValues(final User user, final PreparedStatement pstmt) throws SQLException { + public void setValues(final PreparedStatement pstmt) throws SQLException { pstmt.setString(1, user.getPassword()); pstmt.setString(2, user.getName()); pstmt.setString(3, user.getEmail()); pstmt.setString(4, user.getUserId()); } }; - jdbcTemplate.update(user); + String sql = "UPDATE USERS SET password = ?, name = ?, email = ? WHERE userId = ?"; + jdbcTemplate.update(sql); } public List findAll() throws SQLException { From 5a444d88b0bfade482d7e609fcf28f0fa40ea3e0 Mon Sep 17 00:00:00 2001 From: Gyumin Kim Date: Wed, 29 Jul 2020 23:19:54 +0900 Subject: [PATCH 4/7] =?UTF-8?q?7.2=20DAO=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * `JdbcTemplate`과 `SelectJdbcTemplate` 통합 --- src/main/java/core/jdbc/JdbcTemplate.java | 42 +++++++++++ src/main/java/next/dao/UserDao.java | 91 ++++++++++------------- 2 files changed, 81 insertions(+), 52 deletions(-) diff --git a/src/main/java/core/jdbc/JdbcTemplate.java b/src/main/java/core/jdbc/JdbcTemplate.java index e5da34423..5e39c5f2b 100644 --- a/src/main/java/core/jdbc/JdbcTemplate.java +++ b/src/main/java/core/jdbc/JdbcTemplate.java @@ -2,7 +2,10 @@ 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 abstract class JdbcTemplate { @@ -14,5 +17,44 @@ public void update(String sql) throws SQLException { } } + @SuppressWarnings("rawtypes") + public List query(String sql) throws SQLException { + Connection con = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + try { + con = ConnectionManager.getConnection(); + pstmt = con.prepareStatement(sql); + setValues(pstmt); + rs = pstmt.executeQuery(); + List result = new ArrayList<>(); + while (rs.next()) { + result.add(mapRow(rs)); + } + return result; + } finally { + if (rs != null) { + rs.close(); + } + if (pstmt != null) { + pstmt.close(); + } + if (con != null) { + con.close(); + } + } + } + + @SuppressWarnings("rawtypes") + public Object queryForObject(String sql) throws SQLException { + List result = query(sql); + if (result.isEmpty()) { + return null; + } + return result.get(0); + } + public abstract void setValues(final PreparedStatement pstmt) throws SQLException; + + public abstract Object mapRow(final ResultSet rs) throws SQLException; } diff --git a/src/main/java/next/dao/UserDao.java b/src/main/java/next/dao/UserDao.java index 07f632e06..94a2f8d15 100644 --- a/src/main/java/next/dao/UserDao.java +++ b/src/main/java/next/dao/UserDao.java @@ -1,14 +1,11 @@ package next.dao; -import core.jdbc.ConnectionManager; import core.jdbc.JdbcTemplate; import next.model.User; -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 UserDao { @@ -21,6 +18,11 @@ public void setValues(final PreparedStatement pstmt) throws SQLException { pstmt.setString(3, user.getName()); pstmt.setString(4, user.getEmail()); } + + @Override + public Object mapRow(final ResultSet rs) throws SQLException { + return null; + } }; String sql = "INSERT INTO USERS VALUES (?, ?, ?, ?)"; jdbcTemplate.update(sql); @@ -35,69 +37,54 @@ public void setValues(final PreparedStatement pstmt) throws SQLException { pstmt.setString(3, user.getEmail()); pstmt.setString(4, user.getUserId()); } + + @Override + public Object mapRow(final ResultSet rs) throws SQLException { + return null; + } }; String sql = "UPDATE USERS SET password = ?, name = ?, email = ? WHERE userId = ?"; jdbcTemplate.update(sql); } public List findAll() throws SQLException { - Connection con = null; - PreparedStatement pstmt = null; - ResultSet rs = null; - try { - con = ConnectionManager.getConnection(); - String sql = "SELECT userId, password, name, email FROM USERS"; - pstmt = con.prepareStatement(sql); - rs = pstmt.executeQuery(); - List users = new ArrayList<>(); - if (rs.next()) { - User user = new User(rs.getString("userId"), rs.getString("password"), rs.getString("name"), - rs.getString("email")); - users.add(user); - } - return users; - } finally { - if (rs != null) { - rs.close(); - } - if (pstmt != null) { - pstmt.close(); + JdbcTemplate jdbcTemplate = new JdbcTemplate() { + @Override + public void setValues(PreparedStatement pstmt) throws SQLException { } - if (con != null) { - con.close(); + + @Override + public Object mapRow(ResultSet rs) throws SQLException { + return new User( + rs.getString("userId"), + rs.getString("password"), + rs.getString("name"), + rs.getString("email")); } - } + }; + + String sql = "SELECT userId, password, name, email FROM USERS"; + return (List) jdbcTemplate.query(sql); } 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(); + JdbcTemplate jdbcTemplate = new JdbcTemplate() { + @Override + public void setValues(final PreparedStatement pstmt) throws SQLException { + pstmt.setString(1, userId); + } - User user = null; - if (rs.next()) { - user = new User(rs.getString("userId"), rs.getString("password"), rs.getString("name"), + @Override + public Object mapRow(final ResultSet rs) throws SQLException { + return 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(); - } - } + String sql = "SELECT userId, password, name, email FROM USERS WHERE userid = ?"; + return (User) jdbcTemplate.queryForObject(sql); } } From 4a40c261a33540c27a4fdb45758dd7008326b955 Mon Sep 17 00:00:00 2001 From: Gyumin Kim Date: Wed, 29 Jul 2020 23:39:51 +0900 Subject: [PATCH 5/7] =?UTF-8?q?7.2=20DAO=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * callback interface 추가 (`PreparedStatementSetter`, `RowMapper`) --- src/main/java/core/jdbc/JdbcTemplate.java | 20 ++++----- .../core/jdbc/PreparedStatementSetter.java | 12 ++++++ src/main/java/core/jdbc/RowMapper.java | 12 ++++++ src/main/java/next/dao/UserDao.java | 43 +++++++++---------- 4 files changed, 53 insertions(+), 34 deletions(-) create mode 100644 src/main/java/core/jdbc/PreparedStatementSetter.java create mode 100644 src/main/java/core/jdbc/RowMapper.java diff --git a/src/main/java/core/jdbc/JdbcTemplate.java b/src/main/java/core/jdbc/JdbcTemplate.java index 5e39c5f2b..08186df91 100644 --- a/src/main/java/core/jdbc/JdbcTemplate.java +++ b/src/main/java/core/jdbc/JdbcTemplate.java @@ -7,29 +7,29 @@ import java.util.ArrayList; import java.util.List; -public abstract class JdbcTemplate { +public class JdbcTemplate { - public void update(String sql) throws SQLException { + public void update(String sql, PreparedStatementSetter pss) throws SQLException { try (Connection con = ConnectionManager.getConnection(); PreparedStatement pstmt = con.prepareStatement(sql)) { - setValues(pstmt); + pss.setValues(pstmt); pstmt.executeUpdate(); } } @SuppressWarnings("rawtypes") - public List query(String sql) throws SQLException { + 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); - setValues(pstmt); + pss.setValues(pstmt); rs = pstmt.executeQuery(); List result = new ArrayList<>(); while (rs.next()) { - result.add(mapRow(rs)); + result.add(rowMapper.mapRow(rs)); } return result; } finally { @@ -46,15 +46,11 @@ public List query(String sql) throws SQLException { } @SuppressWarnings("rawtypes") - public Object queryForObject(String sql) throws SQLException { - List result = query(sql); + public Object queryForObject(String sql, PreparedStatementSetter pss, RowMapper rowMapper) throws SQLException { + List result = query(sql, pss, rowMapper); if (result.isEmpty()) { return null; } return result.get(0); } - - public abstract void setValues(final PreparedStatement pstmt) throws SQLException; - - public abstract Object mapRow(final ResultSet rs) throws SQLException; } 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..a4ded3371 --- /dev/null +++ b/src/main/java/core/jdbc/RowMapper.java @@ -0,0 +1,12 @@ +package core.jdbc; + +import java.sql.ResultSet; +import java.sql.SQLException; + +/** + * callback interface + */ +public interface RowMapper { + + Object mapRow(final ResultSet rs) throws SQLException; +} diff --git a/src/main/java/next/dao/UserDao.java b/src/main/java/next/dao/UserDao.java index 94a2f8d15..c7e38556d 100644 --- a/src/main/java/next/dao/UserDao.java +++ b/src/main/java/next/dao/UserDao.java @@ -1,6 +1,8 @@ package next.dao; import core.jdbc.JdbcTemplate; +import core.jdbc.PreparedStatementSetter; +import core.jdbc.RowMapper; import next.model.User; import java.sql.PreparedStatement; @@ -10,7 +12,8 @@ public class UserDao { public void insert(User user) throws SQLException { - JdbcTemplate jdbcTemplate = new JdbcTemplate() { + JdbcTemplate jdbcTemplate = new JdbcTemplate(); + PreparedStatementSetter pss = new PreparedStatementSetter() { @Override public void setValues(final PreparedStatement pstmt) throws SQLException { pstmt.setString(1, user.getUserId()); @@ -18,18 +21,14 @@ public void setValues(final PreparedStatement pstmt) throws SQLException { pstmt.setString(3, user.getName()); pstmt.setString(4, user.getEmail()); } - - @Override - public Object mapRow(final ResultSet rs) throws SQLException { - return null; - } }; String sql = "INSERT INTO USERS VALUES (?, ?, ?, ?)"; - jdbcTemplate.update(sql); + jdbcTemplate.update(sql, pss); } public void update(User user) throws SQLException { - JdbcTemplate jdbcTemplate = new JdbcTemplate() { + JdbcTemplate jdbcTemplate = new JdbcTemplate(); + PreparedStatementSetter pss = new PreparedStatementSetter() { @Override public void setValues(final PreparedStatement pstmt) throws SQLException { pstmt.setString(1, user.getPassword()); @@ -37,24 +36,22 @@ public void setValues(final PreparedStatement pstmt) throws SQLException { pstmt.setString(3, user.getEmail()); pstmt.setString(4, user.getUserId()); } - - @Override - public Object mapRow(final ResultSet rs) throws SQLException { - return null; - } }; String sql = "UPDATE USERS SET password = ?, name = ?, email = ? WHERE userId = ?"; - jdbcTemplate.update(sql); + jdbcTemplate.update(sql, pss); } public List findAll() throws SQLException { - JdbcTemplate jdbcTemplate = new JdbcTemplate() { + JdbcTemplate jdbcTemplate = new JdbcTemplate(); + PreparedStatementSetter pss = new PreparedStatementSetter() { @Override - public void setValues(PreparedStatement pstmt) throws SQLException { - } + public void setValues(final PreparedStatement pstmt) throws SQLException { + } + }; + RowMapper rowMapper = new RowMapper() { @Override - public Object mapRow(ResultSet rs) throws SQLException { + public Object mapRow(final ResultSet rs) throws SQLException { return new User( rs.getString("userId"), rs.getString("password"), @@ -64,16 +61,18 @@ public Object mapRow(ResultSet rs) throws SQLException { }; String sql = "SELECT userId, password, name, email FROM USERS"; - return (List) jdbcTemplate.query(sql); + return (List) jdbcTemplate.query(sql, pss, rowMapper); } public User findByUserId(String userId) throws SQLException { - JdbcTemplate jdbcTemplate = new JdbcTemplate() { + JdbcTemplate jdbcTemplate = new JdbcTemplate(); + PreparedStatementSetter pss = new PreparedStatementSetter() { @Override public void setValues(final PreparedStatement pstmt) throws SQLException { pstmt.setString(1, userId); } - + }; + RowMapper rowMapper = new RowMapper() { @Override public Object mapRow(final ResultSet rs) throws SQLException { return new User( @@ -85,6 +84,6 @@ public Object mapRow(final ResultSet rs) throws SQLException { }; String sql = "SELECT userId, password, name, email FROM USERS WHERE userid = ?"; - return (User) jdbcTemplate.queryForObject(sql); + return (User) jdbcTemplate.queryForObject(sql, pss, rowMapper); } } From 0191d0a42da23d318d01b26d4fc7ca31eb11084c Mon Sep 17 00:00:00 2001 From: Gyumin Kim Date: Thu, 30 Jul 2020 22:29:30 +0900 Subject: [PATCH 6/7] =?UTF-8?q?7.2=20DAO=20=EB=A6=AC=ED=8C=A9=ED=86=A0?= =?UTF-8?q?=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Generic 사용 * 가변인자를 받아 쿼리에 인자 전달 * lambda 활용 --- .../java/core/jdbc/DataAccessException.java | 25 +++++++ src/main/java/core/jdbc/JdbcTemplate.java | 26 +++++-- src/main/java/core/jdbc/RowMapper.java | 5 +- .../next/controller/CreateUserController.java | 4 +- src/main/java/next/dao/UserDao.java | 74 +++++-------------- src/test/java/next/dao/UserDaoTest.java | 11 ++- 6 files changed, 72 insertions(+), 73 deletions(-) create mode 100644 src/main/java/core/jdbc/DataAccessException.java 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 index 08186df91..ae6987f43 100644 --- a/src/main/java/core/jdbc/JdbcTemplate.java +++ b/src/main/java/core/jdbc/JdbcTemplate.java @@ -9,16 +9,29 @@ public class JdbcTemplate { - public void update(String sql, PreparedStatementSetter pss) throws SQLException { + 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); } } - @SuppressWarnings("rawtypes") - public List query(String sql, PreparedStatementSetter pss, RowMapper rowMapper) throws SQLException { + 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; @@ -27,7 +40,7 @@ public List query(String sql, PreparedStatementSetter pss, RowMapper rowMapper) pstmt = con.prepareStatement(sql); pss.setValues(pstmt); rs = pstmt.executeQuery(); - List result = new ArrayList<>(); + List result = new ArrayList(); while (rs.next()) { result.add(rowMapper.mapRow(rs)); } @@ -45,9 +58,8 @@ public List query(String sql, PreparedStatementSetter pss, RowMapper rowMapper) } } - @SuppressWarnings("rawtypes") - public Object queryForObject(String sql, PreparedStatementSetter pss, RowMapper rowMapper) throws SQLException { - List result = query(sql, pss, rowMapper); + public T queryForObject(String sql, PreparedStatementSetter pss, RowMapper rowMapper) throws SQLException { + List result = query(sql, pss, rowMapper); if (result.isEmpty()) { return null; } diff --git a/src/main/java/core/jdbc/RowMapper.java b/src/main/java/core/jdbc/RowMapper.java index a4ded3371..b09685e4a 100644 --- a/src/main/java/core/jdbc/RowMapper.java +++ b/src/main/java/core/jdbc/RowMapper.java @@ -6,7 +6,8 @@ /** * callback interface */ -public interface RowMapper { +@FunctionalInterface +public interface RowMapper { - Object mapRow(final ResultSet rs) throws SQLException; + 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 583800223..709b0742f 100644 --- a/src/main/java/next/controller/CreateUserController.java +++ b/src/main/java/next/controller/CreateUserController.java @@ -1,5 +1,6 @@ package next.controller; +import core.jdbc.DataAccessException; import core.mvc.Controller; import next.dao.UserDao; import next.model.User; @@ -8,7 +9,6 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.sql.SQLException; public class CreateUserController implements Controller { private static final Logger log = LoggerFactory.getLogger(CreateUserController.class); @@ -21,7 +21,7 @@ public String execute(HttpServletRequest req, HttpServletResponse resp) throws E UserDao userDao = new UserDao(); try { userDao.insert(user); - } catch (SQLException e) { + } catch (DataAccessException e) { log.error(e.getMessage()); } diff --git a/src/main/java/next/dao/UserDao.java b/src/main/java/next/dao/UserDao.java index c7e38556d..0dd268350 100644 --- a/src/main/java/next/dao/UserDao.java +++ b/src/main/java/next/dao/UserDao.java @@ -5,85 +5,47 @@ import core.jdbc.RowMapper; import next.model.User; -import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; public class UserDao { - public void insert(User user) throws SQLException { + public void insert(User user) { JdbcTemplate jdbcTemplate = new JdbcTemplate(); - PreparedStatementSetter pss = new PreparedStatementSetter() { - @Override - public void setValues(final PreparedStatement pstmt) throws SQLException { - pstmt.setString(1, user.getUserId()); - pstmt.setString(2, user.getPassword()); - pstmt.setString(3, user.getName()); - pstmt.setString(4, user.getEmail()); - } - }; String sql = "INSERT INTO USERS VALUES (?, ?, ?, ?)"; - jdbcTemplate.update(sql, pss); + jdbcTemplate.update(sql, user.getUserId(), user.getPassword(), user.getName(), user.getEmail()); } - public void update(User user) throws SQLException { + public void update(User user) { JdbcTemplate jdbcTemplate = new JdbcTemplate(); - PreparedStatementSetter pss = new PreparedStatementSetter() { - @Override - public void setValues(final PreparedStatement pstmt) throws SQLException { - pstmt.setString(1, user.getPassword()); - pstmt.setString(2, user.getName()); - pstmt.setString(3, user.getEmail()); - pstmt.setString(4, user.getUserId()); - } - }; String sql = "UPDATE USERS SET password = ?, name = ?, email = ? WHERE userId = ?"; - jdbcTemplate.update(sql, pss); + jdbcTemplate.update(sql, user.getPassword(), user.getName(), user.getEmail(), user.getUserId()); } public List findAll() throws SQLException { JdbcTemplate jdbcTemplate = new JdbcTemplate(); - PreparedStatementSetter pss = new PreparedStatementSetter() { - @Override - public void setValues(final PreparedStatement pstmt) throws SQLException { - - } - }; - RowMapper rowMapper = new RowMapper() { - @Override - public Object mapRow(final ResultSet rs) throws SQLException { - return new User( - rs.getString("userId"), - rs.getString("password"), - rs.getString("name"), - rs.getString("email")); - } + 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 (List) jdbcTemplate.query(sql, pss, rowMapper); + return jdbcTemplate.query(sql, pss, rowMapper); } public User findByUserId(String userId) throws SQLException { JdbcTemplate jdbcTemplate = new JdbcTemplate(); - PreparedStatementSetter pss = new PreparedStatementSetter() { - @Override - public void setValues(final PreparedStatement pstmt) throws SQLException { - pstmt.setString(1, userId); - } - }; - RowMapper rowMapper = new RowMapper() { - @Override - public Object mapRow(final ResultSet rs) throws SQLException { - return new User( - rs.getString("userId"), - rs.getString("password"), - rs.getString("name"), - rs.getString("email")); - } - }; + 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 (User) jdbcTemplate.queryForObject(sql, pss, rowMapper); + 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 From e77cc82eb18d904a71eafefd028d2f25b2bb1f70 Mon Sep 17 00:00:00 2001 From: Gyumin Kim Date: Thu, 30 Jul 2020 22:35:18 +0900 Subject: [PATCH 7/7] Fix dependabot security issues --- pom.xml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) 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