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

[JDBC 라이브러리 구현하기 - 1, 2단계] 파즈(강승윤) 미션 제출합니다. #18

Merged
merged 23 commits into from
Sep 26, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
81eeff7
refactor: DataSource import 시키기
Be-poz Sep 21, 2021
1579809
refactor: UserDao 나머지 함수들 구현
Be-poz Sep 21, 2021
262ea33
refactor: code formatting
Be-poz Sep 22, 2021
917e76c
feat: JdbcTemplate query, queryForObject 메서드 생성
Be-poz Sep 22, 2021
b25341a
refactor: UserDao JdbcTemplate 이용으로 변경
Be-poz Sep 22, 2021
6bb73b9
refactor: 테스트 돌아가게끔 JdbcTemplate 수정
Be-poz Sep 22, 2021
e0f8819
refactor: Controller Inmemory 에서 UserDao 사용으로 변경
Be-poz Sep 22, 2021
d4501a6
refactor: jdbctemplate 템플릿 메서드 패턴 적용
Be-poz Sep 22, 2021
ccb6659
refactor: userRowMapper 메서드 분리
Be-poz Sep 22, 2021
3d2249b
refactor: exception 제거
Be-poz Sep 22, 2021
b535d6c
refactor: 오류 수정 및 try-resource 적용
Be-poz Sep 22, 2021
91793fb
refactor: UserDao static으로 변경
Be-poz Sep 25, 2021
a90dac8
refactor: UserDao log 추가
Be-poz Sep 25, 2021
163bdb0
refactor: ModelAndView class redirect render method included
Be-poz Sep 25, 2021
5713aaa
feat: ViewRedirectHelper 클래스 추가
Be-poz Sep 25, 2021
96ec372
refactor: JdbcExecutionException 메세지 인자로 받게끔 변경
Be-poz Sep 25, 2021
3f59702
refactor: code reformat
Be-poz Sep 25, 2021
339770c
refactor: 개행 추가
Be-poz Sep 25, 2021
e58ebc7
refactor: Object 가변인지 널체크
Be-poz Sep 25, 2021
06894e2
refactor: ViewRedirectHelper private ctor added
Be-poz Sep 26, 2021
4565c33
refactor: JdbcException abstract class 추가
Be-poz Sep 26, 2021
bb4cb45
refactor: DatabasePopulatorUtils try-resource로 변경
Be-poz Sep 26, 2021
b2fdda3
feat: JdbcTemplate Test 추가
Be-poz Sep 26, 2021
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
2 changes: 1 addition & 1 deletion app/src/main/java/com/techcourse/ManualHandlerMapping.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.techcourse;

import com.techcourse.controller.*;
import com.techcourse.controller.LogoutController;
import jakarta.servlet.http.HttpServletRequest;
import nextstep.mvc.HandlerMapping;
import nextstep.mvc.controller.asis.Controller;
Expand Down
8 changes: 5 additions & 3 deletions app/src/main/java/com/techcourse/config/DataSourceConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@

import org.h2.jdbcx.JdbcDataSource;

import javax.sql.DataSource;
import java.util.Objects;

