Skip to content

Commit

Permalink
[JDBC 라이브러리 구현하기 - 1단계] 로이스(원태연) 미션 제출합니다. (woowacourse#277)
Browse files Browse the repository at this point in the history
* 패키지 위치 변경 및 코드 정리

* 패키지 위치 변경 및 코드 정리

* 패키지 위치 변경 및 코드 정리

* feat: JdbcTemplate update 메서드 추가

* test: UserHistory log 테스트 추가

* refactor: 이전 버전 Insert 제거

* feat: RowMapper 추가

* feat: 단일 객체 조회(queryForObject) 추가

* feat: findByAccount 추가

* feat: findAll 추가

* feat: update 추가

* style: 불필요한 import 제거

---------

Co-authored-by: kang-hyungu <[email protected]>
  • Loading branch information
TaeyeonRoyce and kang-hyungu committed Oct 2, 2023
1 parent 06379e5 commit 279b3cd
Show file tree
Hide file tree
Showing 7 changed files with 181 additions and 140 deletions.
110 changes: 18 additions & 92 deletions app/src/main/java/com/techcourse/dao/UserDao.java
Original file line number Diff line number Diff line change
@@ -1,121 +1,47 @@
package com.techcourse.dao;

import com.techcourse.domain.User;
import org.springframework.jdbc.core.JdbcTemplate;
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;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

public class UserDao {

private static final Logger log = LoggerFactory.getLogger(UserDao.class);
private static final RowMapper<User> userRowMapper = (resultSet) -> new User(
resultSet.getLong("id"),
resultSet.getString("account"),
resultSet.getString("password"),
resultSet.getString("email")
);

private final DataSource dataSource;

public UserDao(final DataSource dataSource) {
this.dataSource = dataSource;
}
private final JdbcTemplate jdbcTemplate;

public UserDao(final JdbcTemplate jdbcTemplate) {
this.dataSource = null;
this.jdbcTemplate = jdbcTemplate;
}

public void insert(final User user) {
final var 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(final User user) {
// todo
final var 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;
final var sql = "select id, account, password, email from users";
return jdbcTemplate.query(sql, userRowMapper);
}

public User findById(final Long id) {
final var sql = "select id, account, password, email from users where 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) {}
}
return jdbcTemplate.queryForObject(sql, userRowMapper, id);
}

public User findByAccount(final String account) {
// todo
return null;
final var sql = "select id, account, password, email from users where account = ?";
return jdbcTemplate.queryForObject(sql, userRowMapper, account);
}
}
74 changes: 30 additions & 44 deletions app/src/main/java/com/techcourse/dao/UserHistoryDao.java
Original file line number Diff line number Diff line change
@@ -1,62 +1,48 @@
package com.techcourse.dao;

import com.techcourse.domain.User;
import com.techcourse.domain.UserHistory;
import org.springframework.jdbc.core.JdbcTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

public class UserHistoryDao {

private static final Logger log = LoggerFactory.getLogger(UserHistoryDao.class);
private static final RowMapper<UserHistory> userHistoryRowMapper = (resultSet) -> new UserHistory(
resultSet.getLong("id"),
resultSet.getLong("user_id"),
resultSet.getString("account"),
resultSet.getString("password"),
resultSet.getString("email"),
resultSet.getString("created_by")
);

private final DataSource dataSource;

public UserHistoryDao(final DataSource dataSource) {
this.dataSource = dataSource;
}
private final JdbcTemplate jdbcTemplate;

public UserHistoryDao(final JdbcTemplate jdbcTemplate) {
this.dataSource = null;
this.jdbcTemplate = jdbcTemplate;
}

public void log(final UserHistory userHistory) {
final var sql = "insert into user_history (user_id, account, password, email, created_at, created_by) values (?, ?, ?, ?, ?, ?)";

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

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

pstmt.setLong(1, userHistory.getUserId());
pstmt.setString(2, userHistory.getAccount());
pstmt.setString(3, userHistory.getPassword());
pstmt.setString(4, userHistory.getEmail());
pstmt.setObject(5, userHistory.getCreatedAt());
pstmt.setString(6, userHistory.getCreateBy());
pstmt.executeUpdate();
} catch (SQLException e) {
log.error(e.getMessage(), e);
throw new RuntimeException(e);
} finally {
try {
if (pstmt != null) {
pstmt.close();
}
} catch (SQLException ignored) {}
log.debug("User history id : {}", userHistory.getUserId());
final var sql = "insert into user_history "
+ "(user_id, account, password, email, created_at, created_by) "
+ "values (?, ?, ?, ?, ?, ?)";
jdbcTemplate.update(sql,
userHistory.getUserId(),
userHistory.getAccount(),
userHistory.getPassword(),
userHistory.getEmail(),
userHistory.getCreatedAt(),
userHistory.getCreateBy()
);
}

try {
if (conn != null) {
conn.close();
}
} catch (SQLException ignored) {}
}
public UserHistory findLogByUser(final User user) {
log.debug("User history id : {}", user.getId());
final var sql = "select * from user_history where user_id = ?";
return jdbcTemplate.queryForObject(sql, userHistoryRowMapper, user.getId());
}
}
2 changes: 0 additions & 2 deletions app/src/main/java/com/techcourse/domain/UserHistory.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,7 @@ public class UserHistory {
private final String account;
private final String password;
private final String email;

private final LocalDateTime createdAt;

private final String createBy;

public UserHistory(final User user, final String createBy) {
Expand Down
18 changes: 16 additions & 2 deletions app/src/test/java/com/techcourse/dao/UserDaoTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.techcourse.support.jdbc.init.DatabasePopulatorUtils;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.jdbc.core.JdbcTemplate;

import static org.assertj.core.api.Assertions.assertThat;

Expand All @@ -15,17 +16,20 @@ class UserDaoTest {
@BeforeEach
void setup() {
DatabasePopulatorUtils.execute(DataSourceConfig.getInstance());

userDao = new UserDao(DataSourceConfig.getInstance());
final JdbcTemplate jdbcTemplate = new JdbcTemplate(DataSourceConfig.getInstance());
userDao = new UserDao(jdbcTemplate);
final var user = new User("gugu", "password", "[email protected]");
userDao.insert(user);
}

@Test
void findAll() {
userDao.insert(new User("gugu2", "password2", "[email protected]"));
userDao.insert(new User("gugu3", "password3", "[email protected]"));
final var users = userDao.findAll();

assertThat(users).isNotEmpty();
assertThat(users).hasSize(3);
}

@Test
Expand All @@ -35,6 +39,13 @@ void findById() {
assertThat(user.getAccount()).isEqualTo("gugu");
}

@Test
void findByIdShouldBeNull() {
final var nullableUser = userDao.findById(3L);

assertThat(nullableUser).isNull();
}

@Test
void findByAccount() {
final var account = "gugu";
Expand All @@ -45,12 +56,15 @@ void findByAccount() {

@Test
void insert() {
// given
final var account = "insert-gugu";
final var user = new User(account, "password", "[email protected]");
userDao.insert(user);

// when
final var actual = userDao.findById(2L);

// then
assertThat(actual.getAccount()).isEqualTo(account);
}

Expand Down
38 changes: 38 additions & 0 deletions app/src/test/java/com/techcourse/dao/UserHistoryDaoTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.techcourse.dao;

import static org.assertj.core.api.Assertions.assertThat;

import com.techcourse.config.DataSourceConfig;
import com.techcourse.domain.User;
import com.techcourse.domain.UserHistory;
import com.techcourse.support.jdbc.init.DatabasePopulatorUtils;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.jdbc.core.JdbcTemplate;

class UserHistoryDaoTest {

private UserHistoryDao userHistoryDao;

@BeforeEach
void setup() {
DatabasePopulatorUtils.execute(DataSourceConfig.getInstance());
final JdbcTemplate jdbcTemplate = new JdbcTemplate(DataSourceConfig.getInstance());
userHistoryDao = new UserHistoryDao(jdbcTemplate);
}

@Test
void log() {
// given
final String userHistoryCreatedBy = "royce";
final var user = new User(1L, "gugu", "password", "[email protected]");
final var userHistory = new UserHistory(user, userHistoryCreatedBy);

// when
userHistoryDao.log(userHistory);

// then
final UserHistory actual = userHistoryDao.findLogByUser(user);
assertThat(actual.getCreateBy()).isEqualTo(userHistoryCreatedBy);
}
}
Loading

0 comments on commit 279b3cd

Please sign in to comment.