Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

5주차 미션 / 서버 3조 이윤희 #52

Open
wants to merge 7 commits into
base: step3-jdbc-start
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 0 additions & 46 deletions src/main/java/core/db/MemoryUserRepository.java

This file was deleted.

11 changes: 0 additions & 11 deletions src/main/java/core/db/Repository.java

This file was deleted.

66 changes: 66 additions & 0 deletions src/main/java/core/jdbc/JdbcTemplate.java
Original file line number Diff line number Diff line change
@@ -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<T> {

// 각 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 <T> List<T> query(String sql, RowMapper<T> rowMapper) throws SQLException {
List<T> 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<T> 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;
}
}
11 changes: 11 additions & 0 deletions src/main/java/core/jdbc/KeyHolder.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
15 changes: 15 additions & 0 deletions src/main/java/core/jdbc/PreparedStatementSetter.java
Original file line number Diff line number Diff line change
@@ -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;
}



9 changes: 9 additions & 0 deletions src/main/java/core/jdbc/RowMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package core.jdbc;
import jwp.model.User;
import java.sql.ResultSet;
import java.sql.SQLException;

@FunctionalInterface
public interface RowMapper<T> {
T mapRow(ResultSet rs) throws SQLException;
}
8 changes: 5 additions & 3 deletions src/main/java/core/mvc/RequestMapping.java
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
35 changes: 35 additions & 0 deletions src/main/java/jwp/controller/CreateQnaController.java
Original file line number Diff line number Diff line change
@@ -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();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

지금은 필드주입으로 충분하지만 장기적인 관점에서 보면 생성자 주입을 사용하는 것이 더 좋을 것 같네요


@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:/";
}
}
6 changes: 4 additions & 2 deletions src/main/java/jwp/controller/CreateUserController.java
Original file line number Diff line number Diff line change
@@ -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";
}
Expand Down
15 changes: 14 additions & 1 deletion src/main/java/jwp/controller/HomeController.java
Original file line number Diff line number Diff line change
@@ -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<Question> questions = questionDao.findAll();
req.setAttribute("questions", questions);

RequestDispatcher rd = req.getRequestDispatcher("/home.jsp");
rd.forward(req, resp);

return null;
Comment on lines -12 to +25

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기서 forward를 안해도 됩니다...! /home.jsp를 리턴하면 DispatcherServlet이 forward를 해줘요

}
}
6 changes: 4 additions & 2 deletions src/main/java/jwp/controller/ListUserController.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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";
Expand Down
6 changes: 4 additions & 2 deletions src/main/java/jwp/controller/LoginController.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -10,14 +10,16 @@

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();
String userId = req.getParameter("userId");
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);
Expand Down
24 changes: 24 additions & 0 deletions src/main/java/jwp/controller/QnaFormController.java
Original file line number Diff line number Diff line change
@@ -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";
}
}
31 changes: 31 additions & 0 deletions src/main/java/jwp/controller/ShowController.java
Original file line number Diff line number Diff line change
@@ -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";
}
}
Loading