public class DataSourceConfig {

private static javax.sql.DataSource INSTANCE;
private static DataSource INSTANCE;

public static javax.sql.DataSource getInstance() {
public static DataSource getInstance() {
if (Objects.isNull(INSTANCE)) {
INSTANCE = createJdbcDataSource();
}
Expand All @@ -23,5 +24,6 @@ private static JdbcDataSource createJdbcDataSource() {
return jdbcDataSource;
}

private DataSourceConfig() {}
private DataSourceConfig() {
}
}
22 changes: 7 additions & 15 deletions app/src/main/java/com/techcourse/controller/LoginController.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package com.techcourse.controller;

import com.techcourse.dao.UserDao;
import com.techcourse.domain.User;
import com.techcourse.repository.InMemoryUserRepository;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import nextstep.mvc.view.JspView;
import nextstep.mvc.view.ModelAndView;
import nextstep.mvc.view.util.ViewRedirectHelper;
import nextstep.web.annotation.Controller;
import nextstep.web.annotation.RequestMapping;
import nextstep.web.support.RequestMethod;
Expand All @@ -23,36 +24,27 @@ public ModelAndView view(HttpServletRequest request, HttpServletResponse respons
return UserSession.getUserFrom(request.getSession())
.map(user -> {
log.info("logged in {}", user.getAccount());
return redirect("/index.jsp");
return ViewRedirectHelper.redirect("/index.jsp");
})
.orElse(new ModelAndView(new JspView("/login.jsp")));
}

@RequestMapping(value = "/login", method = RequestMethod.POST)
public ModelAndView login(HttpServletRequest request, HttpServletResponse response) {
if (UserSession.isLoggedIn(request.getSession())) {
return redirect("/index.jsp");
return ViewRedirectHelper.redirect("/index.jsp");
}

return InMemoryUserRepository.findByAccount(request.getParameter("account"))
.map(user -> {
log.info("User : {}", user);
return login(request, user);
})
.orElse(redirect("/401.jsp"));
return login(request, UserDao.findByAccount(request.getParameter("account")));
}

private ModelAndView login(HttpServletRequest request, User user) {
if (user.checkPassword(request.getParameter("password"))) {
final HttpSession session = request.getSession();
session.setAttribute(UserSession.SESSION_KEY, user);
return redirect("/index.jsp");
return ViewRedirectHelper.redirect("/index.jsp");
} else {
return redirect("/401.jsp");
return ViewRedirectHelper.redirect("/401.jsp");
}
}

private ModelAndView redirect(String path) {
return new ModelAndView(new JspView(JspView.REDIRECT_PREFIX + path));
}
}
Original file line number Diff line number Diff line change
@@ -1,31 +1,37 @@
package com.techcourse.controller;

import com.techcourse.dao.UserDao;
import com.techcourse.domain.User;
import com.techcourse.repository.InMemoryUserRepository;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import nextstep.mvc.view.JspView;
import nextstep.mvc.view.ModelAndView;
import nextstep.mvc.view.util.ViewRedirectHelper;
import nextstep.web.annotation.Controller;
import nextstep.web.annotation.RequestMapping;
import nextstep.web.support.RequestMethod;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Controller
public class RegisterController {

private static final Logger log = LoggerFactory.getLogger(RegisterController.class);

@RequestMapping(value = "/register", method = RequestMethod.POST)
public ModelAndView register(HttpServletRequest request, HttpServletResponse response) {
final User user = new User(2,
request.getParameter("account"),
request.getParameter("password"),
request.getParameter("email"));
InMemoryUserRepository.save(user);

return new ModelAndView(new JspView("redirect:/index.jsp"));
UserDao.insert(user);
return ViewRedirectHelper.redirect("/index.jsp");
}

@RequestMapping(value = "/register", method = RequestMethod.GET)
public ModelAndView view(HttpServletRequest request, HttpServletResponse response) {
return new ModelAndView(new JspView("/register.jsp"));
}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.techcourse.controller;

import com.techcourse.dao.UserDao;
import com.techcourse.domain.User;
import com.techcourse.repository.InMemoryUserRepository;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import nextstep.mvc.view.JsonView;
Expand All @@ -23,9 +23,8 @@ public ModelAndView show(HttpServletRequest request, HttpServletResponse respons
log.debug("user id : {}", account);

final ModelAndView modelAndView = new ModelAndView(new JsonView());
final User user = InMemoryUserRepository.findByAccount(account)
.orElseThrow();

final User user = UserDao.findByAccount(account);
modelAndView.addObject("user", user);
return modelAndView;
}
Expand Down
3 changes: 2 additions & 1 deletion app/src/main/java/com/techcourse/controller/UserSession.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,6 @@ public static boolean isLoggedIn(HttpSession session) {
return getUserFrom(session).isPresent();
}

private UserSession() {}
private UserSession() {
}
}
121 changes: 30 additions & 91 deletions app/src/main/java/com/techcourse/dao/UserDao.java
Original file line number Diff line number Diff line change
@@ -1,116 +1,55 @@
package com.techcourse.dao;

import com.techcourse.config.DataSourceConfig;
import com.techcourse.domain.User;
import nextstep.jdbc.JdbcTemplate;
import nextstep.jdbc.RowMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

public class UserDao {

private static final Logger log = LoggerFactory.getLogger(UserDao.class);
private static final JdbcTemplate jdbcTemplate = new JdbcTemplate(DataSourceConfig.getInstance());

private final DataSource dataSource;

public UserDao(DataSource dataSource) {
this.dataSource = dataSource;
}

public void insert(User user) {
public static void insert(User user) {
log.info("UserDao insert Method");
final String sql = "insert into users (account, password, email) values (?, ?, ?)";

Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = dataSource.getConnection();
pstmt = conn.prepareStatement(sql);

log.debug("query : {}", sql);

pstmt.setString(1, user.getAccount());
pstmt.setString(2, user.getPassword());
pstmt.setString(3, user.getEmail());
pstmt.executeUpdate();
} catch (SQLException e) {
log.error(e.getMessage(), e);
throw new RuntimeException(e);
} finally {
try {
if (pstmt != null) {
pstmt.close();
}
} catch (SQLException ignored) {}

try {
if (conn != null) {
conn.close();
}
} catch (SQLException ignored) {}
}
jdbcTemplate.update(sql, user.getAccount(), user.getPassword(), user.getEmail());
}

public void update(User user) {
// todo
public static void update(User user) {
log.info("UserDao update Method");
final String sql = "update users set account = ?, password = ?, email = ? where id = ?";
jdbcTemplate.update(sql, user.getAccount(), user.getPassword(), user.getEmail(), user.getId());
}

public List<User> findAll() {
// todo
return null;
public static List<User> findAll() {
log.info("UserDao findAll Method");
final String sql = "select id, account, password, email from users";
return jdbcTemplate.query(sql, userRowMapper());
}

public User findById(Long id) {
public static User findById(Long id) {
log.info("UserDao findById Method");
final String sql = "select id, account, password, email from users where id = ?";
return jdbcTemplate.queryForObject(sql, userRowMapper(), id);
}

Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = dataSource.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setLong(1, id);
rs = pstmt.executeQuery();

log.debug("query : {}", sql);

if (rs.next()) {
return new User(
rs.getLong(1),
rs.getString(2),
rs.getString(3),
rs.getString(4));
}
return null;
} catch (SQLException e) {
log.error(e.getMessage(), e);
throw new RuntimeException(e);
} finally {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException ignored) {}

try {
if (pstmt != null) {
pstmt.close();
}
} catch (SQLException ignored) {}

try {
if (conn != null) {
conn.close();
}
} catch (SQLException ignored) {}
}
public static User findByAccount(String account) {
log.info("UserDao findByAccount Method");
final String sql = "select id, account, password, email from users where account = ?";
return jdbcTemplate.queryForObject(sql, userRowMapper(), account);
}

public User findByAccount(String account) {
// todo
return null;
public static RowMapper<User> userRowMapper() {
return (rs -> new User(
rs.getLong("id"),
rs.getString("account"),
rs.getString("password"),
rs.getString("email")
));
}
}
15 changes: 15 additions & 0 deletions app/src/main/java/com/techcourse/domain/User.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.techcourse.domain;

import java.util.Objects;

public class User {

private Long id;
Expand Down Expand Up @@ -44,6 +46,19 @@ public String getPassword() {
return password;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(id, user.id);
}

@Override
public int hashCode() {
return Objects.hash(id);
}

@Override
public String toString() {
return "User{" +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,5 +23,6 @@ public static Optional<User> findByAccount(String account) {
return Optional.ofNullable(database.get(account));
}

private InMemoryUserRepository() {}
private InMemoryUserRepository() {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,31 +17,17 @@ public class DatabasePopulatorUtils {
private static final Logger log = LoggerFactory.getLogger(DatabasePopulatorUtils.class);

public static void execute(DataSource dataSource) {
Connection connection = null;
Statement statement = null;
try {
try (Connection connection = dataSource.getConnection();
Statement statement = connection.createStatement()) {
final URL url = DatabasePopulatorUtils.class.getClassLoader().getResource("schema.sql");
final File file = new File(url.getFile());
final String sql = Files.readString(file.toPath());
connection = dataSource.getConnection();
statement = connection.createStatement();
statement.execute(sql);
} catch (NullPointerException | IOException | SQLException e) {
log.error(e.getMessage(), e);
} finally {
try {
if (statement != null) {
statement.close();
}
} catch (SQLException ignored) {}

try {
if (connection != null) {
connection.close();
}
} catch (SQLException ignored) {}
}
}

private DatabasePopulatorUtils() {}
private DatabasePopulatorUtils() {
}
}
4 changes: 1 addition & 3 deletions app/src/test/java/com/techcourse/dao/UserDaoTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,14 @@ class UserDaoTest {
@BeforeEach
void setup() {
DatabasePopulatorUtils.execute(DataSourceConfig.getInstance());

userDao = new UserDao(DataSourceConfig.getInstance());
userDao = new UserDao();
final User user = new User("gugu", "password", "hkkang@woowahan.com");
userDao.insert(user);
}

@Test
void findAll() {
final List<User> users = userDao.findAll();

assertThat(users).isNotEmpty();
}

Expand Down
Loading