Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
47d6b62
CreateUserController가 UserDao를 사용하도록 수정
siyoon210 Jul 27, 2020
73d1102
UserDao의 findAll() 메서드 구현
siyoon210 Jul 27, 2020
f95a9c4
UserDao의 update() 메서드 구현
siyoon210 Jul 27, 2020
7a321e1
INSERT와 UPDATE쿼리 중복 제거 작업 (p237 1번째)
siyoon210 Jul 27, 2020
3831ba3
공통 라이브러리 구현 InsertJdbcTemplate, UpdateJdbcTemplate (p237 2번째)
siyoon210 Jul 27, 2020
4d481ab
비공통부분을 추상메서드로 만들어 의존관계를 끊고, 익명클래스로 비공통 구현체를 선언 (p238 1번쨰)
siyoon210 Jul 27, 2020
f016817
두개의 공통 클래스의 역할과 로직이 같아 하나의 클래스로 통합 (p238 2번째)
siyoon210 Jul 27, 2020
22df26b
JdbcTemplate의 User 의존성 제거 (p239 1번째)
siyoon210 Jul 27, 2020
3936c52
SQLException을 RuntimeException으로 변경
siyoon210 Jul 27, 2020
3d8a48a
SQLException catch시에 log 추가
siyoon210 Jul 27, 2020
7f0d041
SelectJdbcTemplate 생성 (p239 2번째)
siyoon210 Jul 27, 2020
63b786e
SelectJdbcTemplate 삭제하고 JdbcTemplate와 통합 (p240 1번째)
siyoon210 Jul 27, 2020
aa26cf2
통합과정에서 불필요하게 강요되는 메서드를 인터페이스로 분리하여서 리팩토링 (p240 2번쨰)
siyoon210 Jul 27, 2020
8da9b9c
PreparedStatementSetter를 직접생성하지 않고 Objects 가변인자로만 전달하여도 내부적으로 만들어주는 메…
siyoon210 Jul 27, 2020
2307b83
@FunctionalInterface 애노테이션 추가 (p243)
siyoon210 Jul 27, 2020
c045d98
JdbcTemplate 클래스 필드로
siyoon210 Jul 27, 2020
a675850
User를 ResultSet을 담는 생성자 생성
siyoon210 Jul 27, 2020
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
5 changes: 4 additions & 1 deletion src/main/java/next/controller/CreateUserController.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import next.dao.UserDao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -19,7 +20,9 @@ public String execute(HttpServletRequest req, HttpServletResponse resp) throws E
req.getParameter("email"));
log.debug("User : {}", user);

DataBase.addUser(user);
// DataBase.addUser(user);
UserDao userDao = new UserDao();
userDao.insert(user);
return "redirect:/";
}
}
80 changes: 80 additions & 0 deletions src/main/java/next/dao/JdbcTemplate.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package next.dao;

import core.jdbc.ConnectionManager;
import next.exception.JdbcTemplateException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

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 JdbcTemplate<T> {
private static final Logger log = LoggerFactory.getLogger(JdbcTemplate.class);

public void update(String sql, PreparedStatementSetter pstmtSetter) {
try (Connection con = ConnectionManager.getConnection();
PreparedStatement pstmt = con.prepareStatement(sql)) {
pstmtSetter.setValues(pstmt);
pstmt.executeUpdate();
} catch (SQLException e) {
log.error("SQLException!! {}", e.getMessage());
throw new JdbcTemplateException();
}
}

public void update(String sql, Object... objects) {
update(sql, createPreparedStatementSetter(objects));
}

public PreparedStatementSetter createPreparedStatementSetter(Object... objects) {
return (PreparedStatement pstmt) -> {
for (int i = 1; i <= objects.length; i++) {
pstmt.setObject(i, objects[i - 1]);
}
};
}

public List<T> query(String sql, RowMapper<T> rowMapper, PreparedStatementSetter pstmtSetter) {
try (Connection con = ConnectionManager.getConnection();
PreparedStatement pstmt = con.prepareStatement(sql)) {
pstmtSetter.setValues(pstmt);
final ResultSet rs = pstmt.executeQuery();
List<T> results = new ArrayList<>();
while (rs.next()) {
final T o = rowMapper.mapRow(rs);
results.add(o);
}
return results;
} catch (SQLException e) {
log.error("SQLException!! {}", e.getMessage());
throw new JdbcTemplateException();
}
}

public List<T> query(String sql, RowMapper<T> rowMapper, Object... objects) {
return query(sql, rowMapper, createPreparedStatementSetter(objects));
}

public T queryForObject(String sql, RowMapper<T> rowMapper, PreparedStatementSetter pstmtSetter) {
try (Connection con = ConnectionManager.getConnection();
PreparedStatement pstmt = con.prepareStatement(sql)) {
pstmtSetter.setValues(pstmt);
final ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
return rowMapper.mapRow(rs);
}
return null;
} catch (SQLException e) {
log.error("SQLException!! {}", e.getMessage());
throw new JdbcTemplateException();
}
}

