# ์ปค๋„ฅ์…˜ ํ’€ by using DataSource Interface
Study Repository

์ปค๋„ฅ์…˜ ํ’€ 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"๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

DataSource ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•ด์„œ ์ปค๋„ฅ์…˜ ๋ฐ›๊ธฐ

DriverManager์™€์˜ ์ฐจ์ด์ 

DriverManager๋Š” ์ปค๋„ฅ์…˜์„ ์–ป์„ ๋•Œ ๋งˆ๋‹ค USERNAME, PASSWORD, URL์„ ๋„˜๊ฒจ์ฃผ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

DataSource๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด 

  1. ์ฒ˜์Œ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋งŒ ํ•„์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„˜๊ฒจ๋‘๊ณ ,
    1. ์„ค์ • : DataSource๋ฅผ ๋งŒ๋“ค๊ณ  ํ•„์š”ํ•œ ์†์„ฑ๋“ค์„ ์‚ฌ์šฉํ•ด URL, USERNAME, PASSWORD ๊ฐ™์€ ๋ถ€๋ถ„์„ ์ž…๋ ฅ๋ฐ›๊ธฐ.
  2. ์ปค๋„ฅ์…˜์„ ํš๋“ํ•  ๋•Œ๋Š” ๋‹จ์ˆœํžˆ dataSource.getConnection()๋งŒ ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
    1. ์‚ฌ์šฉ(์ปค๋„ฅ์…˜ ํš๋“) : ์„ค์ •ํ•ด๋‘” 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);
}

 

๋ณ€๊ฒฝ์  

  1.  DataSource ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… : ์™ธ๋ถ€์—์„œ DataSource๋ฅผ ์ฃผ์ž…๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— DBConnectionUtil์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค
  2. + 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);
    }
}

DriverManager๋ฅผ ํ†ตํ•œ ์ปค๋„ฅ์…˜ ํš๋“ โ–ถ๏ธŽ DataSource๋ฅผ ํ†ตํ•œ ์ปค๋„ฅ์…˜ ํš๋“


<์ฐธ๊ณ ์ž๋ฃŒ>

 

 

์Šคํ”„๋ง DB 1ํŽธ - ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ํ•ต์‹ฌ ์›๋ฆฌ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ DB ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ธฐ์ˆ ์„ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์ดํ•ดํ•˜๊ณ , ์™„์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง DB ์ ‘๊ทผ ๊ธฐ์ˆ ์˜ ์›๋ฆฌ์™€ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ , ๋” ๊นŠ์ด์žˆ๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., - ๊ฐ•์˜

www.inflearn.com

 

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

Study Repository

rlaehddnd0422

ํ™œ๋™ํ•˜๊ธฐ