๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ฐœ์ธ ๊ณต๋ถ€/DB

[Jdbc] ์ปค๋„ฅ์…˜ ํ’€๋ง๊ณผ DataSource ์ธํ„ฐํŽ˜์ด์Šค

by syLim___ 2025. 1. 28.
728x90

 

๐Ÿ“„ ์ด์ „ ๊ธ€: JDBC์™€ SQL Mapper, ORM ๊ฐ„๋‹จํžˆ ์ •๋ฆฌ

 

 

โœ… DriverManager

- JDBC๊ฐ€ ๋“ฑ์žฅํ•จ์œผ๋กœ์จ "๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜ - SQL ์ฟผ๋ฆฌ ๋‚ ๋ฆฌ๊ธฐ - ์‘๋‹ต ๋ฐ›๊ธฐ" ๊ณผ์ •์ด ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ˆ˜์›”ํ•ด์กŒ๋‹ค.

 

- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜์„ ์ƒ์„ฑํ•˜๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” DriverManager.getConnection() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๐Ÿฅ ์˜ˆ์‹œ ์ฝ”๋“œ

// DriverManager๋ฅผ ์ด์šฉํ•œ ์ปค๋„ฅ์…˜ ํš๋“
String url = "jdbc:h2:tcp://localhost/~/test";
String username = "sa";
String password = "";
Connection connection = DriverManager.getConnection(url, username, password);

 

๐Ÿฅ getConnecton() ๋‚ด๋ถ€ ๋™์ž‘

- ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋“ฑ๋ก๋œ JDBC ๋“œ๋ผ์ด๋ฒ„ ๋ชฉ๋ก์„ ์ž๋™์œผ๋กœ ์ธ์‹ํ•˜๊ณ ,
    JDBC ๋“œ๋ผ์ด๋ฒ„๋“ค์—๊ฒŒ ์ˆœ์„œ๋Œ€๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’๋“ค์„ ๋„˜๊ฒจ์ฃผ์–ด ์ปค๋„ฅ์…˜์ด ํš๋“๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
- ์ปค๋„ฅ์…˜ ํš๋“์— ์„ฑ๊ณตํ•˜๋ฉด ์ปค๋„ฅ์…˜์„ ๋ฆฌํ„ดํ•˜๊ณ , ์‹คํŒจํ•˜๋ฉด ๋‹ค์Œ ๋“œ๋ผ์ด๋ฒ„์™€ ์ปค๋„ฅ์…˜์„ ์‹œ๋„ํ•œ๋‹ค.

 

 

๐Ÿฅ ์ปค๋„ฅ์…˜ ํš๋“ ์„ธ๋ถ€ ๊ณผ์ •

- TCP ์—ฐ๊ฒฐ์„ ์œ„ํ•ด 3 way handshake๋ฅผ ํ•œ๋‹ค.
- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ํ•˜๊ณ , ์ธ์ฆ์ด ์™„๋ฃŒ๋˜๋ฉด DB ๋‚ด๋ถ€์— ์„ธ์…˜์„ ๋งŒ๋“ ๋‹ค.
- JDBC ๋“œ๋ผ์ด๋ฒ„๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ๋ถ€ํ„ฐ ์—ฐ๊ฒฐ๋๋‹ค๋Š” ์‘๋‹ต์„ ๋ฐ›์œผ๋ฉด, ์ปค๋„ฅ์…˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด ๋ฆฌํ„ดํ•œ๋‹ค.

 

 

- DriverManager.getConnection()์„ ํ˜ธ์ถœํ•˜๋ฉด ์œ„์™€ ๊ฐ™์€ ๋ณต์žกํ•œ ์ž‘์—…๋“ค์ด ์ˆ˜ํ–‰๋œ๋‹ค.

 

- ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์—์„œ DB ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋•Œ๋งˆ๋‹ค DB ์ปค๋„ฅ์…˜์„ ๋งค๋ฒˆ ์ƒˆ๋กœ ์–ป์–ด์˜ค๊ฒŒ ๋˜๋ฉด, ์œ„์˜ ๋ณต์žกํ•œ ๊ณผ์ •๋“ค์ด ๋งค๋ฒˆ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค.

- ๋งค ์š”์ฒญ๋งˆ๋‹ค ์ปค๋„ฅ์…˜์„ ์ƒ์„ฑํ•œ๋‹ค๋ฉด ๊ณผ์ • ์ž์ฒด๋„ ๋ณต์žกํ•˜๊ณ , ์‹œ๊ฐ„๋„ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ , ์‘๋‹ต ์†๋„๋„ ๋А๋ ค์งˆ ๊ฒƒ์ด๋‹ค.

 

- ๊ทธ๋ž˜์„œ ์ปค๋„ฅ์…˜ ํ’€์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

