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 라이브러리 구현하기 - 4단계] 에버(손채영) 미션 제출합니다. #923

Open
wants to merge 14 commits into
base: helenason
Choose a base branch
from
Open
21 changes: 10 additions & 11 deletions app/src/main/java/com/techcourse/dao/UserDao.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import com.interface21.jdbc.core.JdbcTemplate;
import com.interface21.jdbc.core.RowMapper;
import com.techcourse.domain.User;
import java.sql.Connection;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand All @@ -24,28 +23,28 @@ public UserDao(final JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}

public void insert(final Connection conn, final User user) {
public void insert(final User user) {
final var sql = "insert into users (account, password, email) values (?, ?, ?)";
jdbcTemplate.update(conn, sql, user.getAccount(), user.getPassword(), user.getEmail());
jdbcTemplate.update(sql, user.getAccount(), user.getPassword(), user.getEmail());
}

public void update(final Connection conn, final User user) {
public void update(final User user) {
final var sql = "update users set account = ?, password = ?, email = ? where id = ?";
jdbcTemplate.update(conn, sql, user.getAccount(), user.getPassword(), user.getEmail(), user.getId());
jdbcTemplate.update(sql, user.getAccount(), user.getPassword(), user.getEmail(), user.getId());
}

public List<User> findAll(final Connection conn) {
public List<User> findAll() {
final var sql = "select id, account, password, email from users";
return jdbcTemplate.query(conn, sql, USER_ROW_MAPPER);
return jdbcTemplate.query(sql, USER_ROW_MAPPER);
}

public User findById(final Connection conn, final Long id) {
public User findById(final Long id) {
final var sql = "select id, account, password, email from users where id = ?";
return jdbcTemplate.queryForObject(conn, sql, USER_ROW_MAPPER, id);
return jdbcTemplate.queryForObject(sql, USER_ROW_MAPPER, id);
}

public User findByAccount(final Connection conn, final String account) {
public User findByAccount(final String account) {
final var sql = "select id, account, password, email from users where account = ?";
return jdbcTemplate.queryForObject(conn, sql, USER_ROW_MAPPER, account);
return jdbcTemplate.queryForObject(sql, USER_ROW_MAPPER, account);
}
}
5 changes: 2 additions & 3 deletions app/src/main/java/com/techcourse/dao/UserHistoryDao.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import com.interface21.jdbc.core.JdbcTemplate;
import com.techcourse.domain.UserHistory;
import java.sql.Connection;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand All @@ -16,9 +15,9 @@ public UserHistoryDao(final JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}

public void log(final Connection conn, final UserHistory userHistory) {
public void log(final UserHistory userHistory) {
final var sql = "insert into user_history (user_id, account, password, email, created_at, created_by) values (?, ?, ?, ?, ?, ?)";
jdbcTemplate.update(conn, sql, userHistory.getUserId(), userHistory.getAccount(), userHistory.getPassword(),
jdbcTemplate.update(sql, userHistory.getUserId(), userHistory.getAccount(), userHistory.getPassword(),
userHistory.getEmail(), userHistory.getCreatedAt(), userHistory.getCreateBy());
}
}
32 changes: 32 additions & 0 deletions app/src/main/java/com/techcourse/service/AppUserService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.techcourse.service;

import com.techcourse.dao.UserDao;
import com.techcourse.dao.UserHistoryDao;
import com.techcourse.domain.User;
import com.techcourse.domain.UserHistory;

public class AppUserService implements UserService {

private final UserDao userDao;
private final UserHistoryDao userHistoryDao;

public AppUserService(final UserDao userDao, final UserHistoryDao userHistoryDao) {
this.userDao = userDao;
this.userHistoryDao = userHistoryDao;
}

public User findById(final long id) {
return userDao.findById(id);
}

public void insert(final User user) {
userDao.insert(user);
}

public void changePassword(final long id, final String newPassword, final String createBy) {
User user = userDao.findById(id);
user.changePassword(newPassword);
userDao.update(user);
userHistoryDao.log(new UserHistory(user, createBy));
}
}
34 changes: 34 additions & 0 deletions app/src/main/java/com/techcourse/service/TxUserService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.techcourse.service;

import com.interface21.jdbc.core.TransactionManager;
import com.techcourse.config.DataSourceConfig;
import com.techcourse.domain.User;

public class TxUserService implements UserService {

private final UserService userService;
private final TransactionManager transactionManager;

public TxUserService(final UserService userService) {
this.userService = userService;
this.transactionManager = new TransactionManager(DataSourceConfig.getInstance());
}

public User findById(final long id) {
return transactionManager.manage(conn -> {
return userService.findById(id);
});
}

public void insert(final User user) {
transactionManager.manage(conn -> {
userService.insert(user);
});
}

public void changePassword(final long id, final String newPassword, final String createBy) {
transactionManager.manage(conn -> {
userService.changePassword(id, newPassword, createBy);
});
}
}
38 changes: 4 additions & 34 deletions app/src/main/java/com/techcourse/service/UserService.java
Original file line number Diff line number Diff line change
@@ -1,42 +1,12 @@
package com.techcourse.service;

import com.interface21.jdbc.core.TransactionManager;
import com.techcourse.config.DataSourceConfig;
import com.techcourse.dao.UserDao;
import com.techcourse.dao.UserHistoryDao;
import com.techcourse.domain.User;
import com.techcourse.domain.UserHistory;

public class UserService {
public interface UserService {

private final UserDao userDao;
private final UserHistoryDao userHistoryDao;
private final TransactionManager transactionManager;
User findById(final long id);

public UserService(final UserDao userDao, final UserHistoryDao userHistoryDao) {
this.userDao = userDao;
this.userHistoryDao = userHistoryDao;
this.transactionManager = new TransactionManager(DataSourceConfig.getInstance());
}
void insert(final User user);

public User findById(final long id) {
return transactionManager.manage(conn -> {
return userDao.findById(conn, id);
});
}

public void insert(final User user) {
transactionManager.manage(conn -> {
userDao.insert(conn, user);
});
}

public void changePassword(final long id, final String newPassword, final String createBy) {
transactionManager.manage(conn -> {
final var user = findById(id);
user.changePassword(newPassword);
userDao.update(conn, user);
userHistoryDao.log(conn, new UserHistory(user, createBy));
});
}
void changePassword(final long id, final String newPassword, final String createBy);
}
35 changes: 17 additions & 18 deletions app/src/test/java/com/techcourse/dao/UserDaoTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,49 +3,48 @@
import static org.assertj.core.api.Assertions.assertThat;

import com.interface21.jdbc.core.JdbcTemplate;
import com.interface21.jdbc.datasource.DataSourceUtils;
import com.techcourse.config.DataSourceConfig;
import com.techcourse.domain.User;
import com.techcourse.support.jdbc.init.DatabasePopulatorUtils;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

class UserDaoTest {

private UserDao userDao;
private Connection conn;

@BeforeEach
void setup() throws SQLException {
DatabasePopulatorUtils.execute(DataSourceConfig.getInstance());
conn = DataSourceConfig.getInstance().getConnection();
void setup() {
DataSource dataSource = DataSourceConfig.getInstance();
DatabasePopulatorUtils.execute(dataSource);
DataSourceUtils.getConnection(dataSource);

userDao = new UserDao(new JdbcTemplate());
final var user = new User("ever", "password", "[email protected]");
userDao.insert(conn, user);
this.userDao = new UserDao(new JdbcTemplate(dataSource));
this.userDao.insert(new User("ever", "password", "[email protected]"));
}

@Test
void findAll() {
userDao.insert(conn, new User("ever2", "password", "[email protected]"));
final var users = userDao.findAll(conn);
userDao.insert(new User("ever2", "password", "[email protected]"));
final var users = userDao.findAll();

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

@Test
void findById() {
final var user = userDao.findById(conn, 1L);
final var user = userDao.findById(1L);

assertThat(user.getAccount()).isEqualTo("ever");
}

@Test
void findByAccount() {
final var account = "ever";
final var user = userDao.findByAccount(conn, account);
final var user = userDao.findByAccount(account);

assertThat(user.getAccount()).isEqualTo(account);
}
Expand All @@ -54,22 +53,22 @@ void findByAccount() {
void insert() {
final var account = "insert-ever";
final var user = new User(account, "password", "[email protected]");
userDao.insert(conn, user);
userDao.insert(user);

final var actual = userDao.findById(conn, 2L);
final var actual = userDao.findById(2L);

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

@Test
void update() {
final var newPassword = "password99";
final var user = userDao.findById(conn, 1L);
final var user = userDao.findById(1L);
user.changePassword(newPassword);

userDao.update(conn, user);
userDao.update(user);

final var actual = userDao.findById(conn, 1L);
final var actual = userDao.findById(1L);

assertThat(actual.getPassword()).isEqualTo(newPassword);
}
Expand Down
82 changes: 82 additions & 0 deletions app/src/test/java/com/techcourse/service/AppUserServiceTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package com.techcourse.service;

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

import com.interface21.jdbc.core.JdbcTemplate;
import com.techcourse.config.DataSourceConfig;
import com.techcourse.dao.UserDao;
import com.techcourse.dao.UserHistoryDao;
import com.techcourse.domain.User;
import com.techcourse.support.jdbc.init.DatabasePopulatorUtils;
import javax.sql.DataSource;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

class AppUserServiceTest {

private AppUserService appUserService;

@BeforeEach
void setUp() {
DataSource dataSource = DataSourceConfig.getInstance();
DatabasePopulatorUtils.execute(dataSource);

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
UserDao userDao = new UserDao(jdbcTemplate);
UserHistoryDao userHistoryDao = new UserHistoryDao(jdbcTemplate);
this.appUserService = new AppUserService(userDao, userHistoryDao);
}

@DisplayName("id로 User를 조회할 수 있다.")
@Test
void findById() {
// given
appUserService.insert(new User("ever", "password", "[email protected]"));

// when
User user = appUserService.findById(1L);

// then
assertThat(user.getAccount()).isEqualTo("ever");
}

@DisplayName("User를 추가할 수 있다.")
@Test
void insert() {
// given
User newUser = new User("ever2", "password", "[email protected]");

// when
appUserService.insert(newUser);

// then
assertThat(appUserService.findById(1L).getAccount()).isEqualTo("ever2");
}

@DisplayName("User의 비밀번호를 변경할 수 있다.")
@Test
void changePassword() {
// given
appUserService.insert(new User("ever", "password", "[email protected]"));

// when
appUserService.changePassword(1L, "newPassword", "ever");

// then
assertThat(appUserService.findById(1L).getPassword()).isEqualTo("newPassword");
}

@DisplayName("User의 비밀번호를 변경하면 로그가 기록된다.")
@Test
void should_log_when_changePassword() {
// given
appUserService.insert(new User("ever", "password", "[email protected]"));

// when
appUserService.changePassword(1L, "newPassword", "ever");

// then
assertThat(appUserService.findById(1L).getPassword()).isEqualTo("newPassword");
}
}
Loading