From b2a8b2dea442bd1fb212dc1be90069ed078dae92 Mon Sep 17 00:00:00 2001 From: Gobukgol Date: Sat, 11 Jul 2020 16:41:40 +0900 Subject: [PATCH 1/2] =?UTF-8?q?step0=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/core/db/DataBase.java" | 24 +++++++ .../java/core/jdbc/ConnectionManager.java" | 32 +++++++++ .../web/filter/CharacterEncodingFilter.java" | 34 +++++++++ .../src/main/java/next/dao/UserDao.java" | 67 ++++++++++++++++++ .../src/main/java/next/model/User.java" | 69 +++++++++++++++++++ .../context/ContextLoaderListener.java" | 31 +++++++++ .../java/next/web/CreateUserServlet.java" | 31 +++++++++ .../main/java/next/web/ListUserServlet.java" | 19 +++-- "6~12\354\236\245/src/main/resources/jwp.sql" | 12 ++++ .../src/main/resources/logback.xml" | 17 +++++ .../src/main/resources/startdb.bat" | 1 + 11 files changed, 330 insertions(+), 7 deletions(-) create mode 100644 "6~12\354\236\245/src/main/java/core/db/DataBase.java" create mode 100644 "6~12\354\236\245/src/main/java/core/jdbc/ConnectionManager.java" create mode 100644 "6~12\354\236\245/src/main/java/core/web/filter/CharacterEncodingFilter.java" create mode 100644 "6~12\354\236\245/src/main/java/next/dao/UserDao.java" create mode 100644 "6~12\354\236\245/src/main/java/next/model/User.java" create mode 100644 "6~12\354\236\245/src/main/java/next/support/context/ContextLoaderListener.java" create mode 100644 "6~12\354\236\245/src/main/java/next/web/CreateUserServlet.java" rename "6~12\354\236\245/src/main/java/next/HelloWorldServlet.java" => "6~12\354\236\245/src/main/java/next/web/ListUserServlet.java" (50%) create mode 100644 "6~12\354\236\245/src/main/resources/jwp.sql" create mode 100644 "6~12\354\236\245/src/main/resources/logback.xml" create mode 100755 "6~12\354\236\245/src/main/resources/startdb.bat" diff --git "a/6~12\354\236\245/src/main/java/core/db/DataBase.java" "b/6~12\354\236\245/src/main/java/core/db/DataBase.java" new file mode 100644 index 0000000..4632ca5 --- /dev/null +++ "b/6~12\354\236\245/src/main/java/core/db/DataBase.java" @@ -0,0 +1,24 @@ +package core.db; + +import java.util.Collection; +import java.util.Map; + +import com.google.common.collect.Maps; + +import next.model.User; + +public class DataBase { + private static Map users = Maps.newHashMap(); + + public static void addUser(User user) { + users.put(user.getUserId(), user); + } + + public static User findUserById(String userId) { + return users.get(userId); + } + + public static Collection findAll() { + return users.values(); + } +} diff --git "a/6~12\354\236\245/src/main/java/core/jdbc/ConnectionManager.java" "b/6~12\354\236\245/src/main/java/core/jdbc/ConnectionManager.java" new file mode 100644 index 0000000..042d8fc --- /dev/null +++ "b/6~12\354\236\245/src/main/java/core/jdbc/ConnectionManager.java" @@ -0,0 +1,32 @@ +package core.jdbc; + +import java.sql.Connection; +import java.sql.SQLException; + +import javax.sql.DataSource; + +import org.apache.commons.dbcp2.BasicDataSource; + +public class ConnectionManager { + private static final String DB_DRIVER = "org.h2.Driver"; + private static final String DB_URL = "jdbc:h2:~/jwp-basic;AUTO_SERVER=TRUE"; + private static final String DB_USERNAME = "sa"; + private static final String DB_PW = ""; + + public static DataSource getDataSource() { + BasicDataSource 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/6~12\354\236\245/src/main/java/core/web/filter/CharacterEncodingFilter.java" "b/6~12\354\236\245/src/main/java/core/web/filter/CharacterEncodingFilter.java" new file mode 100644 index 0000000..e6b274f --- /dev/null +++ "b/6~12\354\236\245/src/main/java/core/web/filter/CharacterEncodingFilter.java" @@ -0,0 +1,34 @@ +package core.web.filter; + +import java.io.IOException; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.annotation.WebFilter; + +@WebFilter("/*") +public class CharacterEncodingFilter implements Filter { + private static final String DEFAULT_ENCODING = "UTF-8"; + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + request.setCharacterEncoding(DEFAULT_ENCODING); + response.setCharacterEncoding(DEFAULT_ENCODING); + chain.doFilter(request, response); + + } + + @Override + public void destroy() { + } + +} diff --git "a/6~12\354\236\245/src/main/java/next/dao/UserDao.java" "b/6~12\354\236\245/src/main/java/next/dao/UserDao.java" new file mode 100644 index 0000000..e435180 --- /dev/null +++ "b/6~12\354\236\245/src/main/java/next/dao/UserDao.java" @@ -0,0 +1,67 @@ +package next.dao; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import core.jdbc.ConnectionManager; +import next.model.User; + +public class UserDao { + public void insert(User user) throws SQLException { + Connection con = null; + PreparedStatement pstmt = null; + try { + con = ConnectionManager.getConnection(); + String sql = "INSERT INTO USERS VALUES (?, ?, ?, ?)"; + pstmt = con.prepareStatement(sql); + pstmt.setString(1, user.getUserId()); + pstmt.setString(2, user.getPassword()); + pstmt.setString(3, user.getName()); + pstmt.setString(4, user.getEmail()); + + pstmt.executeUpdate(); + } finally { + if (pstmt != null) { + pstmt.close(); + } + + if (con != null) { + con.close(); + } + } + } + + public User findByUserId(String userId) throws SQLException { + Connection con = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + try { + con = ConnectionManager.getConnection(); + String sql = "SELECT userId, password, name, email FROM USERS WHERE userid=?"; + pstmt = con.prepareStatement(sql); + pstmt.setString(1, userId); + + rs = pstmt.executeQuery(); + + User user = null; + if (rs.next()) { + user = new User(rs.getString("userId"), rs.getString("password"), rs.getString("name"), + rs.getString("email")); + } + + return user; + } finally { + if (rs != null) { + rs.close(); + } + if (pstmt != null) { + pstmt.close(); + } + if (con != null) { + con.close(); + } + } + } +} diff --git "a/6~12\354\236\245/src/main/java/next/model/User.java" "b/6~12\354\236\245/src/main/java/next/model/User.java" new file mode 100644 index 0000000..c3413b4 --- /dev/null +++ "b/6~12\354\236\245/src/main/java/next/model/User.java" @@ -0,0 +1,69 @@ +package next.model; + +public class User { + private String userId; + private String password; + private String name; + private String email; + + public User(String userId, String password, String name, String email) { + this.userId = userId; + this.password = password; + this.name = name; + this.email = email; + } + + public String getUserId() { + return userId; + } + + public String getPassword() { + return password; + } + + public String getName() { + return name; + } + + public String getEmail() { + return email; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((email == null) ? 0 : email.hashCode()); + result = prime * result + ((name == null) ? 0 : name.hashCode()); + result = prime * result + ((userId == null) ? 0 : userId.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + User other = (User) obj; + if (email == null) { + if (other.email != null) + return false; + } else if (!email.equals(other.email)) + return false; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + if (userId == null) { + if (other.userId != null) + return false; + } else if (!userId.equals(other.userId)) + return false; + return true; + } + +} diff --git "a/6~12\354\236\245/src/main/java/next/support/context/ContextLoaderListener.java" "b/6~12\354\236\245/src/main/java/next/support/context/ContextLoaderListener.java" new file mode 100644 index 0000000..4e57288 --- /dev/null +++ "b/6~12\354\236\245/src/main/java/next/support/context/ContextLoaderListener.java" @@ -0,0 +1,31 @@ +package next.support.context; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import javax.servlet.annotation.WebListener; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.io.ClassPathResource; +import org.springframework.jdbc.datasource.init.DatabasePopulatorUtils; +import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; + +import core.jdbc.ConnectionManager; + +@WebListener +public class ContextLoaderListener implements ServletContextListener { + private static final Logger logger = LoggerFactory.getLogger(ContextLoaderListener.class); + + @Override + public void contextInitialized(ServletContextEvent sce) { + ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); + populator.addScript(new ClassPathResource("jwp.sql")); + DatabasePopulatorUtils.execute(populator, ConnectionManager.getDataSource()); + + logger.info("Completed Load ServletContext!"); + } + + @Override + public void contextDestroyed(ServletContextEvent sce) { + } +} diff --git "a/6~12\354\236\245/src/main/java/next/web/CreateUserServlet.java" "b/6~12\354\236\245/src/main/java/next/web/CreateUserServlet.java" new file mode 100644 index 0000000..3260088 --- /dev/null +++ "b/6~12\354\236\245/src/main/java/next/web/CreateUserServlet.java" @@ -0,0 +1,31 @@ +package next.web; + +import java.io.IOException; + +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 next.model.User; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import core.db.DataBase; + +@WebServlet("/user/create") +public class CreateUserServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + private static final Logger log = LoggerFactory.getLogger(CreateUserServlet.class); + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + User user = new User(req.getParameter("userId"), req.getParameter("password"), req.getParameter("name"), + req.getParameter("email")); + log.debug("user : {}", user); + DataBase.addUser(user); + resp.sendRedirect("/user/list"); + } +} diff --git "a/6~12\354\236\245/src/main/java/next/HelloWorldServlet.java" "b/6~12\354\236\245/src/main/java/next/web/ListUserServlet.java" similarity index 50% rename from "6~12\354\236\245/src/main/java/next/HelloWorldServlet.java" rename to "6~12\354\236\245/src/main/java/next/web/ListUserServlet.java" index 26a828f..736ffd4 100644 --- "a/6~12\354\236\245/src/main/java/next/HelloWorldServlet.java" +++ "b/6~12\354\236\245/src/main/java/next/web/ListUserServlet.java" @@ -1,19 +1,24 @@ -package next; +package next.web; import java.io.IOException; -import java.io.PrintWriter; +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; -@WebServlet("/hello") -public class HelloWorldServlet extends HttpServlet { +import core.db.DataBase; + +@WebServlet("/user/list") +public class ListUserServlet extends HttpServlet { + private static final long serialVersionUID = 1L; + @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - PrintWriter out = resp.getWriter(); - out.print("Hello World!"); + req.setAttribute("users", DataBase.findAll()); + RequestDispatcher rd = req.getRequestDispatcher("/user/list.jsp"); + rd.forward(req, resp); } -} \ No newline at end of file +} diff --git "a/6~12\354\236\245/src/main/resources/jwp.sql" "b/6~12\354\236\245/src/main/resources/jwp.sql" new file mode 100644 index 0000000..85a9d38 --- /dev/null +++ "b/6~12\354\236\245/src/main/resources/jwp.sql" @@ -0,0 +1,12 @@ +DROP TABLE IF EXISTS USERS; + +CREATE TABLE USERS ( + userId varchar(12) NOT NULL, + password varchar(12) NOT NULL, + name varchar(20) NOT NULL, + email varchar(50), + + PRIMARY KEY (userId) +); + +INSERT INTO USERS VALUES('admin', 'password', '자바지기', 'admin@slipp.net'); \ No newline at end of file diff --git "a/6~12\354\236\245/src/main/resources/logback.xml" "b/6~12\354\236\245/src/main/resources/logback.xml" new file mode 100644 index 0000000..bcf9ca9 --- /dev/null +++ "b/6~12\354\236\245/src/main/resources/logback.xml" @@ -0,0 +1,17 @@ + + + + + + %d{HH:mm:ss.SSS} [%-5level] [%thread] [%logger{36}] - %m%n + + + + + + + + + + + \ No newline at end of file diff --git "a/6~12\354\236\245/src/main/resources/startdb.bat" "b/6~12\354\236\245/src/main/resources/startdb.bat" new file mode 100755 index 0000000..d4b6b4b --- /dev/null +++ "b/6~12\354\236\245/src/main/resources/startdb.bat" @@ -0,0 +1 @@ +java -cp h2-1.3.167.jar org.h2.tools.Server \ No newline at end of file From 9fb61820fb4ea1e4173617a0b9bb9927181d0e80 Mon Sep 17 00:00:00 2001 From: Gobukgol Date: Sat, 11 Jul 2020 16:59:09 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "6~12\354\236\245/build.gradle" | 8 +++---- .../src/test/java/next/dao/UserDaoTest.java" | 21 +++++++++++++++++++ .../test/resources/templates/helloworld.ftl" | 8 +++++++ 3 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 "6~12\354\236\245/src/test/java/next/dao/UserDaoTest.java" create mode 100644 "6~12\354\236\245/src/test/resources/templates/helloworld.ftl" diff --git "a/6~12\354\236\245/build.gradle" "b/6~12\354\236\245/build.gradle" index c00d3f4..7d2e984 100644 --- "a/6~12\354\236\245/build.gradle" +++ "b/6~12\354\236\245/build.gradle" @@ -31,10 +31,10 @@ dependencies { testImplementation'org.junit.jupiter:junit-jupiter:5.5.2' testImplementation'org.assertj:assertj-core:3.14.0' - compileOnly 'javax.servlet:javax.servlet-api:3.1.0' - compileOnly 'org.apache.tomcat.embed:tomcat-embed-core:8.0.15' - compileOnly 'org.apache.tomcat.embed:tomcat-embed-logging-juli:8.0.15' - compileOnly 'org.apache.tomcat.embed:tomcat-embed-jasper:8.0.15' + compile 'javax.servlet:javax.servlet-api:3.1.0' + compile 'org.apache.tomcat.embed:tomcat-embed-core:8.0.15' + compile 'org.apache.tomcat.embed:tomcat-embed-logging-juli:8.0.15' + compile 'org.apache.tomcat.embed:tomcat-embed-jasper:8.0.15' } group = 'org.nhnnext' diff --git "a/6~12\354\236\245/src/test/java/next/dao/UserDaoTest.java" "b/6~12\354\236\245/src/test/java/next/dao/UserDaoTest.java" new file mode 100644 index 0000000..a1de9c8 --- /dev/null +++ "b/6~12\354\236\245/src/test/java/next/dao/UserDaoTest.java" @@ -0,0 +1,21 @@ +package next.dao; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import next.model.User; + +public class UserDaoTest { + + @Test + public void crud() throws Exception { + User expected = new User("userId", "password", "name", "javajigi@email.com"); + UserDao userDao = new UserDao(); + userDao.insert(expected); + + User actual = userDao.findByUserId(expected.getUserId()); + assertEquals(expected, actual); + } + +} diff --git "a/6~12\354\236\245/src/test/resources/templates/helloworld.ftl" "b/6~12\354\236\245/src/test/resources/templates/helloworld.ftl" new file mode 100644 index 0000000..40b5eb1 --- /dev/null +++ "b/6~12\354\236\245/src/test/resources/templates/helloworld.ftl" @@ -0,0 +1,8 @@ +FreeMarker Template 예제 : ${message} + +======================= +=== County List ==== +======================= +<#list countries as country> + ${country_index + 1}. ${country} + \ No newline at end of file