โœ… ์ปค๋„ฅ์…˜ ํ’€๋ง

- ์ปค๋„ฅ์…˜ ํ’€๋ง์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ์ ์— ํ•„์š”ํ•œ ๊ฐฏ์ˆ˜๋งŒํผ ์ปค๋„ฅ์…˜์„ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด์„œ ์ปค๋„ฅ์…˜ ํ’€์— ์ €์žฅํ•ด๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

 

- ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐ ๋กœ์ง์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๋™์ด ํ•„์š”ํ•  ๋•Œ ๋งค๋ฒˆ ์ปค๋„ฅ์…˜์„ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ,

  ์ปค๋„ฅ์…˜ ํ’€์— ์ปค๋„ฅ์…˜์„ ์š”์ฒญํ•˜๊ณ , ์ด๋ฏธ ์ƒ์„ฑ๋˜์–ด ์žˆ๋Š” ์ปค๋„ฅ์…˜์„ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์‚ฌ์šฉํ•œ ํ›„,

  ์‚ฌ์šฉ์ด ๋๋‚˜๋ฉด ์ปค๋„ฅ์…˜์„ ์ข…๋ฃŒํ•˜๋Š” ๋Œ€์‹  ์ปค๋„ฅ์…˜ํ’€์— ๋ฐ˜ํ™˜ํ•˜์—ฌ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

 

- ์ปค๋„ฅ์…˜ ํ’€์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปค๋„ฅ์…˜์— ํ•„์š”ํ•œ ๋น„์šฉ์„ ์ค„์ผ ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ,

  ์„œ๋ฒ„๋‹น ์ตœ๋Œ€ ์ปค๋„ฅ์…˜ ๊ฐฏ์ˆ˜๋ฅผ ์ œํ•œํ•จ์œผ๋กœ์จ ๋ฆฌ์†Œ์Šค ๋‚ญ๋น„๋„ ์ค„์ด๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋„ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

- ์œ ๋ช…ํ•œ ์˜คํ”ˆ์†Œ์Šค ์ปค๋„ฅ์…˜ ํ’€๋กœ๋Š” dbcp2, hikaricp, tomact jdbc pool ๋“ฑ์ด ์žˆ๋‹ค.

 

โœ… javax.sql.DataSource ์ธํ„ฐํŽ˜์ด์Šค

- ์ปค๋„ฅ์…˜์„ ์–ป๋Š” ๋ฐฉ๋ฒ•์„ ์ถ”์ƒํ™”ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋‹ค.

public interface DataSource  extends CommonDataSource, Wrapper {

    Connection getConnection() throws SQLException;
    Connection getConnection(String username, String password) throws SQLException;
    ...   
}

 

- DataSource๊ฐ€ ์ถ”์ƒํ™”๋จ์œผ๋กœ์จ JDBC ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ์ปค๋„ฅ์…˜์„ ์–ป๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ฒŒ ๋˜์—ˆ๋‹ค.

 

- ์›๋ž˜ DriverManager๋ฅผ ์ด์šฉํ•œ ์ปค๋„ฅ์…˜์€ DataSource ๊ตฌํ˜„์ฒด๋กœ ์ œ๊ณต๋˜์ง€ ์•Š์•„์„œ

  DriverManager๋ฅผ ์ด์šฉํ•œ ์ปค๋„ฅ์…˜์€ ๋”ฐ๋กœ ์ž‘์„ฑํ•ด์ฃผ์–ด์•ผ ํ–ˆ์ง€๋งŒ,

  Spring์—์„œ๋Š” DriverManager๋ฅผ ์‚ฌ์šฉํ•˜๋Š” DataSource ๊ตฌํ˜„์ฒด์ธ DriverManagerDataSource๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

 

๐Ÿฅ ์ปค๋„ฅ์…˜ ํš๋“ ํ›„ ์‚ฌ์šฉ ์˜ˆ์‹œ

public class TestRepository {

    private final DataSource dataSource;
    
    public TestRepository(DataSource dataSource) { // ์ƒ์„ฑ์ž ์ฃผ์ž…
        this.dataSource = dataSource;
    }
    
     public void save(Member member) {
         Connection conn = null;
         String sql = "insert into member(member_id, money) values(?,?)";
         PreparedStatement ps = null;
         
         try {
             conn = dataSource.getConnection();
             ps = conn.prepareStatement(sql);
             ps.setString(1, member.getId());
             ps.setInt(2, member.getMoney());
             ps.executeUpdate();
             return;
         } catch (SQLException e) {
             // ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
         } finally {
         	JdbcUtils.closeStatement(ps); // Statement ๊ฐ์ฒด๋ฅผ close
            JdbcUtils.closeConnection(conn); // ์ปค๋„ฅ์…˜ ๊ฐ์ฒด๋ฅผ ํ’€์— ๋ฐ˜ํ™˜
         }
     }
 }

 

 

 

