์ปค๋ฅ์ ํ by using DataSource Interface
by rlaehddnd0422์ปค๋ฅ์ ํ์ด๋ ์ด๋ฆ ๊ทธ๋๋ก ์ปค๋ฅ์ ์ ๊ด๋ฆฌํ๋ ํ์ ๋๋ค.
์ปค๋ฅ์ ํ (Connection Pool) ์ ์ฌ์ฉํ๋ฉด ์ปค๋ฅ์ ํ๋ก๋ถํฐ ์ปค๋ฅ์ ์ ๋ฆฌํด๋ฐ์ ์ฌ์ฉํจ์ผ๋ก์จ DB ๋๋ผ์ด๋ฒ์ DB๊ฐ์ TCP/IP ์ฐ๊ฒฐ์ ์ํ 3 hand shake ๊ณผ์ ์ ๊ฑฐ์น์ง ์์๋ ๋๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ์ ์ผ๋ก ์๋ต ์๋ ํฅ์์ ๊ธฐ๋ํ ์ ์์ต๋๋ค.
- ์ปค๋ฅ์ ํ์ ์๋ ๊ฐ ์ปค๋ฅ์ ๋ค์ DB์ ์ฐ๊ฒฐ๋์ด ์๋ ์ํ์ด๊ธฐ ๋๋ฌธ์(๊ทธ๋ฆผ์๋ ๋ณ๋๋ก ํ์ํ์ง ์์์ง๋ง) ์ฆ๊ฐ์ ์ผ๋ก DB์ SQL์ ์ ๋ฌํ ์ ์์ต๋๋ค.
- ์ปค๋ฅ์ ํ์ ์ด์ฉํ๋ฉด, DB ๋๋ผ์ด๋ฒ๋ฅผ ํตํด ์๋ก์ด ์ปค๋ฅ์ ์ ํ๋ํ์ง ์๊ณ ์ปค๋ฅ์ ํ์ ํตํด ์ด๋ฏธ ์์ฑ๋์ด์๋ ์ปค๋ฅ์ ์ ๊บผ๋ด์ ์ฌ์ฉํ๊ณ , ์ฌ์ฉ์ด ๋๋๋ฉด ์ปค๋ฅ์ ์ด ์ด์์๋ ์ํ๋ก ์ปค๋ฅ์ ํ์ ๋ฐํํ๋ฉด ๋ฉ๋๋ค.
์ปค๋ฅ์ ํ์ ์ฌ์ฉํ๋ฉด ์ป๋ ์ด์ ์ด ๋๋ฌด๋๋ ๋ง๊ธฐ ๋๋ฌธ์ ์ค๋ฌด์์๋ ์ปค๋ฅ์ ํ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
์ปค๋ฅ์ ํ์ ๊ฐ๋ ์ ์ผ๋ก ๋จ์ํด์ ์ง์ ๊ตฌํ๋ ๊ฐ๋ฅํ์ง๋ง ์คํ์์ค ์ปค๋ฅ์ ํ์ด ๋ง๊ธฐ ๋๋ฌธ์ hikariCP๋ commons-dbcp2, tomcat-jdbc pool๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์คํ๋ง ๋ถํธ์์๋ ๊ธฐ๋ณธ ์ปค๋ฅ์ ํ๋ก hikariCP๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๊ณ ๋ฏผํ ๊ฒ ์์ด hikariCP๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
์ปค๋ฅ์ ํ์ ์ฌ์ฉํด ์ปค๋ฅ์ ์ ํ๋ํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
JDBC์์ ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ง๋ ์ปค๋ฅ์ ์ ์ป๊ธฐ ์ํด Connection ์ธํฐํ์ด์ค๋ฅผ ์ด์ฉํด DriverManager๋ฅผ ํตํด ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ปค๋ฅ์ ์ ํ๋ํ ๊ฒ์ฒ๋ผ, ์ปค๋ฅ์ ํ์์ ์ปค๋ฅ์ ์ ์ป์ ๋ ๋ํ "DataSource"๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
DriverManager์์ ์ฐจ์ด์
DriverManager๋ ์ปค๋ฅ์ ์ ์ป์ ๋ ๋ง๋ค USERNAME, PASSWORD, URL์ ๋๊ฒจ์ฃผ์ด์ผ ํ์ต๋๋ค.
DataSource๋ฅผ ์ฌ์ฉํ๋ฉด
- ์ฒ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋๋ง ํ์ํ ํ๋ผ๋ฏธํฐ๋ฅผ ๋๊ฒจ๋๊ณ ,
- ์ค์ : DataSource๋ฅผ ๋ง๋ค๊ณ ํ์ํ ์์ฑ๋ค์ ์ฌ์ฉํด URL, USERNAME, PASSWORD ๊ฐ์ ๋ถ๋ถ์ ์ ๋ ฅ๋ฐ๊ธฐ.
- ์ปค๋ฅ์
์ ํ๋ํ ๋๋ ๋จ์ํ dataSource.getConnection()๋ง ํธ์ถํ๋ฉด ๋ฉ๋๋ค.
- ์ฌ์ฉ(์ปค๋ฅ์ ํ๋) : ์ค์ ํด๋ DataSource๋ฅผ ๊ธฐ๋ฐ์ผ๋ก getConnection()๋ง ํธ์ถํด์ ์ปค๋ฅ์ ํ๋ก๋ถํฐ ์ปค๋ฅ์ ๋ฐ์์ค๊ธฐ.
์ค์ ๊ณผ ์ฌ์ฉ์ ๋ถ๋ฆฌํจ์ผ๋ก์จ, ๋ฆฌํฌ์งํ ๋ฆฌ๋ DataSource์๋ง ์์กดํ๊ณ , DataSource์ ์ค์ ํด๋ ์์ฑ๋ค์ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋๋ ์ฅ์ ์ ๊ฐ์ง๊ฒ ๋์์ต๋๋ค.
์ด์ ์์ค์ฝ๋๋ฅผ ํตํด DataSource์ ์ด์ฉํด ์ปค๋ฅ์ ์ ์ค์ ํ๊ณ ํ๋ํด๋ณด๊ฒ ์ต๋๋ค.
MemberRepositoryV1
@Slf4j
public class MemberRepositoryV1 {
private final DataSource dataSource;
public MemberRepositoryV1(DataSource dataSource) {
this.dataSource = dataSource;
}
private Connection getConnection() throws SQLException {
Connection connection = dataSource.getConnection();
log.info("get connection = {}, class = {}",connection,connection.getClass());
return connection;
}
dataSource์ ์ค์ ์ ์ธ๋ถ์์ ์ค์ ํ DI ์ฃผ์ .
- ์ธ๋ถ์์ DataSource๋ฅผ ์ฃผ์ ๋ฐ์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ด ์ ์ ์ง์ ๋ง๋ DBConnectionUtils์ ์ฌ์ฉํ์ง ์์ต๋๋ค.
โฃ ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด dataSource์ getConnection()์ ์ฌ์ฉํด ์ปค๋ฅ์ ์ ๋ฐ์์ต๋๋ค. dataSource๋ ํ ์คํธ์ฝ๋์์ HikariCP๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ปค๋ฅ์ ํ์ ์ฌ์ฉํ์ง ์๊ณ ๋จ์ ์ปค๋ฅ์ ์ค์ ๊ณผ ์ฌ์ฉ๋ถ๋ฆฌ๋ง ํ๊ณ ์ถ์ ๊ฒฝ์ฐ์๋ DriverManagerDataSource๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
- DataSource๋ ํ์ค ์ธํฐํ์ด์ค์ด๊ธฐ ๋๋ฌธ์ implements "DriverManagerDataSource"์์ implements "HikariDataSource"๋ก ๋ณ๊ฒฝ๋์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทผ ๋ฉ์๋(์กฐํ,์ญ์ , ๋ณ๊ฒฝ ๋ฑ๋ฑ)์์ ์ปค๋ฅ์ ์ ๋ฐ์์ค๋ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์์๋ ๋ฉ๋๋ค.
TestCode
@BeforeEach
void beforeEach()
{
// ๊ธฐ๋ณธ DriverManager - ํญ์ ์๋ก์ด ์ปค๋ฅ์
ํ๋
// DriverManagerDataSource dataSource = new DriverManagerDataSource(URL,USERNAME,PASSWORD);
// ์ปค๋ฅ์
ํ๋ง
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl(URL);
dataSource.setUsername(USERNAME);
dataSource.setPassword(PASSWORD);
repository = new MemberRepositoryV1(dataSource);
}
HikariCP๋ฅผ DataSource๋ก ์ฑํํด์ ์ฌ์ฉํ์ต๋๋ค.
dataSource.setXXX๋ก dataSource์ ํ์ํ ํ๋ผ๋ฏธํฐ๋ฅผ ๋๊ฒจ ์ค์ ์ ์๋ฃํ์ต๋๋ค.
MemberRepositoryV1 โฃ DataSource(HikariCPDataSource)
private void close(Connection con, Statement stmt, ResultSet rs)
{
JdbcUtils.closeResultSet(rs);
JdbcUtils.closeConnection(con);
JdbcUtils.closeStatement(stmt);
}
๋ณ๊ฒฝ์
- DataSource ์์กด๊ด๊ณ ์ฃผ์ : ์ธ๋ถ์์ DataSource๋ฅผ ์ฃผ์ ๋ฐ์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ DBConnectionUtil์ ์ฌ์ฉํ์ง ์์ต๋๋ค
- + JdbcUtils๊ฐ ์ ๊ณตํ๋ ํธ์ ๋ฉ์๋๋ฅผ ํตํด ์ปค๋ฅ์ ์ ํธ๋ฆฌํ๊ฒ ๋ซ์ ์ ์์ต๋๋ค.
<์ ๋ฆฌ>
- ์ปค๋ฅ์ ํ์ ์ฌ์ฉํด ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ DB๋ฅผ ์ฐ๊ฒฐํด๋ณด์์ต๋๋ค.
- JDBC๊ฐ ์ ๊ณตํ๋ DriverManager๋ฅผ ์ฌ์ฉํ ๋์ ๋ฌ๋ฆฌ DataSource๋ฅผ ์ด์ฉํ๋ฉด ์ปค๋ฅ์
์ ํ์ํ ์ค์ ์
ํ
๊ณผ, ์ปค๋ฅ์
์ ๋ฐ์์ค๋ ์ฌ์ฉ ๋์์ ๋ถ๋ฆฌ๋ก ๋ฑ ํ๋ฒ์ ์ค์ ์ ํตํด ์ปค๋ฅ์
์ ๋ฐ์์ฌ ์ ์์ต๋๋ค.
- ๋์์ ๋ถ๋ฆฌ๋ฅผ ํตํด ์ปค๋ฅ์ ์ ์ป์ ๋๋ง๋ค ์ค์ ์ ๋ณด๋ฅผ ๋๊ฒจ์ฃผ์ด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์ฌ๋ผ์ก์ต๋๋ค.
DBConnectionUtls Class
public static Connection getConnection()
{
try
{
Connection connection = DriverManager.getConnection(ConnectionConst.URL, ConnectionConst.USERNAME, ConnectionConst.PASSWORD);
log.info("get connection={}, class={}",connection,connection.getClass());
return connection;
} catch (SQLException e) {
throw new IllegalStateException(e);
}
}
<์ฐธ๊ณ ์๋ฃ>
'๐ Backend > DB Access' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํธ๋์ญ์ AOP + ์์ธ ์ ํ ์ ์ฉํ Service ๊ณ์ธต ๋ถ๋ฆฌ (0) | 2023.04.06 |
---|---|
Spring ํธ๋์ญ์ AOP - @Transactional ์ฌ์ฉ (0) | 2023.04.05 |
ํธ๋์ญ์ ์ธํฐํ์ด์ค, ํธ๋์ญ์ ํ ํ๋ฆฟ์ ์ด์ฉํ Service ๊ณ์ธต์ Transaction ๋ฌธ์ ํด๊ฒฐ (0) | 2023.04.05 |
Spring์ ์ฌ์ฉํ์ง ์๊ณ Transaction ํด๊ฒฐ (0) | 2023.04.04 |
JDBC by using DriverManager (0) | 2023.04.02 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422