๐ ์ด์ ๊ธ: 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
'๊ฐ์ธ ๊ณต๋ถ > DB' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[jdbc] ํธ๋์ญ์ ๊ด๋ฆฌ (feat. ์คํ๋ง ํ๋ ์์ํฌ) (0) | 2025.02.05 |
---|---|
ํธ๋์ญ์ (0) | 2025.01.30 |
JDBC์ SQL Mapper, ORM ๊ฐ๋จํ ์ ๋ฆฌ (0) | 2025.01.21 |
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณด์๊ณผ PRIVILEGES (0) | 2024.11.24 |
์คํค๋ง ์ ์ ๋ฅผ ํด์ผ ํ๋ ์ด์ (์ฝ์ ์ด์, ์ญ์ ์ด์, ๊ฐฑ์ ์ด์) (1) | 2024.11.11 |