From 119d9adfbf31629f317f497e734f96ed89381ebf Mon Sep 17 00:00:00 2001 From: "beulje@konkuk.ac.kr" Date: Thu, 9 Oct 2025 02:30:44 +0900 Subject: [PATCH 1/5] week04 --- java-webMVC.ipr | 402 ++++++++++++++++-- java-webMVC.iws | 380 ++++++++++------- src/main/java/jwp/controller/Controller.java | 10 + .../jwp/controller/CreateUserController.java | 27 ++ .../jwp/controller/DispatcherServlet.java | 35 ++ .../java/jwp/controller/HomeController.java | 16 +- .../jwp/controller/ListUserController.java | 32 ++ .../java/jwp/controller/LoginController.java | 34 ++ .../java/jwp/controller/LogoutController.java | 20 + .../java/jwp/controller/RequestMapper.java | 22 + .../jwp/controller/UpdateUserController.java | 26 ++ .../controller/UpdateUserFormController.java | 37 ++ src/main/java/util/SessionUtil.java | 26 ++ 13 files changed, 854 insertions(+), 213 deletions(-) create mode 100644 src/main/java/jwp/controller/Controller.java create mode 100644 src/main/java/jwp/controller/CreateUserController.java create mode 100644 src/main/java/jwp/controller/DispatcherServlet.java create mode 100644 src/main/java/jwp/controller/ListUserController.java create mode 100644 src/main/java/jwp/controller/LoginController.java create mode 100644 src/main/java/jwp/controller/LogoutController.java create mode 100644 src/main/java/jwp/controller/RequestMapper.java create mode 100644 src/main/java/jwp/controller/UpdateUserController.java create mode 100644 src/main/java/jwp/controller/UpdateUserFormController.java create mode 100644 src/main/java/util/SessionUtil.java diff --git a/java-webMVC.ipr b/java-webMVC.ipr index fddddb4..2eef937 100644 --- a/java-webMVC.ipr +++ b/java-webMVC.ipr @@ -1,79 +1,393 @@ - - - + + - + + + + + + + - - + - + + + + + + + - - - + + + - - + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + @@ -83,7 +397,7 @@ @@ -94,11 +408,11 @@ - + - + - + \ No newline at end of file diff --git a/java-webMVC.iws b/java-webMVC.iws index d5bc759..40526cf 100644 --- a/java-webMVC.iws +++ b/java-webMVC.iws @@ -1,207 +1,263 @@ + + - - - - + - + - - - - + + + + + + + + + + + + + + + - - -
- - -
-
- - -
-
- - -
-
-
- - - +
+
+
+
+ + +
+
+ + +
+
+ + +
+ +
+ +
+
diff --git a/webapp/qna/show.jsp b/webapp/qna/show.jsp index 7e89769..96d74ff 100644 --- a/webapp/qna/show.jsp +++ b/webapp/qna/show.jsp @@ -1,137 +1,139 @@ <%@ 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 - -
-
-
-

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

-

이해가 쏙쏙 됩니다!

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

    ${question.title}

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

    ${question.contents}

    +
    + +
    + -
    -
    - -
    -
    -

    2개의 의견

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

    오브젝트여

    -
    -
    -
      -
    • - - 수정 -
    • -
    • - -
      - - -
      -
    • -
    + + +
  • + 목록 +
  • +
+
+
+ +
+
+

${question.countOfAnswer}개의 의견

+ +
+ +
+
+
+
-
-
-
-
- -
-
- - - 2023-09-30 20:20 - +
+ ${each.writer} +
+
-
-

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

-

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

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

${each.content}

+
+
+
    +
  • + 수정 +
  • +
  • +
    + + +
    +
  • +
