diff --git a/src/main/java/core/db/MemoryUserRepository.java b/src/main/java/core/db/MemoryUserRepository.java deleted file mode 100644 index 0557562b..00000000 --- a/src/main/java/core/db/MemoryUserRepository.java +++ /dev/null @@ -1,46 +0,0 @@ -package core.db; - -import jwp.model.User; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; - -public class MemoryUserRepository { - private Map users = new HashMap<>(); - private static MemoryUserRepository memoryUserRepository; - - private MemoryUserRepository() { - } - - public static MemoryUserRepository getInstance() { - if (memoryUserRepository == null) { - memoryUserRepository = new MemoryUserRepository(); - return memoryUserRepository; - } - return memoryUserRepository; - } - - public void addUser(User user) { - users.put(user.getUserId(), user); - } - - public User findUserById(String userId) { - return users.get(userId); - } - - public Collection findAll() { - return users.values(); - } - - public void changeUserInfo(User user) { - if (users.get(user.getUserId()) != null) { - users.put(user.getUserId(), user); - } - } - - public void update(User user) { - User repoUser = users.get(user.getUserId()); - repoUser.update(user); - } -} diff --git a/src/main/java/core/db/Repository.java b/src/main/java/core/db/Repository.java deleted file mode 100644 index e2f2bde8..00000000 --- a/src/main/java/core/db/Repository.java +++ /dev/null @@ -1,11 +0,0 @@ -package core.db; - -import jwp.model.User; - -import java.util.Collection; - -public interface Repository { - void addUser(User user); - User findUserById(String id); - Collection findAll(); -} diff --git a/src/main/java/core/jdbc/JdbcTemplate.java b/src/main/java/core/jdbc/JdbcTemplate.java new file mode 100644 index 00000000..03edca17 --- /dev/null +++ b/src/main/java/core/jdbc/JdbcTemplate.java @@ -0,0 +1,66 @@ +package core.jdbc; + +import jwp.model.User; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +public class JdbcTemplate { + + // 각 method에서 parameter에 맞춰 다른 동작을 수행하도록 해줌 (동작 parameter 화) + public void update(String sql, PreparedStatementSetter pstmtSetter) throws SQLException { + try (Connection conn = ConnectionManager.getConnection(); + PreparedStatement pstmt = conn.prepareStatement(sql)) { + pstmtSetter.setParameters(pstmt); + pstmt.executeUpdate(); + } + } + + public void update(String sql, PreparedStatementSetter pstmtSetter, KeyHolder holder) { + try (Connection conn = ConnectionManager.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) { + pstmtSetter.setParameters(pstmt); + pstmt.executeUpdate(); + + ResultSet rs = pstmt.getGeneratedKeys(); + if (rs.next()) { + holder.setId((int) rs.getLong(1)); + } + rs.close(); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + public List query(String sql, RowMapper rowMapper) throws SQLException { + List objects = new ArrayList<>(); + + try (Connection conn = ConnectionManager.getConnection(); + PreparedStatement pstmt = conn.prepareStatement(sql); + ResultSet rs = pstmt.executeQuery();) { + while (rs.next()) { + T object = rowMapper.mapRow(rs); + objects.add(object); + } + } + return objects; + } + + public T queryForObject(String sql, PreparedStatementSetter pstmtSetter, RowMapper rowMapper) throws SQLException { + ResultSet rs = null; + T object = null; + + try (Connection conn = ConnectionManager.getConnection(); + PreparedStatement pstmt = conn.prepareStatement(sql);){ + pstmtSetter.setParameters(pstmt); + rs = pstmt.executeQuery(); + if (rs.next()) { + object = rowMapper.mapRow(rs); + } + } finally { + if (rs != null) + rs.close(); + } + return object; + } +} diff --git a/src/main/java/core/jdbc/KeyHolder.java b/src/main/java/core/jdbc/KeyHolder.java new file mode 100644 index 00000000..a89d42cb --- /dev/null +++ b/src/main/java/core/jdbc/KeyHolder.java @@ -0,0 +1,11 @@ +package core.jdbc; + +public class KeyHolder { + private int id; + public void setId(int id) { + this.id = id; + } + public int getId() { + return id; + } +} \ No newline at end of file diff --git a/src/main/java/core/jdbc/PreparedStatementSetter.java b/src/main/java/core/jdbc/PreparedStatementSetter.java new file mode 100644 index 00000000..c43abb26 --- /dev/null +++ b/src/main/java/core/jdbc/PreparedStatementSetter.java @@ -0,0 +1,15 @@ +package core.jdbc; + +import java.sql.PreparedStatement; +import java.sql.SQLException; + +// 함수형 인터페이스 -> 추상 method 1개만 가짐 +@FunctionalInterface +public interface PreparedStatementSetter { + + // PreparedStatement의 parameter를 직접 설정해주는 역할 + void setParameters(PreparedStatement ps) 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 00000000..9a51b361 --- /dev/null +++ b/src/main/java/core/jdbc/RowMapper.java @@ -0,0 +1,9 @@ +package core.jdbc; +import jwp.model.User; +import java.sql.ResultSet; +import java.sql.SQLException; + +@FunctionalInterface +public interface RowMapper { + T mapRow(ResultSet rs) throws SQLException; +} \ No newline at end of file diff --git a/src/main/java/core/mvc/RequestMapping.java b/src/main/java/core/mvc/RequestMapping.java index bc94f8fa..83fa74df 100644 --- a/src/main/java/core/mvc/RequestMapping.java +++ b/src/main/java/core/mvc/RequestMapping.java @@ -22,9 +22,11 @@ public class RequestMapping { controllers.put("/user/loginForm", new ForwardController("/user/login.jsp")); controllers.put("/user/loginFailed", new ForwardController("/user/loginFailed.jsp")); - controllers.put("/qna/form", new ForwardController("/qna/form.jsp")); - controllers.put("/qna/show", new ForwardController("/qna/show.jsp")); - + controllers.put("/qna/form", new QnaFormController()); + controllers.put("/qna/create", new CreateQnaController()); + controllers.put("/qna/show", new ShowController()); + controllers.put("/qna/updateForm", new UpdateFormController()); + controllers.put("/qna/update", new UpdateController()); } public Controller getController(String url) { diff --git a/src/main/java/jwp/controller/CreateQnaController.java b/src/main/java/jwp/controller/CreateQnaController.java new file mode 100644 index 00000000..5f5ed729 --- /dev/null +++ b/src/main/java/jwp/controller/CreateQnaController.java @@ -0,0 +1,35 @@ +package jwp.controller; + +import core.mvc.Controller; +import jwp.dao.QuestionDao; +import jwp.model.Question; +import jwp.model.User; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.sql.Date; +import java.time.LocalDate; + +public class CreateQnaController implements Controller { + + private final QuestionDao questionDao = new QuestionDao(); + + @Override + public String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception { + + User user = (User) req.getSession().getAttribute("user"); + if (user == null) { + return "redirect:/user/login"; + } + + String writer = user.getUserId(); + + String title = req.getParameter("title"); + String contents = req.getParameter("contents"); + + Question question = new Question(0, writer, title, contents, Date.valueOf(LocalDate.now()), 0); + questionDao.insert(question); + + return "redirect:/"; + } +} diff --git a/src/main/java/jwp/controller/CreateUserController.java b/src/main/java/jwp/controller/CreateUserController.java index 85995ea6..60473594 100644 --- a/src/main/java/jwp/controller/CreateUserController.java +++ b/src/main/java/jwp/controller/CreateUserController.java @@ -1,21 +1,23 @@ package jwp.controller; -import core.db.MemoryUserRepository; import core.mvc.Controller; import jwp.model.User; +import jwp.dao.UserDao; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CreateUserController implements Controller { + private final UserDao userDao = new UserDao(); + @Override 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")); - MemoryUserRepository.getInstance().addUser(user); + userDao.insert(user); System.out.println("user 회원가입 완료"); return "redirect:/user/list"; } diff --git a/src/main/java/jwp/controller/HomeController.java b/src/main/java/jwp/controller/HomeController.java index 6ab2f4f6..85babdd0 100644 --- a/src/main/java/jwp/controller/HomeController.java +++ b/src/main/java/jwp/controller/HomeController.java @@ -1,14 +1,27 @@ package jwp.controller; import core.mvc.Controller; +import jwp.dao.QuestionDao; +import jwp.model.Question; +import javax.servlet.RequestDispatcher; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.util.List; public class HomeController implements Controller { + private final QuestionDao questionDao = new QuestionDao(); + @Override public String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception { - return "/home.jsp"; + + List questions = questionDao.findAll(); + req.setAttribute("questions", questions); + + RequestDispatcher rd = req.getRequestDispatcher("/home.jsp"); + rd.forward(req, resp); + + return null; } } diff --git a/src/main/java/jwp/controller/ListUserController.java b/src/main/java/jwp/controller/ListUserController.java index 934ebe24..6036f95c 100644 --- a/src/main/java/jwp/controller/ListUserController.java +++ b/src/main/java/jwp/controller/ListUserController.java @@ -1,7 +1,7 @@ package jwp.controller; -import core.db.MemoryUserRepository; import core.mvc.Controller; +import jwp.dao.UserDao; import jwp.util.UserSessionUtils; import javax.servlet.http.HttpServletRequest; @@ -10,11 +10,13 @@ public class ListUserController implements Controller { + private final UserDao userDao = new UserDao(); + @Override public String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception { HttpSession session = req.getSession(); if (UserSessionUtils.isLogined(session)) { - req.setAttribute("users", MemoryUserRepository.getInstance().findAll()); + req.setAttribute("users", userDao.findAll()); return "/user/list.jsp"; } return "redirect:/user/loginForm"; diff --git a/src/main/java/jwp/controller/LoginController.java b/src/main/java/jwp/controller/LoginController.java index 0938a335..72460bc7 100644 --- a/src/main/java/jwp/controller/LoginController.java +++ b/src/main/java/jwp/controller/LoginController.java @@ -1,7 +1,7 @@ package jwp.controller; -import core.db.MemoryUserRepository; import core.mvc.Controller; +import jwp.dao.UserDao; import jwp.model.User; import javax.servlet.http.HttpServletRequest; @@ -10,6 +10,8 @@ public class LoginController implements Controller { + private final UserDao userDao = new UserDao(); + @Override public String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception { HttpSession session = req.getSession(); @@ -17,7 +19,7 @@ public String execute(HttpServletRequest req, HttpServletResponse resp) throws E String password = req.getParameter("password"); User loginUser = new User(userId, password); - User user = MemoryUserRepository.getInstance().findUserById(userId); + User user = userDao.findByUserId(userId); if (user != null && user.isSameUser(loginUser)) { session.setAttribute("user", user); diff --git a/src/main/java/jwp/controller/QnaFormController.java b/src/main/java/jwp/controller/QnaFormController.java new file mode 100644 index 00000000..f31ff8b0 --- /dev/null +++ b/src/main/java/jwp/controller/QnaFormController.java @@ -0,0 +1,24 @@ +package jwp.controller; + +import core.mvc.Controller; +import jwp.model.User; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class QnaFormController implements Controller { + + @Override + public String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception { + + User user = (User) req.getSession().getAttribute("user"); + if (user == null) { + return "redirect:/user/login"; + } + + String userId = user.getUserId(); + req.setAttribute("userId", userId); + + return "/qna/form.jsp"; + } +} diff --git a/src/main/java/jwp/controller/ShowController.java b/src/main/java/jwp/controller/ShowController.java new file mode 100644 index 00000000..f78269ae --- /dev/null +++ b/src/main/java/jwp/controller/ShowController.java @@ -0,0 +1,31 @@ +package jwp.controller; + +import core.mvc.Controller; +import jwp.dao.QuestionDao; +import jwp.model.Question; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class ShowController implements Controller { + + private final QuestionDao questionDao = new QuestionDao(); + + @Override + public String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception { + String questionIdParam = req.getParameter("questionId"); + if (questionIdParam == null || questionIdParam.isEmpty()) { + return "redirect:/"; + } + + int questionId = Integer.parseInt(questionIdParam); + Question question = questionDao.findByQuestionId(questionId); + + if (question == null) { + return "redirect:/"; + } + + req.setAttribute("question", question); + return "/qna/show.jsp"; + } +} diff --git a/src/main/java/jwp/controller/UpdateController.java b/src/main/java/jwp/controller/UpdateController.java new file mode 100644 index 00000000..28ac7cc5 --- /dev/null +++ b/src/main/java/jwp/controller/UpdateController.java @@ -0,0 +1,32 @@ +package jwp.controller; + +import core.mvc.Controller; +import jwp.dao.QuestionDao; +import jwp.model.Question; +import jwp.util.ControllerUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.sql.Date; +import java.time.LocalDate; + +public class UpdateController implements Controller { + + private final QuestionDao questionDao = new QuestionDao(); + + @Override + public String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception { + + Question question = ControllerUtils.getQuestionAndCheckAuthorization(req, questionDao); + + String title = req.getParameter("title"); + String contents = req.getParameter("contents"); + + question.setTitle(title); + question.setContents(contents); + question.setCreatedDate(Date.valueOf(LocalDate.now())); + + questionDao.update(question); + return "redirect:/"; + } +} diff --git a/src/main/java/jwp/controller/UpdateFormController.java b/src/main/java/jwp/controller/UpdateFormController.java new file mode 100644 index 00000000..114d2d96 --- /dev/null +++ b/src/main/java/jwp/controller/UpdateFormController.java @@ -0,0 +1,22 @@ +package jwp.controller; + +import core.mvc.Controller; +import jwp.dao.QuestionDao; +import jwp.model.Question; +import jwp.util.ControllerUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class UpdateFormController implements Controller { + + private final QuestionDao questionDao = new QuestionDao(); + + @Override + public String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception { + + Question question = ControllerUtils.getQuestionAndCheckAuthorization(req, questionDao); + req.setAttribute("question", question); + return "/qna/updateForm.jsp"; + } +} diff --git a/src/main/java/jwp/controller/UpdateUserController.java b/src/main/java/jwp/controller/UpdateUserController.java index a94f022f..723f4c93 100644 --- a/src/main/java/jwp/controller/UpdateUserController.java +++ b/src/main/java/jwp/controller/UpdateUserController.java @@ -1,7 +1,7 @@ package jwp.controller; -import core.db.MemoryUserRepository; import core.mvc.Controller; +import jwp.dao.UserDao; import jwp.model.User; import javax.servlet.http.HttpServletRequest; @@ -9,6 +9,8 @@ public class UpdateUserController implements Controller { + private final UserDao userDao = new UserDao(); + @Override public String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception { User modifiedUser = new User( @@ -16,7 +18,7 @@ public String execute(HttpServletRequest req, HttpServletResponse resp) throws E req.getParameter("password"), req.getParameter("name"), req.getParameter("email")); - MemoryUserRepository.getInstance().update(modifiedUser); + userDao.update(modifiedUser); return "redirect:/user/list"; } } diff --git a/src/main/java/jwp/controller/UpdateUserFormController.java b/src/main/java/jwp/controller/UpdateUserFormController.java index dd08c270..3dcfc8f6 100644 --- a/src/main/java/jwp/controller/UpdateUserFormController.java +++ b/src/main/java/jwp/controller/UpdateUserFormController.java @@ -1,7 +1,7 @@ package jwp.controller; -import core.db.MemoryUserRepository; import core.mvc.Controller; +import jwp.dao.UserDao; import jwp.model.User; import javax.servlet.http.HttpServletRequest; @@ -10,10 +10,12 @@ public class UpdateUserFormController implements Controller { + private final UserDao userDao = new UserDao(); + @Override public String execute(HttpServletRequest req, HttpServletResponse resp) throws Exception { String userId = req.getParameter("userId"); // 수정되는 user - User user = MemoryUserRepository.getInstance().findUserById(userId); + User user = userDao.findByUserId(userId); HttpSession session = req.getSession(); // 수정하는 user Object value = session.getAttribute("user"); diff --git a/src/main/java/jwp/dao/QuestionDao.java b/src/main/java/jwp/dao/QuestionDao.java new file mode 100644 index 00000000..351d1191 --- /dev/null +++ b/src/main/java/jwp/dao/QuestionDao.java @@ -0,0 +1,69 @@ +package jwp.dao; + +import core.jdbc.JdbcTemplate; +import core.jdbc.PreparedStatementSetter; +import core.jdbc.RowMapper; +import jwp.model.Question; +import core.jdbc.KeyHolder; +import java.util.List; + + +import java.sql.SQLException; + +public class QuestionDao { + + private final JdbcTemplate jdbcTemplate = new JdbcTemplate<>(); + + public void insert(Question question) throws SQLException { + String sql = "INSERT INTO QUESTIONS (writer, title, contents, createdDate, countOfAnswer) VALUES (?, ?, ?, ?, ?)"; + KeyHolder keyHolder = new KeyHolder(); + + PreparedStatementSetter pstmtSetter = pstmt -> { + pstmt.setString(1, question.getWriter()); + pstmt.setString(2, question.getTitle()); + pstmt.setString(3, question.getContents()); + pstmt.setDate(4, question.getCreatedDate()); + pstmt.setInt(5, question.getCountOfAnswer()); + }; + + jdbcTemplate.update(sql, pstmtSetter, keyHolder); + int generatedId = keyHolder.getId(); + + findByQuestionId(generatedId); + } + + public void update(Question question) throws SQLException { + String sql = "UPDATE QUESTIONS SET title = ?, contents = ?, createdDate = ? WHERE questionId = ?"; + jdbcTemplate.update(sql, pstmt -> { + pstmt.setString(1, question.getTitle()); + pstmt.setString(2, question.getContents()); + pstmt.setDate(3, question.getCreatedDate()); + pstmt.setInt(4, question.getQuestionId()); + }); + } + + public List findAll() throws SQLException { + String sql = "SELECT * FROM QUESTIONS"; + RowMapper rowMapper = rs -> new Question( + rs.getInt("questionId"), + rs.getString("writer"), + rs.getString("title"), + rs.getString("contents"), + rs.getDate("createdDate"), + rs.getInt("countOfAnswer") + ); + return jdbcTemplate.query(sql, rowMapper); + } + + public Question findByQuestionId(int questionId) throws SQLException { + String sql = "SELECT * FROM QUESTIONS WHERE questionId = ?"; + return jdbcTemplate.queryForObject(sql, pstmt -> pstmt.setInt(1, questionId), rs -> new Question( + rs.getInt("questionId"), + rs.getString("writer"), + rs.getString("title"), + rs.getString("contents"), + rs.getDate("createdDate"), + rs.getInt("countOfAnswer") + )); + } +} diff --git a/src/main/java/jwp/dao/UserDao.java b/src/main/java/jwp/dao/UserDao.java new file mode 100644 index 00000000..2c94ed53 --- /dev/null +++ b/src/main/java/jwp/dao/UserDao.java @@ -0,0 +1,80 @@ +package jwp.dao; + +import core.jdbc.ConnectionManager; +import core.jdbc.JdbcTemplate; +import core.jdbc.PreparedStatementSetter; +import jwp.model.User; + +import core.jdbc.RowMapper; +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 { + + private final JdbcTemplate jdbcTemplate = new JdbcTemplate(); + + public void insert(User user) throws SQLException { + + String sql = "INSERT INTO USERS VALUES (?, ?, ?, ?)"; + + // 함수형 interface 구현 시 ramda || 익명 class 사용 가능 - code 가독성을 위해 ramda로 표현 + PreparedStatementSetter pstmtSetter = pstmt -> { + pstmt.setString(1, user.getUserId()); + pstmt.setString(2, user.getPassword()); + pstmt.setString(3, user.getName()); + pstmt.setString(4, user.getEmail()); + }; + jdbcTemplate.update(sql, pstmtSetter); + } + + public void update(User user) throws SQLException { + + String sql = "UPDATE USERS SET password = ?, name = ?, email = ? WHERE userId = ?"; + + PreparedStatementSetter pstmtSetter = pstmt -> { + pstmt.setString(1, user.getPassword()); + pstmt.setString(2, user.getName()); + pstmt.setString(3, user.getEmail()); + pstmt.setString(4, user.getUserId()); + }; + jdbcTemplate.update(sql, pstmtSetter); + } + + public void delete(User user) throws SQLException { + + String sql = "DELETE USERS WHERE userId = ?"; + + PreparedStatementSetter pstmtSetter = pstmt -> { + pstmt.setString(1, user.getUserId()); + }; + jdbcTemplate.update(sql, pstmtSetter); + } + + public List findAll() throws SQLException { + String sql = "SELECT * FROM USERS"; + RowMapper rowMapper = rs -> new User(rs.getString("userId"), + rs.getString("password"), + rs.getString("name"), + rs.getString("email")); + return jdbcTemplate.query(sql, rowMapper); + } + + public User findByUserId(String userId) throws SQLException { + String sql = "SELECT userId, password, name, email FROM USERS WHERE userId=?"; + + PreparedStatementSetter pstmtSetter = pstmt -> { + pstmt.setString(1, userId); + }; + + RowMapper rowMapper = rs -> new User(rs.getString("userId"), + rs.getString("password"), + rs.getString("name"), + rs.getString("email")); + + return jdbcTemplate.queryForObject(sql, pstmtSetter, rowMapper); + } +} diff --git a/src/main/java/jwp/model/Question.java b/src/main/java/jwp/model/Question.java new file mode 100644 index 00000000..377cc46a --- /dev/null +++ b/src/main/java/jwp/model/Question.java @@ -0,0 +1,70 @@ +package jwp.model; + +import java.sql.Date; + +public class Question { + + private int questionId; + private String writer; + private String title; + private String contents; + private Date createdDate; + private int countOfAnswer; + + public Question(int questionId, String writer, String title, String contents, Date createdDate, int countOfAnswer) { + this.questionId = questionId; + this.writer = writer; + this.title = title; + this.contents = contents; + this.createdDate = createdDate; + this.countOfAnswer = countOfAnswer; + } + + public int getQuestionId() { + return questionId; + } + + public String getWriter() { + return writer; + } + + public String getTitle() { + return title; + } + + public String getContents() { + return contents; + } + + public Date getCreatedDate() { + return createdDate; + } + + public int getCountOfAnswer() { + return countOfAnswer; + } + + public void setQuestionId(int questionId) { + this.questionId = questionId; + } + + public void setWriter(String writer) { + this.writer = writer; + } + + public void setTitle(String title) { + this.title = title; + } + + public void setContents(String contents) { + this.contents = contents; + } + + public void setCreatedDate(Date createdDate) { + this.createdDate = createdDate; + } + + public void setCountOfAnswer(int countOfAnswer) { + this.countOfAnswer = countOfAnswer; + } +} diff --git a/src/main/java/jwp/util/ControllerUtils.java b/src/main/java/jwp/util/ControllerUtils.java new file mode 100644 index 00000000..2d523167 --- /dev/null +++ b/src/main/java/jwp/util/ControllerUtils.java @@ -0,0 +1,27 @@ +package jwp.util; + +import jwp.dao.QuestionDao; +import jwp.model.Question; +import jwp.model.User; + +import javax.servlet.http.HttpServletRequest; + +public class ControllerUtils { + + public static Question getQuestionAndCheckAuthorization(HttpServletRequest req, QuestionDao questionDao) throws Exception { + + User user = (User) req.getSession().getAttribute("user"); + if (user == null) { + throw new IllegalStateException("로그인이 필요합니다."); + } + + int questionId = Integer.parseInt(req.getParameter("questionId")); + Question question = questionDao.findByQuestionId(questionId); + + if (!user.getUserId().equals(question.getWriter())) { + throw new IllegalArgumentException("수정 권한이 없습니다."); + } + + return question; + } +} diff --git a/webapp/home.jsp b/webapp/home.jsp index 5527b1dc..a68826e0 100644 --- a/webapp/home.jsp +++ b/webapp/home.jsp @@ -11,44 +11,27 @@

Q&A

- + +
diff --git a/webapp/qna/form.jsp b/webapp/qna/form.jsp index c44ab1b0..7d555e2e 100644 --- a/webapp/qna/form.jsp +++ b/webapp/qna/form.jsp @@ -1,5 +1,5 @@ <%@ page contentType="text/html;charset=UTF-8" language="java" %> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> @@ -8,29 +8,52 @@ <%@ include file="/include/navigation.jspf" %>
-
- -
+
- - + +
- - + + +
+
+
+ +
+
+
+ + + + + +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + +<%@ include file="/include/header.jspf"%> + +<%@ include file="/include/navigation.jspf" %> + +
+
+
- - + +
- - + +
-
+
+
- +
@@ -38,4 +61,4 @@ - \ No newline at end of file + diff --git a/webapp/qna/show.jsp b/webapp/qna/show.jsp index aada9a33..500a33c2 100644 --- a/webapp/qna/show.jsp +++ b/webapp/qna/show.jsp @@ -1,137 +1,37 @@ <%@ page contentType="text/html;charset=UTF-8" language="java" %> -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> -<%@ include file="/include/header.jspf"%> +<%@ include file="/include/header.jspf" %> <%@ include file="/include/navigation.jspf" %> -
-
-

객체지향을 가장 잘 다룬 책이 뭐가 있나요?

-
-
-
-
-
- -
-
- - - - 2024-09-29 22:11 - -
-
-
-

저는 지금 '객체지향의 사실과 오해' 라는 책을 읽고 있는데 정말 좋아요

-

이해가 쏙쏙 됩니다!

-
-
- -
-
- -
-
-

2개의 의견

-
-
-
-
- -
-
- - - 2024-09-29 22:15 - -
-
-
-

오브젝트여

-
-
-
    -
  • - - 수정 -
  • -
  • - -
    - - -
    -
  • -
-
-
-
-
-
- -
-
- - - 2023-09-30 20:20 - -
-
-
-

스프링 입문을 위한 자바 객체 지향의 원리와 이해 추천합니다.

-

(근데 저도 아직 안 읽었어요..)

-
-
-
    -
  • - - 수정 -
  • -
  • - -
    - - -
    -
  • -
-
-
-
-
- -
- -
- -
-
-
+
+
+

${question.title}

+
+
+
+
+ + ${question.createdDate}
-
-
+
+

${question.contents}

+
+ + + 수정 +
+ +
+
+
- - - - - \ No newline at end of file +
+ + + + + diff --git a/webapp/qna/updateForm.jsp b/webapp/qna/updateForm.jsp new file mode 100644 index 00000000..dfd38366 --- /dev/null +++ b/webapp/qna/updateForm.jsp @@ -0,0 +1,40 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + +<%@ include file="/include/header.jspf"%> + +<%@ include file="/include/navigation.jspf" %> + +
+
+ +
+ + + +
+ + + +
+
+ + + +
+
+ + +
+ + +
+
+
+ + + + + diff --git a/webapp/user/updateForm.jsp b/webapp/user/updateForm.jsp index 704446b7..ea05b56b 100644 --- a/webapp/user/updateForm.jsp +++ b/webapp/user/updateForm.jsp @@ -3,36 +3,29 @@ -<%@ include file="/include/header.jspf" %> +<%@ include file="/include/header.jspf"%> <%@ include file="/include/navigation.jspf" %>
-
-
-
- - -
-
- - -
+ + + + +
- - + +
- - + +
-
+
+
- +
@@ -40,4 +33,4 @@ - \ No newline at end of file +