jdbc : DataSource - Connection Pool
This commit is contained in:
@@ -0,0 +1,126 @@
|
||||
package com.example.jdbc.repository;
|
||||
|
||||
import com.example.jdbc.connection.DBConnectionUtil;
|
||||
import com.example.jdbc.domain.Member;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.jdbc.support.JdbcUtils;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import java.sql.*;
|
||||
import java.util.NoSuchElementException;
|
||||
|
||||
/**
|
||||
* JDBC - DataSource, JdbcUtils 사용
|
||||
*/
|
||||
@Slf4j
|
||||
public class MemberRepositoryV1 {
|
||||
|
||||
private final DataSource dataSource;
|
||||
|
||||
public MemberRepositoryV1(DataSource dataSource) {
|
||||
this.dataSource = dataSource;
|
||||
}
|
||||
|
||||
public Member save(Member member) throws SQLException {
|
||||
String sql = "insert into member(member_id, money) values(?, ?)";
|
||||
|
||||
Connection con = null;
|
||||
PreparedStatement pstmt = null;
|
||||
|
||||
try {
|
||||
con = getConnection();
|
||||
pstmt = con.prepareStatement(sql);
|
||||
pstmt.setString(1, member.getMemberId());
|
||||
pstmt.setInt(2, member.getMoney());
|
||||
pstmt.executeUpdate();
|
||||
return member;
|
||||
} catch (SQLException e) {
|
||||
log.error("db error", e);
|
||||
throw e;
|
||||
} finally {
|
||||
close(con, pstmt, null);
|
||||
}
|
||||
}
|
||||
|
||||
public Member findById(String memberId) throws SQLException {
|
||||
String sql = "select * from member where member_id = ?";
|
||||
|
||||
Connection con = null;
|
||||
PreparedStatement pstmt = null;
|
||||
ResultSet rs = null;
|
||||
|
||||
try {
|
||||
con = getConnection();
|
||||
pstmt = con.prepareStatement(sql);
|
||||
pstmt.setString(1, memberId);
|
||||
|
||||
rs = pstmt.executeQuery();
|
||||
if (rs.next()) {
|
||||
Member member = new Member();
|
||||
member.setMemberId(rs.getString("member_id"));
|
||||
member.setMoney(rs.getInt("money"));
|
||||
return member;
|
||||
} else {
|
||||
throw new NoSuchElementException("member not found memberId=" + memberId);
|
||||
}
|
||||
} catch (SQLException e) {
|
||||
log.error("db error", e);
|
||||
throw e;
|
||||
} finally {
|
||||
close(con, pstmt, rs);
|
||||
}
|
||||
}
|
||||
|
||||
public void update(String memberId, int money) throws SQLException {
|
||||
String sql = "update member set money=? where member_id=?";
|
||||
|
||||
Connection con = null;
|
||||
PreparedStatement pstmt = null;
|
||||
|
||||
try {
|
||||
con = getConnection();
|
||||
pstmt = con.prepareStatement(sql);
|
||||
pstmt.setInt(1, money);
|
||||
pstmt.setString(2, memberId);
|
||||
|
||||
int result = pstmt.executeUpdate();
|
||||
log.info("resultSize={}", result);
|
||||
} catch (SQLException e) {
|
||||
log.error("db error", e);
|
||||
throw e;
|
||||
} finally {
|
||||
close(con, pstmt, null);
|
||||
}
|
||||
}
|
||||
|
||||
public void delete(String memberId) throws SQLException {
|
||||
String sql = "delete from member where member_id=?";
|
||||
|
||||
Connection con = null;
|
||||
PreparedStatement pstmt = null;
|
||||
|
||||
try {
|
||||
con = getConnection();
|
||||
pstmt = con.prepareStatement(sql);
|
||||
pstmt.setString(1, memberId);
|
||||
pstmt.executeUpdate();
|
||||
} catch (SQLException e) {
|
||||
log.error("db error", e);
|
||||
throw e;
|
||||
} finally {
|
||||
close(con, pstmt, null);
|
||||
}
|
||||
}
|
||||
|
||||
private void close(Connection con, Statement stmt, ResultSet rs) {
|
||||
JdbcUtils.closeResultSet(rs);
|
||||
JdbcUtils.closeStatement(stmt);
|
||||
JdbcUtils.closeConnection(con);
|
||||
}
|
||||
|
||||
private Connection getConnection() throws SQLException {
|
||||
Connection con = dataSource.getConnection();
|
||||
log.info("get connection={}, class={}", con, con.getClass());
|
||||
return con;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
package com.example.jdbc.repository;
|
||||
|
||||
import com.example.jdbc.domain.Member;
|
||||
import com.zaxxer.hikari.HikariDataSource;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.jdbc.datasource.DriverManagerDataSource;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.NoSuchElementException;
|
||||
|
||||
import static com.example.jdbc.connection.ConnectionConst.*;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||
|
||||
@Slf4j
|
||||
class MemberRepositoryV1Test {
|
||||
|
||||
MemberRepositoryV1 repository;
|
||||
|
||||
@BeforeEach
|
||||
void beforeEach() {
|
||||
// 기본 DriverManager - 항상 새로운 커넥션을 획득
|
||||
// DriverManagerDataSource dataSource = new DriverManagerDataSource(URL, USERNAME, PASSWORD);
|
||||
|
||||
// Connection Pool
|
||||
HikariDataSource dataSource = new HikariDataSource();
|
||||
dataSource.setJdbcUrl(URL);
|
||||
dataSource.setUsername(USERNAME);
|
||||
dataSource.setPassword(PASSWORD);
|
||||
repository = new MemberRepositoryV1(dataSource);
|
||||
}
|
||||
|
||||
@Test
|
||||
void crud() throws SQLException, InterruptedException {
|
||||
// save
|
||||
Member member = new Member("memberV13", 10000);
|
||||
repository.save(member);
|
||||
|
||||
// findById
|
||||
Member findMember = repository.findById(member.getMemberId());
|
||||
log.info("findMember={}", findMember);
|
||||
|
||||
assertThat(findMember).isEqualTo(member);
|
||||
|
||||
// update - money : 10000 -> 20000
|
||||
repository.update(member.getMemberId(), 20000);
|
||||
Member updatedMember = repository.findById(member.getMemberId());
|
||||
assertThat(updatedMember.getMoney()).isEqualTo(20000);
|
||||
|
||||
// delete
|
||||
repository.delete(member.getMemberId());
|
||||
assertThatThrownBy(()-> repository.findById(member.getMemberId()))
|
||||
.isInstanceOf(NoSuchElementException.class);
|
||||
|
||||
Thread.sleep(1000);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user