public T queryForObject(String sql, RowMapper<T> rowMapper, Object... objects) {
return queryForObject(sql, rowMapper, createPreparedStatementSetter(objects));
}
}
9 changes: 9 additions & 0 deletions src/main/java/next/dao/PreparedStatementSetter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package next.dao;

import java.sql.PreparedStatement;
import java.sql.SQLException;

@FunctionalInterface
public interface PreparedStatementSetter {
void setValues(PreparedStatement pstmt) throws SQLException;
}
9 changes: 9 additions & 0 deletions src/main/java/next/dao/RowMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package next.dao;

import java.sql.ResultSet;
import java.sql.SQLException;

@FunctionalInterface
public interface RowMapper<T> {
T mapRow(ResultSet rs) throws SQLException;
}
77 changes: 15 additions & 62 deletions src/main/java/next/dao/UserDao.java
Original file line number Diff line number Diff line change
@@ -1,78 +1,31 @@
package next.dao;

import java.sql.Connection;
import next.model.User;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import core.jdbc.ConnectionManager;
import next.model.User;

public class UserDao {
public void insert(User user) throws SQLException {
Connection con = null;
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());
private final JdbcTemplate<User> jdbcTemplate = new JdbcTemplate<>();

pstmt.executeUpdate();
} finally {
if (pstmt != null) {
pstmt.close();
}

if (con != null) {
con.close();
}
}
public void insert(User user) {
jdbcTemplate.update("INSERT INTO USERS VALUES (?, ?, ?, ?)",
user.getUserId(), user.getPassword(), user.getName(), user.getEmail());
}

public void update(User user) throws SQLException {
// TODO 구현 필요함.
public void update(User user) {
jdbcTemplate.update("UPDATE USERS SET password = ?, name = ?, email = ? WHERE userId = ?",
user.getPassword(), user.getName(), user.getEmail(), user.getUserId());
}

public List<User> findAll() throws SQLException {
// TODO 구현 필요함.
return new ArrayList<User>();
public List<User> findAll() {
return jdbcTemplate.query("SELECT userId, password, name, email FROM USERS",
User::new);
}

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();
}
}
public User findByUserId(String userId) {
return jdbcTemplate.queryForObject("SELECT userId, password, name, email FROM USERS WHERE userid=?",
User::new, userId);
}
}
7 changes: 7 additions & 0 deletions src/main/java/next/exception/JdbcTemplateException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package next.exception;

public class JdbcTemplateException extends RuntimeException {
public JdbcTemplateException() {
super();
}
}
24 changes: 23 additions & 1 deletion src/main/java/next/model/User.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,17 @@
package next.model;

import next.dao.JdbcTemplate;
import next.exception.JdbcTemplateException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.sql.ResultSet;
import java.sql.SQLException;

public class User {
private String userId;
private static final Logger log = LoggerFactory.getLogger(JdbcTemplate.class);

private final String userId;
private String password;
private String name;
private String email;
Expand All @@ -13,6 +23,18 @@ public User(String userId, String password, String name, String email) {
this.email = email;
}

public User(ResultSet rs) {
try {
this.userId = rs.getString("userId");
this.password = rs.getString("password");
this.name = rs.getString("name");
this.email = rs.getString("email");
} catch (SQLException e) {
log.error("SQLException!! {}", e.getMessage());
throw new JdbcTemplateException();
}
}

public String getUserId() {
return userId;
}
Expand Down
3 changes: 2 additions & 1 deletion src/main/resources/jwp.sql
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ CREATE TABLE USERS (
PRIMARY KEY (userId)
);

INSERT INTO USERS VALUES('admin', 'password', '자바지기', 'admin@slipp.net');
INSERT INTO USERS VALUES('admin', 'password', '자바지기', 'admin@slipp.net');
INSERT INTO USERS VALUES('siyoon', '12334', '푸루', 'jung_210@naver.com');
2 changes: 1 addition & 1 deletion src/test/java/next/dao/UserDaoTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,6 @@ public void crud() throws Exception {
public void findAll() throws Exception {
UserDao userDao = new UserDao();
List<User> users = userDao.findAll();
assertEquals(1, users.size());
assertEquals(2, users.size());
}
}