Skip to content

Commit

Permalink
add Data Preparagation teestfile
Browse files Browse the repository at this point in the history
  • Loading branch information
namhyeop committed Jun 21, 2022
1 parent cb2119f commit d50cfe3
Show file tree
Hide file tree
Showing 108 changed files with 2,315 additions and 318 deletions.
Binary file modified .DS_Store
Binary file not shown.
Binary file added 6.spring-DB Connection Acess/.DS_Store
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -1,2 +1,10 @@
package hello.jdbc.repository;public interface MemberRepositoryh {
package hello.jdbc.repository;

import hello.jdbc.domain.Member;

public interface MemberRepository {
Member save(Member Member);
Member findById(String memberId);
void update(String memberId, int money);
void delete(String memberId);
}
Original file line number Diff line number Diff line change
@@ -1,2 +1,13 @@
package hello.jdbc.repository;public class MemberRepositoryEx {
package hello.jdbc.repository;


import hello.jdbc.domain.Member;

import java.sql.SQLException;

public interface MemberRepositoryEx {
Member save(Member Member) throws SQLException;
Member findById(String memberId) throws SQLException;
void update(String memberId, int money) throws SQLException;
void delete(String memberId) throws SQLException;
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package hello.jdbc.repository;

import hello.jdbc.connection.DBConnectionUtil;
import hello.jdbc.domain.Member;
import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.support.JdbcUtils;
Expand All @@ -10,14 +9,14 @@
import java.util.NoSuchElementException;

/**
* V0에서 사용해서 DriverManger대신 DataSource를 사용해본다.
* 또한, 기존의 close에서의 부문별한 중복코들르 JdbcUtils를 사용해서 개선한다.
* Transaction의 같은 커넥션을 유지하기 위한 Repository 구현
* Connection을 매개변수로 넘겨주는 방식이다.
*/
@Slf4j
public class MemberRepositoryV1 {
public class MemberRepositoryV2 {
private final DataSource dataSource;

public MemberRepositoryV1(DataSource dataSource) {
public MemberRepositoryV2(DataSource dataSource) {
this.dataSource = dataSource;
}

Expand Down Expand Up @@ -88,6 +87,40 @@ public Member findById(String memberId) throws SQLException{
}
}

public Member findById(Connection con, String memberId) throws SQLException{
String sql = "select * from member where member_id = ?";

PreparedStatement pstmt = null;
ResultSet rs = null;

try{
pstmt = con.prepareStatement(sql);
pstmt.setString(1,memberId);
/**
* 데이터를 조회할때는 executeQuery, 업데이트할 때는 executeUpdate
*/
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 {
/**
* Connection은 Service 계층에서 닫아줘야한다.
*/
JdbcUtils.closeResultSet(rs);
JdbcUtils.closeStatement(pstmt);
}
}

public void update(String memberId, int money) throws SQLException {
String sql = "update member set money=? where member_id=?";

Expand All @@ -105,7 +138,29 @@ public void update(String memberId, int money) throws SQLException {
log.error("db error", e);
throw e;
}finally {
close(con, pstmt, null);
close(con, pstmt, null);
}
}

public void update(Connection con, String memberId, int money) throws SQLException {
String sql = "update member set money=? where member_id=?";

PreparedStatement pstmt = null;

try{
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, money);
pstmt.setString(2, memberId);
int retSize = pstmt.executeUpdate();
log.info("resultSize={}", retSize);
} catch (SQLException e) {
log.error("db error", e);
throw e;
}finally {
/**
* Connection은 Service 계층에서 닫아줘야한다.
*/
JdbcUtils.closeStatement(pstmt);
}
}

Expand All @@ -129,9 +184,9 @@ public void delete(String memberId) throws SQLException {
}
}

private void close(Connection con, Statement stmt, ResultSet rs){
private void close(Connection con, Statement pstmt, ResultSet rs){
JdbcUtils.closeResultSet(rs);
JdbcUtils.closeStatement(stmt);
JdbcUtils.closeStatement(pstmt);
JdbcUtils.closeConnection(con);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,21 +2,23 @@

import hello.jdbc.domain.Member;
import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.jdbc.support.JdbcUtils;

import javax.sql.DataSource;
import java.sql.*;
import java.util.NoSuchElementException;

/**
* Transaction의 같은 커넥션을 유지하기 위한 Repository 구현
* Connection을 매개변수로 넘겨주는 방식이다.
* 트랜잭션 매니저
* DataSourceUtils.getConnection()
* DataSourceUtils.releaseConnection();
*/
@Slf4j
public class MemberRepositoryV2 {
public class MemberRepositoryV3 {
private final DataSource dataSource;

public MemberRepositoryV2(DataSource dataSource) {
public MemberRepositoryV3(DataSource dataSource) {
this.dataSource = dataSource;
}

Expand Down Expand Up @@ -87,40 +89,6 @@ public Member findById(String memberId) throws SQLException{
}
}

public Member findById(Connection con, String memberId) throws SQLException{
String sql = "select * from member where member_id = ?";

PreparedStatement pstmt = null;
ResultSet rs = null;

try{
pstmt = con.prepareStatement(sql);
pstmt.setString(1,memberId);
/**
* 데이터를 조회할때는 executeQuery, 업데이트할 때는 executeUpdate
*/
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 {
/**
* Connection은 Service 계층에서 닫아줘야한다.
*/
JdbcUtils.closeResultSet(rs);
JdbcUtils.closeStatement(pstmt);
}
}

public void update(String memberId, int money) throws SQLException {
String sql = "update member set money=? where member_id=?";

Expand All @@ -142,28 +110,6 @@ public void update(String memberId, int money) throws SQLException {
}
}

public void update(Connection con, String memberId, int money) throws SQLException {
String sql = "update member set money=? where member_id=?";

PreparedStatement pstmt = null;

try{
pstmt = con.prepareStatement(sql);
pstmt.setInt(1, money);
pstmt.setString(2, memberId);
int retSize = pstmt.executeUpdate();
log.info("resultSize={}", retSize);
} catch (SQLException e) {
log.error("db error", e);
throw e;
}finally {
/**
* Connection은 Service 계층에서 닫아줘야한다.
*/
JdbcUtils.closeStatement(pstmt);
}
}

public void delete(String memberId) throws SQLException {
String sql = "delete from member where member_id=?";

Expand All @@ -187,11 +133,16 @@ public void delete(String memberId) throws SQLException {
private void close(Connection con, Statement pstmt, ResultSet rs){
JdbcUtils.closeResultSet(rs);
JdbcUtils.closeStatement(pstmt);
JdbcUtils.closeConnection(con);
/**
* Transaction 동기화 사용을 위해서는 DataSourceUtils를 사용해야한다.
* 트랜잭션을 사용하기 위해 동기화된 커넥션은 커넥션을 닫지 않고 그대로 유지해준다.
* 트랜잭션 동기화 매니저가 관리하는 커넥션이 없는 경우 해당 커넥션을 닫는다.
*/
DataSourceUtils.releaseConnection(con, dataSource);
}

private Connection getConnection() throws SQLException {
Connection con = dataSource.getConnection();
Connection con = DataSourceUtils.getConnection(dataSource);
log.info("get connection={}, class={}", con, con.getClass());
return con;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package hello.jdbc.repository;

import hello.jdbc.domain.Member;
import hello.jdbc.repository.ex.MyDbException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.jdbc.support.JdbcUtils;
Expand All @@ -10,19 +11,21 @@
import java.util.NoSuchElementException;

/**
* 트랜잭션 매니저
* DataSourceUtils.getConnection()
* DataSourceUtils.releaseConnection();
* V3에서 발생했떤 예외 누수 문제를 해결
* V3의 문제였던 체크 예외를 런타임 예외로 변경
* MemberRepository 인터페이스 사용
* 이를 통해 SQLEXception 제거가 가능해짐
*/
@Slf4j
public class MemberRepositoryV3 {
public class MemberRepositoryV4_1 implements MemberRepository{
private final DataSource dataSource;

public MemberRepositoryV3(DataSource dataSource) {
public MemberRepositoryV4_1(DataSource dataSource) {
this.dataSource = dataSource;
}

public Member save(Member member) throws SQLException {
@Override
public Member save(Member member) {
String sql = "insert into member(member_id, money) values(?, ?)";

Connection con = null;
Expand All @@ -47,7 +50,7 @@ public Member save(Member member) throws SQLException {
return member;
} catch (SQLException e) {
log.error("db error", e);
throw e;
throw new MyDbException(e);
}finally {
/**
* connection, preparestatement, resultSet 순으로 열어줬기 때문에 닫을때는 반대로
Expand All @@ -57,7 +60,8 @@ public Member save(Member member) throws SQLException {
}
}

public Member findById(String memberId) throws SQLException{
@Override
public Member findById(String memberId) {
String sql = "select * from member where member_id = ?";

Connection con = null;
Expand All @@ -83,13 +87,14 @@ public Member findById(String memberId) throws SQLException{
}
}catch (SQLException e){
log.error("db error", e);
throw e;
throw new MyDbException(e);
}finally {
close(con, pstmt, rs);
}
}

public void update(String memberId, int money) throws SQLException {
@Override
public void update(String memberId, int money) {
String sql = "update member set money=? where member_id=?";

Connection con = null;
Expand All @@ -104,13 +109,14 @@ public void update(String memberId, int money) throws SQLException {
log.info("resultSize={}", retSize);
} catch (SQLException e) {
log.error("db error", e);
throw e;
throw new MyDbException(e);
}finally {
close(con, pstmt, null);
}
}

public void delete(String memberId) throws SQLException {
@Override
public void delete(String memberId) {
String sql = "delete from member where member_id=?";

Connection con = null;
Expand All @@ -124,7 +130,7 @@ public void delete(String memberId) throws SQLException {
log.info("resultSize={}", retSize);
} catch (SQLException e) {
log.error("db error", e);
throw e;
throw new MyDbException(e);
}finally {
close(con, pstmt, null);
}
Expand Down
Loading

0 comments on commit d50cfe3

Please sign in to comment.