๐Ÿ“Œ DataSource ๊ตฌํ˜„์ฒด - HikariDataSource

- ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋””ํดํŠธ DataSource ๊ตฌํ˜„์ฒด๋กœ, ์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ๋ผ๋ฉด ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์•„๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

- ๋‹ค๋ฅธ ์ปค๋„ฅ์…˜ ํ’€ ๊ตฌํ˜„์ฒด๋“ค๋ณด๋‹ค ์„ฑ๋Šฅ์ด ์ข‹๊ณ , ์•ˆ์ •์ ์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

๐Ÿ“Œ DataSource ๊ตฌํ˜„์ฒด - BasicDataSource

- ์‚ฌ์šฉ์„ ์œ„ํ•ด์„œ๋Š” org.apache.commons.commons-dbcp2 ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

- ํŒŒ๋ผ๋ฏธํ„ฐ ์ตœ์ ํ™” ์„ธํŒ…์„ ์‰ฝ๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

- ์ด๋Ÿฐ ์žฅ์  ๋•Œ๋ฌธ์— ๊ณต๋ถ€ํ•  ๋•Œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—! ํŒŒ๋ผ๋ฏธํ„ฐ ์ •๋ณด๋“ค์„ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.

 

- BasicDataSource ์ธ์Šคํ„ด์Šค๋Š” ์•„๋ž˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ, setter ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’๋“ค์„ ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. (2.0๋ฒ„์ „ ๊ธฐ์ค€)

ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„ Default value  
initialSize 0 ์ปค๋„ฅ์…˜ ํ’€์˜ ์ดˆ๊ธฐ ์‚ฌ์ด์ฆˆ
maxTotal 8 ์ปค๋„ฅ์…˜ ํ’€์ด ํ•œ๋ฒˆ์— ํ• ๋‹นํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” Connection์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜
maxIdle 8 ์ปค๋„ฅ์…˜ ํ’€์— idleํ•œ(์‰ฌ๊ณ ์žˆ๋Š”) ์ƒํƒœ๋กœ ๋‚จ์•„์žˆ์„ ์ˆ˜ ์žˆ๋Š” Connection์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜
minIdle 0 ์ปค๋„ฅ์…˜ ํ’€์— idleํ•œ(์‰ฌ๊ณ ์žˆ๋Š”) ์ƒํƒœ๋กœ ๋‚จ์•„์žˆ์„ ์ˆ˜ ์žˆ๋Š” Connection์˜ ์ตœ์†Œ ๊ฐœ์ˆ˜
maxWaitMillis   ์ปค๋„ฅ์…˜ ํ’€์ด ์ปค๋„ฅ์…˜ ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋˜๊ธฐ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๋Š” ์‹œ๊ฐ„
validationQuery   ์ปค๋„ฅ์…˜ ํ’€์— Connection์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „, ์—ฐ๊ฒฐ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ์ฟผ๋ฆฌ
(mysql์˜ ๊ฒฝ์šฐ select 1์„ ๋งŽ์ด ์‚ฌ์šฉ)
testOnBorrow true ์ปค๋„ฅ์…˜ํ’€๋กœ๋ถ€ํ„ฐ Connection์„ ์–ป์–ด์˜ฌ ๋•Œ, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์—ฌ๋ถ€
testOnReturn false ์ปค๋„ฅ์…˜ํ’€์— Connection์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ, ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์—ฌ๋ถ€
lifo true true์ด๋ฉด ๊ฐ€์žฅ ์ตœ๊ทผ ๋ฐ˜ํ™˜ํ•œ Connection์„ ๊ฐ€์žฅ ๋จผ์ € ๋นŒ๋ ค์ค€๋‹ค

 

 

์ปค๋„ฅ์…˜ ํ’€์—์„œ idleํ•œ ์ปค๋„ฅ์…˜ ๊ฐœ์ˆ˜๊ฐ€ minIdle๋ณด๋‹ค ์ ์–ด์ง€๋ฉด

์ปค๋„ฅ์…˜ ํ’€์€ ์ƒˆ๋กœ์šด ์ปค๋„ฅ์…˜ ์ƒ์„ฑ์„ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

์ด๋•Œ ํ˜„์žฌ ์ปค๋„ฅ์…˜ ์ˆ˜๊ฐ€ maxTotal์ด๋ฉด ์ƒ์„ฑ์— ์‹คํŒจํ•˜๊ณ  ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

 

 

์ •๋ฆฌ์ฆ

https://d2.naver.com/helloworld/5102792

 

๐Ÿ“„ ๋‹ค์Œ ๊ธ€: ํŠธ๋žœ์žญ์…˜

 

728x90