이번에는 애플리케이션에 DataSource 를 적용해봅시다.

참고로 기존 코드를 유지하기 위해 기존 코드를 복사해서 새로 만들겠습니다.

DriverManagerDataSource 사용

MemberRepositoryV1

/**
 * JDBC - DataSource 사용, JDBCUtils 사용
 */
@Slf4j
public class MemberRepositoryV1 {

		//...1
    private final DataSource dataSource;

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

		//save()...
    //findById()...
    //update()....
    //delete()....

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

		//...1
    private Connection getConnection() throws SQLException {
        Connection con = dataSource.getConnection();
        log.info("get connection={}, class={}", con, con.getClass());
        return con;
    }

}

기존 코드 MemberRepositoryV0 참고

  1. DataSource 의존관계 주입
  2. JdbcUtils 편의 메서드

MemberRepositoryV1Test

@Slf4j
class MemberRepositoryV1Test {

    MemberRepositoryV1 repository;

    @BeforeEach
    void beforeEach() throws Exception {
        //기본 DriverManager - 항상 새로운 커넥션 획득
        DriverManagerDataSource dataSource = new DriverManagerDataSource(URL, USERNAME, PASSWORD);
        repository = new MemberRepositoryV1(dataSource);
    }

    @Test
    void crud() throws SQLException {
        //save
        Member member = new Member("memberV0", 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);
    }

}

기존 MemberRepositoryV0Test 코드 참고

  1. MemberRepositoryV1 은 DataSource 의존관계 주입이 필요합니다.

    기본 DriverManager을 사용해서 항상 새로운 커넥션 획득하도록 설정했습니다.