+
+ + +
+
+
+ +
+ +
+
+
-
-
+
- - - - - \ No newline at end of file + + + + + + + + From 7bf23b3177d33ae40589918ddde13536d1e03e07 Mon Sep 17 00:00:00 2001 From: "beulje@konkuk.ac.kr" Date: Fri, 7 Nov 2025 00:25:17 +0900 Subject: [PATCH 4/5] =?UTF-8?q?JDBC=EA=B8=B0=EB=B0=98=20=EB=A6=AC=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 50 +- java-webMVC.ipr | 647 +++++++++++++++--- java-webMVC.iws | 67 +- .../java/jwp/controller/UserController.java | 42 ++ src/main/java/util/UserSessionUtils.java | 21 + src/main/resources/application.properties | 14 + 6 files changed, 681 insertions(+), 160 deletions(-) create mode 100644 src/main/java/jwp/controller/UserController.java create mode 100644 src/main/java/util/UserSessionUtils.java create mode 100644 src/main/resources/application.properties diff --git a/build.gradle b/build.gradle index 8883efe..4856ddc 100644 --- a/build.gradle +++ b/build.gradle @@ -1,46 +1,38 @@ plugins { + id 'org.springframework.boot' version '2.7.17' // 스프링 부트 플러그인 적용 + id 'io.spring.dependency-management' version '1.0.15.RELEASE' // 의존성 관리 플러그인 id 'java' - id 'idea' } -idea { - module { - inheritOutputDirs = false - outputDir = file('./webapp/WEB-INF/classes') - } -} - -group 'org.example' -version '1.0-SNAPSHOT' +group = 'org.example' +version = '1.0-SNAPSHOT' +sourceCompatibility = '11' // 사용하는 자바 버전에 맞게 설정 (예: 11) repositories { mavenCentral() } -ext { - springVersion = "5.1.8.RELEASE" - tomcatVersion = '8.5.42' -} - dependencies { - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' - testImplementation "org.springframework:spring-test:$springVersion" - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' + // 1. Spring Boot Web Starter + implementation 'org.springframework.boot:spring-boot-starter-web' + + // 2. Spring Boot Data JPA Starter + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation("org.springframework:spring-jdbc:$springVersion") - implementation("org.springframework:spring-web:$springVersion") - implementation "org.reflections:reflections:0.10.2" + // 3. JSP 템플릿 엔진 사용을 위한 의존성 + implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' + implementation 'javax.servlet:jstl:1.2' - implementation("org.apache.commons:commons-dbcp2:2.6.0") + // 4. 데이터베이스 드라이버 (H2, MySQL 등 필요한 것 사용) + runtimeOnly 'com.h2database:h2' + runtimeOnly 'mysql:mysql-connector-java' - runtimeOnly("com.h2database:h2:2.1.214") - runtimeOnly('mysql:mysql-connector-java:8.0.28') + // 5. Lombok (선택 사항이지만 강력히 추천) + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' - implementation("org.apache.tomcat.embed:tomcat-embed-core:$tomcatVersion") - implementation("org.apache.tomcat.embed:tomcat-embed-logging-juli:8.5.2") - implementation("org.apache.tomcat.embed:tomcat-embed-jasper:$tomcatVersion") - implementation group: 'javax.servlet', name: 'jstl', version: '1.2' - implementation 'com.fasterxml.jackson.core:jackson-databind:2.12.7.1' + // 6. Spring Boot Test Starter + testImplementation 'org.springframework.boot:spring-boot-starter-test' } test { diff --git a/java-webMVC.ipr b/java-webMVC.ipr index 3e518dd..cf71daf 100644 --- a/java-webMVC.ipr +++ b/java-webMVC.ipr @@ -11,7 +11,16 @@ - + + + + + + + + + +
@@ -50,6 +59,9 @@ + + - + @@ -101,48 +113,88 @@ - - + + + + + + + + + + + + + + + + + + - + - - + + + + + + + + + + - + - - + + - + + + + + + + + + - - + + - + - - + + - + + + + + + + + + @@ -157,10 +209,82 @@ - - + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -173,68 +297,95 @@ - - + + + + + + + + + + + + + + + - + - - + + - + - - + + - + - - + + - + - - - + + + + + + + + + + + + + + + + + - - + + - + - - + + - + - - + + - + - - + + - + @@ -247,50 +398,154 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -303,74 +558,282 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + - - + + - + diff --git a/java-webMVC.iws b/java-webMVC.iws index 34a2362..dbdf343 100644 --- a/java-webMVC.iws +++ b/java-webMVC.iws @@ -4,24 +4,13 @@ - - - - - - - + + + + + - - - - - - - - -
\ No newline at end of file diff --git a/src/main/java/WebServerLauncher.java b/src/main/java/WebServerLauncher.java deleted file mode 100644 index d111fcf..0000000 --- a/src/main/java/WebServerLauncher.java +++ /dev/null @@ -1,22 +0,0 @@ -import org.apache.catalina.startup.Tomcat; - - -import java.io.File; -import java.util.logging.Logger; - -public class WebServerLauncher { - private static final Logger logger = Logger.getLogger(WebServerLauncher.class.getName()); - - public static void main(String[] args) throws Exception { - String webappDirLocation = "./webapp/"; - Tomcat tomcat = new Tomcat(); - tomcat.setPort(8080); - tomcat.getConnector(); - - tomcat.addWebapp("", new File(webappDirLocation).getAbsolutePath()); - logger.info("configuring app with basedir: " + new File(webappDirLocation).getAbsolutePath()); - - tomcat.start(); - tomcat.getServer().await(); - } -} diff --git a/src/main/java/core/jdbc/ConnectionManager.java b/src/main/java/core/jdbc/ConnectionManager.java deleted file mode 100644 index 6673010..0000000 --- a/src/main/java/core/jdbc/ConnectionManager.java +++ /dev/null @@ -1,34 +0,0 @@ -package core.jdbc; - -import org.apache.commons.dbcp2.BasicDataSource; - -import javax.sql.DataSource; -import java.sql.Connection; -import java.sql.SQLException; - -public class ConnectionManager { - private static final String DB_DRIVER = "org.h2.Driver"; - private static final String DB_URL = "jdbc:h2:~/jwp-basic"; - private static final String DB_USERNAME = "sa"; - private static final String DB_PW = ""; - - private static BasicDataSource ds; - public static DataSource getDataSource() { - if (ds == null) { - ds = new BasicDataSource(); - ds.setDriverClassName(DB_DRIVER); - ds.setUrl(DB_URL); - ds.setUsername(DB_USERNAME); - ds.setPassword(DB_PW); - } - return ds; - } - - public static Connection getConnection() { - try { - return getDataSource().getConnection(); - } catch (SQLException e) { - throw new IllegalStateException(e); - } - } -} diff --git a/src/main/java/core/jdbc/JdbcTemplate.java b/src/main/java/core/jdbc/JdbcTemplate.java deleted file mode 100644 index 173cfe9..0000000 --- a/src/main/java/core/jdbc/JdbcTemplate.java +++ /dev/null @@ -1,82 +0,0 @@ -package core.jdbc; - -import jwp.model.User; -import util.Keyholder; - -import java.sql.*; -import java.util.ArrayList; -import java.util.List; - -public class JdbcTemplate { - public void update(String sql ,PreparedStatementSetter pstmtSetter) { - - try (Connection conn = ConnectionManager.getConnection(); - PreparedStatement pstmt = conn.prepareStatement(sql);){ - - pstmtSetter.setParameters(pstmt); - pstmt.executeUpdate(); - } catch (SQLException e) { - throw new RuntimeException(e); - } - } - - public void update2(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){ - 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); - } - } catch (SQLException e) { - throw new RuntimeException(e); - } - return objects; - } - - public T queryForObject(String sql, PreparedStatementSetter pstmtSetter, RowMapper rowMapper){ - ResultSet rs = null; - T object = null; - - //확실히 파라미터 바인딩이 된 이후에 rs가 resultSet이 실행이 되도록 설정을 해줘야함 - try(Connection conn = ConnectionManager.getConnection(); - PreparedStatement pstmt = conn.prepareStatement(sql);) { - pstmtSetter.setParameters(pstmt); - rs = pstmt.executeQuery(); - - if(rs.next()){ - object = rowMapper.mapRow(rs); - } - } catch (SQLException e) { - throw new RuntimeException(e); - } finally { - if(rs!=null){ - try { - rs.close(); - } catch (SQLException e) { - throw new RuntimeException(e); - } - } - - } - return object; - } - -} \ No newline at end of file diff --git a/src/main/java/core/jdbc/PreparedStatementSetter.java b/src/main/java/core/jdbc/PreparedStatementSetter.java deleted file mode 100644 index 88f44e9..0000000 --- a/src/main/java/core/jdbc/PreparedStatementSetter.java +++ /dev/null @@ -1,9 +0,0 @@ -package core.jdbc; - -import java.sql.PreparedStatement; -import java.sql.SQLException; - -@FunctionalInterface -public interface PreparedStatementSetter { - void setParameters(PreparedStatement ps) throws SQLException; -} \ No newline at end of file diff --git a/src/main/java/core/jdbc/RowMapper.java b/src/main/java/core/jdbc/RowMapper.java deleted file mode 100644 index 7bfb9b2..0000000 --- a/src/main/java/core/jdbc/RowMapper.java +++ /dev/null @@ -1,11 +0,0 @@ -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/jwp/WebServerLauncher.java b/src/main/java/jwp/WebServerLauncher.java new file mode 100644 index 0000000..f253aa5 --- /dev/null +++ b/src/main/java/jwp/WebServerLauncher.java @@ -0,0 +1,12 @@ +package jwp; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class WebServerLauncher { + + public static void main(String[] args) throws Exception { + SpringApplication.run(WebServerLauncher.class, args); + } +} diff --git a/src/main/java/jwp/controller/Controller.java b/src/main/java/jwp/controller/Controller.java deleted file mode 100644 index c458bc6..0000000 --- a/src/main/java/jwp/controller/Controller.java +++ /dev/null @@ -1,11 +0,0 @@ -package jwp.controller; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.sql.SQLException; - -public interface Controller { - String handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException; -} diff --git a/src/main/java/jwp/controller/CreateQuestionController.java b/src/main/java/jwp/controller/CreateQuestionController.java deleted file mode 100644 index 18d2fe4..0000000 --- a/src/main/java/jwp/controller/CreateQuestionController.java +++ /dev/null @@ -1,23 +0,0 @@ -package jwp.controller; - -import jwp.dao.QuestionDao; -import jwp.model.Question; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -public class CreateQuestionController implements Controller { - @Override - public String handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - Question question = new Question( - request.getParameter("writer"), - request.getParameter("title"), - request.getParameter("contents")); - - QuestionDao questionDao = new QuestionDao(); - questionDao.insert(question); - return "redirect:/"; - } -} diff --git a/src/main/java/jwp/controller/CreateQuestionFormController.java b/src/main/java/jwp/controller/CreateQuestionFormController.java deleted file mode 100644 index 9ad020a..0000000 --- a/src/main/java/jwp/controller/CreateQuestionFormController.java +++ /dev/null @@ -1,18 +0,0 @@ -package jwp.controller; - - -import util.SessionUtil; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; - -public class CreateQuestionFormController implements Controller { - @Override - public String handle(HttpServletRequest req, HttpServletResponse resp){ - if (SessionUtil.isLogin(req)) { - return "/qna/form.jsp"; - } - return "redirect:/user/login.jsp"; - } -} diff --git a/src/main/java/jwp/controller/CreateUserController.java b/src/main/java/jwp/controller/CreateUserController.java deleted file mode 100644 index 0995bdc..0000000 --- a/src/main/java/jwp/controller/CreateUserController.java +++ /dev/null @@ -1,27 +0,0 @@ -package jwp.controller; - -import core.db.MemoryUserRepository; -import jwp.model.User; - -import javax.servlet.ServletException; -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -// /user/signup -public class CreateUserController implements Controller { - - @Override - public String handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - User user = new User(request.getParameter("userId"), - request.getParameter("password"), - request.getParameter("name"), - request.getParameter("email")); - MemoryUserRepository.getInstance().addUser(user); - System.out.println("user 회원가입 완료"); - return "redirect:/user/list"; - } - -} diff --git a/src/main/java/jwp/controller/DispatcherServlet.java b/src/main/java/jwp/controller/DispatcherServlet.java deleted file mode 100644 index af56b7f..0000000 --- a/src/main/java/jwp/controller/DispatcherServlet.java +++ /dev/null @@ -1,35 +0,0 @@ -package jwp.controller; - -import javax.servlet.RequestDispatcher; -import javax.servlet.ServletException; -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -@WebServlet("/") -public class DispatcherServlet extends HttpServlet { - Controller controller; - - @Override - protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - controller = RequestMapper.getController(req.getRequestURI()); - - if(controller==null){ - resp.sendRedirect("/"); - } - - String path = controller.handle(req, resp); - - if(path.startsWith("redirect:/")){ - resp.sendRedirect(path.replaceFirst("redirect:/","/")); - return; - } - - RequestDispatcher dispatcher = req.getRequestDispatcher(path); - dispatcher.forward(req,resp); - } -} diff --git a/src/main/java/jwp/controller/HomeController.java b/src/main/java/jwp/controller/HomeController.java index fa901ee..81c4a92 100644 --- a/src/main/java/jwp/controller/HomeController.java +++ b/src/main/java/jwp/controller/HomeController.java @@ -2,6 +2,11 @@ import jwp.dao.QuestionDao; import jwp.model.Question; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; @@ -13,16 +18,16 @@ import java.sql.SQLException; import java.util.List; -// / -public class HomeController implements Controller { +@Controller +@RequiredArgsConstructor +public class HomeController { - @Override - public String handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - QuestionDao questionDao = new QuestionDao(); - List questions = questionDao.findAll(); + private final QuestionDao questionDao; + @GetMapping("/") + public String listQuestions(Model model) throws ServletException, IOException { + model.addAttribute("questions", questionDao.findAll()); - request.setAttribute("questions", questions); - return "home.jsp"; + return "/home"; } diff --git a/src/main/java/jwp/controller/ListUserController.java b/src/main/java/jwp/controller/ListUserController.java deleted file mode 100644 index 85273c8..0000000 --- a/src/main/java/jwp/controller/ListUserController.java +++ /dev/null @@ -1,32 +0,0 @@ -package jwp.controller; - -import core.db.MemoryUserRepository; -import jwp.model.User; -import util.SessionUtil; - -import javax.servlet.RequestDispatcher; -import javax.servlet.ServletException; -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; -import java.io.IOException; -import java.util.Collection; - -// "/user/list" -public class ListUserController implements Controller { - - @Override - public String handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - - if(!SessionUtil.isLogin(request)){ - return "redirect:/user/login.jsp"; - } - - Collection users = MemoryUserRepository.getInstance().findAll(); - request.setAttribute("users", users); - return "/user/list.jsp"; - } - -} diff --git a/src/main/java/jwp/controller/LoginController.java b/src/main/java/jwp/controller/LoginController.java deleted file mode 100644 index b2df19f..0000000 --- a/src/main/java/jwp/controller/LoginController.java +++ /dev/null @@ -1,34 +0,0 @@ -package jwp.controller; - -import core.db.MemoryUserRepository; -import jwp.model.User; - -import javax.servlet.ServletException; -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; -import java.io.IOException; - -// "/user/login" -public class LoginController implements Controller { - - @Override - public String handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - String userId = request.getParameter("userId"); - String password = request.getParameter("password"); - - User user = MemoryUserRepository.getInstance().findUserById(userId); - - if(user != null && user.getPassword().equals(password)){ - HttpSession session = request.getSession(); - session.setAttribute("user", user); - return "redirect:/"; - } - - return "redirect:/user/loginFailed.jsp"; - } - - -} diff --git a/src/main/java/jwp/controller/LogoutController.java b/src/main/java/jwp/controller/LogoutController.java deleted file mode 100644 index 3789d41..0000000 --- a/src/main/java/jwp/controller/LogoutController.java +++ /dev/null @@ -1,20 +0,0 @@ -package jwp.controller; - -import javax.servlet.ServletException; -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; -import java.io.IOException; - -// "/user/logout" -public class LogoutController implements Controller { - @Override - public String handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - HttpSession session = request.getSession(); - session.removeAttribute("user"); - return "redirect:/"; - } - -} diff --git a/src/main/java/jwp/controller/QnaController.java b/src/main/java/jwp/controller/QnaController.java new file mode 100644 index 0000000..cde3234 --- /dev/null +++ b/src/main/java/jwp/controller/QnaController.java @@ -0,0 +1,42 @@ +package jwp.controller; + +import jwp.dao.QuestionDao; +import jwp.model.Question; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; +import util.SessionUtil; +import util.UserSessionUtils; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; + +@Controller +@RequestMapping("/qna") +@RequiredArgsConstructor +public class QnaController { + private final QuestionDao questionDao; + + @PostMapping("/create") + public String createQuestion(@ModelAttribute Question question) throws ServletException, IOException { + questionDao.insert(question); + return "redirect:/"; + } + @GetMapping("/form") + public String form(HttpSession session) { + if (UserSessionUtils.isLogined(session)) { + return "/qna/form"; + } + return "redirect:/user/login"; + } + @GetMapping("/show") + public String show(@RequestParam("questionId") String questionId, Model model) throws ServletException, IOException { + Question question = questionDao.findByQuestionId((Long.parseLong(questionId))); + model.addAttribute("question", question); + return "qna/show"; + } +} diff --git a/src/main/java/jwp/controller/RequestMapper.java b/src/main/java/jwp/controller/RequestMapper.java deleted file mode 100644 index 1ffb98e..0000000 --- a/src/main/java/jwp/controller/RequestMapper.java +++ /dev/null @@ -1,26 +0,0 @@ -package jwp.controller; - -import java.util.HashMap; -import java.util.Map; - -public class RequestMapper { - private static final Map controllers = new HashMap(); - - static { - controllers.put("/", new HomeController()); - controllers.put("/user/login", new LoginController()); - controllers.put("/user/logout", new LogoutController()); - controllers.put("/user/list", new ListUserController()); - controllers.put("/user/updateForm", new UpdateUserFormController()); - controllers.put("/user/update", new UpdateUserController()); - controllers.put("/user/signup", new CreateUserController()); - - controllers.put("/qna/form",new CreateQuestionFormController()); - controllers.put("/qna/create",new CreateQuestionController()); - controllers.put("/qna/show",new ShowController()); - } - - public static Controller getController(String controllerName) { - return controllers.get(controllerName); - } -} diff --git a/src/main/java/jwp/controller/ShowController.java b/src/main/java/jwp/controller/ShowController.java deleted file mode 100644 index 743947f..0000000 --- a/src/main/java/jwp/controller/ShowController.java +++ /dev/null @@ -1,20 +0,0 @@ -package jwp.controller; - -import jwp.dao.QuestionDao; -import jwp.model.Question; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -public class ShowController implements Controller { - @Override - public String handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - QuestionDao questionDao = new QuestionDao(); - String questionId = request.getParameter("questionId"); - Question question = questionDao.findByQuestionId((Long.parseLong(questionId))); - request.setAttribute("question", question); - return "/qna/show.jsp"; - } -} diff --git a/src/main/java/jwp/controller/UpdateUserController.java b/src/main/java/jwp/controller/UpdateUserController.java deleted file mode 100644 index e3a0805..0000000 --- a/src/main/java/jwp/controller/UpdateUserController.java +++ /dev/null @@ -1,26 +0,0 @@ -package jwp.controller; - -import core.db.MemoryUserRepository; -import jwp.model.User; - -import javax.servlet.ServletException; -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; -import java.io.IOException; - -// "/user/update" -public class UpdateUserController implements Controller { - - @Override - public String handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - User user = new User(request.getParameter("userId"), - request.getParameter("password"), - request.getParameter("name"), - request.getParameter("email")); - MemoryUserRepository.getInstance().changeUserInfo(user); - return "redirect:/user/list"; - } -} diff --git a/src/main/java/jwp/controller/UpdateUserFormController.java b/src/main/java/jwp/controller/UpdateUserFormController.java deleted file mode 100644 index 657a830..0000000 --- a/src/main/java/jwp/controller/UpdateUserFormController.java +++ /dev/null @@ -1,37 +0,0 @@ -package jwp.controller; - -import jwp.model.User; -import util.SessionUtil; - -import javax.servlet.RequestDispatcher; -import javax.servlet.ServletException; -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; -import java.io.IOException; - -// "/user/updateForm" -public class UpdateUserFormController implements Controller { - @Override - public String handle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - String userId = request.getParameter("userId"); - HttpSession session = request.getSession(); - User user = (User)session.getAttribute("user"); - - if (!SessionUtil.isLogin(request)) { - return "redirect:/user/login.html"; - } - - if (!SessionUtil.isOwner(request, userId)) { - return "redirect:/"; - } - - if(user!=null && user.getUserId().equals(userId)){ - return "/user/updateForm.jsp"; - } - - return "redirect:/"; - } -} diff --git a/src/main/java/jwp/controller/UserController.java b/src/main/java/jwp/controller/UserController.java index fad3787..da60fb9 100644 --- a/src/main/java/jwp/controller/UserController.java +++ b/src/main/java/jwp/controller/UserController.java @@ -3,11 +3,10 @@ import core.db.MemoryUserRepository; import jwp.dao.UserDao; import jwp.model.User; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.*; import util.SessionUtil; import util.UserSessionUtils; @@ -19,9 +18,12 @@ import java.sql.SQLException; import java.util.Collection; -@Controller("/user") +@Controller() +@RequestMapping("/user") +@RequiredArgsConstructor + public class UserController { - private final UserDao userDao = new UserDao(); + private final UserDao userDao; @PostMapping("/signup") public String createUser(@ModelAttribute User user) throws Exception { @@ -39,4 +41,38 @@ public String listUsers(HttpSession session, Model model) throws Exception { } return "redirect:/user/login"; } + + @PostMapping("/login") + public String userLogin(@RequestParam("userId") String userId, @RequestParam("password") String password, HttpSession session) throws Exception { + User user = userDao.findByUserId(userId); + if(user != null && user.getPassword().equals(password)){ + session.setAttribute("user", user); + return "redirect:/"; + } + return "redirect:/user/loginFailed"; + } + + @GetMapping("/logout") + public String userLogout(HttpSession session) throws ServletException, IOException { + session.removeAttribute("user"); + return "redirect:/"; + } + + @PostMapping("/update") + public String update(@ModelAttribute User user) throws Exception { + userDao.update(user); + return "redirect:/user/list"; + } + + @GetMapping("/updateForm") + public String updateForm(@RequestParam("userId") String userId , HttpSession session) throws ServletException, IOException { + User user = (User)session.getAttribute("user"); + if (!UserSessionUtils.isLogined(session)) { + return "redirect:/user/login"; + } + if(user!=null && user.getUserId().equals(userId)){ + return "/user/updateForm"; + } + return "redirect:/"; + } } diff --git a/src/main/java/jwp/dao/QuestionDao.java b/src/main/java/jwp/dao/QuestionDao.java index 6f17c95..3cdf802 100644 --- a/src/main/java/jwp/dao/QuestionDao.java +++ b/src/main/java/jwp/dao/QuestionDao.java @@ -1,59 +1,31 @@ package jwp.dao; -import core.jdbc.JdbcTemplate; -import core.jdbc.PreparedStatementSetter; -import core.jdbc.RowMapper; import jwp.model.Question; import jwp.model.User; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; import util.Keyholder; +import javax.persistence.EntityManager; +import javax.transaction.Transactional; import java.sql.SQLException; import java.util.List; +@Repository +@RequiredArgsConstructor public class QuestionDao { - private final JdbcTemplate jdbcTemplate = new JdbcTemplate(); + private final EntityManager em; public List findAll() { - String sql = "SELECT * FROM QUESTIONS"; - RowMapper rowMapper = rs -> new Question( - rs.getLong("questionId"), - rs.getString("writer"), - rs.getString("title"), - rs.getString("contents"), - rs.getTimestamp("createdDate"), - rs.getInt("countOfAnswer")); - - return jdbcTemplate.query(sql, rowMapper); + return em.createQuery("select q from Question q", Question.class).getResultList(); } + @Transactional public void insert(Question question) { - String sql = "INSERT INTO QUESTIONS (writer, title, contents, createdDate, countOfAnswer) VALUES (?, ?, ?, ?, ?)"; - PreparedStatementSetter ps = pstmt -> { - pstmt.setString(1, question.getWriter()); - pstmt.setString(2, question.getTitle()); - pstmt.setString(3, question.getContents()); - pstmt.setTimestamp(4, question.getCreatedDate()); - pstmt.setInt(5, question.getCountOfAnswer()); - }; - Keyholder holder = new Keyholder(); - jdbcTemplate.update2(sql, ps, holder); - - findByQuestionId(holder.getId()); + em.persist(question); } public Question findByQuestionId(Long questionId) { - String sql = "SELECT * FROM QUESTIONS WHERE questionId = ?"; - PreparedStatementSetter ps = pstmt -> { - pstmt.setLong(1, questionId); - }; - RowMapper rowMapper = rs -> new Question( - rs.getLong("questionId"), - rs.getString("writer"), - rs.getString("title"), - rs.getString("contents"), - rs.getTimestamp("createdDate"), - rs.getInt("countOfAnswer") - ); - return jdbcTemplate.queryForObject(sql, ps, rowMapper); + return em.find(Question.class, questionId); } } diff --git a/src/main/java/jwp/dao/UserDao.java b/src/main/java/jwp/dao/UserDao.java index a19823d..76a91f8 100644 --- a/src/main/java/jwp/dao/UserDao.java +++ b/src/main/java/jwp/dao/UserDao.java @@ -1,70 +1,36 @@ package jwp.dao; -import core.jdbc.ConnectionManager; -import core.jdbc.JdbcTemplate; -import core.jdbc.PreparedStatementSetter; -import core.jdbc.RowMapper; import jwp.model.User; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; +import javax.persistence.EntityManager; import java.sql.SQLException; -import java.util.ArrayList; import java.util.List; + +@Repository +@RequiredArgsConstructor public class UserDao { - //todo insert, update, delete - private final JdbcTemplate jdbcTemplate = new JdbcTemplate(); - public void insert(User user) throws SQLException { - String sql = "INSERT INTO USERS VALUES (?, ?, ?, ?)"; - PreparedStatementSetter ps = pstmt -> { - pstmt.setString(1, user.getUserId()); - pstmt.setString(2, user.getPassword()); - pstmt.setString(3, user.getName()); - pstmt.setString(4, user.getEmail()); - }; - jdbcTemplate.update(sql, ps); + private final EntityManager em; + + @Transactional + public void insert(User user) throws SQLException { + em.persist(user); } 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); + em.merge(user); } - public void delete(User user) throws SQLException { - - String sql = "DELETE FROM USERS WHERE userId = ?"; - PreparedStatementSetter pstmtSetter = pstmt -> { - pstmt.setString(1, user.getUserId()); - }; - jdbcTemplate.update(sql, pstmtSetter); - } - - //TODO findAll, findByUserId 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); + return em.createQuery("select u from User u", User.class).getResultList(); } public User findByUserId(String userId) throws SQLException { - String sql = "SELECT * 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); - + return em.find(User.class, userId); } } \ No newline at end of file diff --git a/src/main/java/jwp/model/Question.java b/src/main/java/jwp/model/Question.java index 607f195..f7ceda1 100644 --- a/src/main/java/jwp/model/Question.java +++ b/src/main/java/jwp/model/Question.java @@ -1,9 +1,18 @@ package jwp.model; +import lombok.NoArgsConstructor; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; import java.sql.Timestamp; import java.util.Objects; +@Entity +@Table(name = "QUESTIONS") +@NoArgsConstructor public class Question { + @Id private long questionId; // bigint -> long private String writer; // varchar -> String private String title; // varchar -> String diff --git a/src/main/java/jwp/model/User.java b/src/main/java/jwp/model/User.java index 635bf27..3c3ae82 100644 --- a/src/main/java/jwp/model/User.java +++ b/src/main/java/jwp/model/User.java @@ -1,6 +1,16 @@ package jwp.model; +import lombok.NoArgsConstructor; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "USERS") +@NoArgsConstructor public class User { + @Id private String userId; private String password; private String name; diff --git a/src/main/java/jwp/support/context/ContextLoaderListener.java b/src/main/java/jwp/support/context/ContextLoaderListener.java index 82a2613..063985a 100644 --- a/src/main/java/jwp/support/context/ContextLoaderListener.java +++ b/src/main/java/jwp/support/context/ContextLoaderListener.java @@ -1,10 +1,5 @@ package jwp.support.context; -import core.jdbc.ConnectionManager; -import org.springframework.core.io.ClassPathResource; -import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils; -import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; - import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; @@ -16,11 +11,10 @@ public class ContextLoaderListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { - ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); - populator.addScript(new ClassPathResource("jwp.sql")); - ConnectionManager.getDataSource(); - DatabasePopulatorUtils.execute(populator, ConnectionManager.getDataSource()); - +// ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); +// populator.addScript(new ClassPathResource("jwp.sql")); +// ConnectionManager.getDataSource(); +// DatabasePopulatorUtils.execute(populator, ConnectionManager.getDataSource()); logger.info("Completed Load ServletContext!"); } diff --git a/webapp/WEB-INF/.gitignore b/src/main/webapp/WEB-INF/.gitignore similarity index 100% rename from webapp/WEB-INF/.gitignore rename to src/main/webapp/WEB-INF/.gitignore diff --git a/webapp/css/styles.css b/src/main/webapp/css/styles.css similarity index 100% rename from webapp/css/styles.css rename to src/main/webapp/css/styles.css diff --git a/webapp/css/styles2.css b/src/main/webapp/css/styles2.css similarity index 100% rename from webapp/css/styles2.css rename to src/main/webapp/css/styles2.css diff --git a/webapp/favicon.ico b/src/main/webapp/favicon.ico similarity index 100% rename from webapp/favicon.ico rename to src/main/webapp/favicon.ico diff --git a/webapp/home.jsp b/src/main/webapp/home.jsp similarity index 100% rename from webapp/home.jsp rename to src/main/webapp/home.jsp diff --git a/webapp/img/KUIT.png b/src/main/webapp/img/KUIT.png similarity index 100% rename from webapp/img/KUIT.png rename to src/main/webapp/img/KUIT.png diff --git a/webapp/img/picture.jpeg b/src/main/webapp/img/picture.jpeg similarity index 100% rename from webapp/img/picture.jpeg rename to src/main/webapp/img/picture.jpeg diff --git a/webapp/include/header.jspf b/src/main/webapp/include/header.jspf similarity index 100% rename from webapp/include/header.jspf rename to src/main/webapp/include/header.jspf diff --git a/webapp/include/navigation.jspf b/src/main/webapp/include/navigation.jspf similarity index 100% rename from webapp/include/navigation.jspf rename to src/main/webapp/include/navigation.jspf diff --git a/webapp/js/scripts.js b/src/main/webapp/js/scripts.js similarity index 100% rename from webapp/js/scripts.js rename to src/main/webapp/js/scripts.js diff --git a/webapp/qna/form.jsp b/src/main/webapp/qna/form.jsp similarity index 100% rename from webapp/qna/form.jsp rename to src/main/webapp/qna/form.jsp diff --git a/webapp/qna/show.jsp b/src/main/webapp/qna/show.jsp similarity index 100% rename from webapp/qna/show.jsp rename to src/main/webapp/qna/show.jsp diff --git a/webapp/user/form.jsp b/src/main/webapp/user/form.jsp similarity index 100% rename from webapp/user/form.jsp rename to src/main/webapp/user/form.jsp diff --git a/webapp/user/list.jsp b/src/main/webapp/user/list.jsp similarity index 100% rename from webapp/user/list.jsp rename to src/main/webapp/user/list.jsp diff --git a/webapp/user/login.jsp b/src/main/webapp/user/login.jsp similarity index 100% rename from webapp/user/login.jsp rename to src/main/webapp/user/login.jsp diff --git a/webapp/user/loginFailed.jsp b/src/main/webapp/user/loginFailed.jsp similarity index 100% rename from webapp/user/loginFailed.jsp rename to src/main/webapp/user/loginFailed.jsp diff --git a/webapp/user/updateForm.jsp b/src/main/webapp/user/updateForm.jsp similarity index 100% rename from webapp/user/updateForm.jsp rename to src/main/webapp/user/updateForm.jsp