1) ์ปค๋ฅ์ ํ (Connection Pool)
(1) ์ปค๋ฅ์ ํ์ด๋
- JDBC API๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ๊ธฐ ์ํด Connection ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์์ ์ ๋น์ฉ์ด ๊ต์ฅํ ๋ง์ด ๋๋ ์์ ์ค ํ๋์ด๋ค.
- Connection ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๊ณผ์ ์ ํ ๋ฒ ์ดํด๋ณด์!
โ ์ ํ๋ฆฌ์ผ์ด์
์์ DB ๋๋ผ์ด๋ฒ๋ฅผ ํตํด ์ปค๋ฅ์
์ ์กฐํํ๋ค.
โก DB ๋๋ผ์ด๋ฒ๋ DB์ TCP/IP ์ปค๋ฅ์
์ ์ฐ๊ฒฐํ๋ค. (3 way handshake์ ๊ฐ์ ๋คํธ์ํฌ ์ฐ๊ฒฐ ๋์ ๋ฐ์)
โข DB ๋๋ผ์ด๋ฒ๋ TCP/IP ์ปค๋ฅ์
์ด ์ฐ๊ฒฐ๋๋ฉด ์์ด๋์ ํจ์ค์๋, ๊ธฐํ ๋ถ๊ฐ ์ ๋ณด๋ฅผ DB์ ์ ๋ฌํ๋ค.
โฃ DB๋ ์์ด๋, ํจ์ค์๋๋ฅผ ํตํด ๋ด๋ถ ์ธ์ฆ์ ๊ฑฐ์น ํ ๋ด๋ถ์ DB๋ฅผ ์์ฑํ๋ค.
โค DB๋ ์ปค๋ฅ์
์์ฑ์ด ์๋ฃ๋์๋ค๋ ์๋ต์ ๋ณด๋ธ๋ค.
โฅ DB ๋๋ผ์ด๋ฒ๋ ์ปค๋ฅ์
๊ฐ์ฒด๋ฅผ ์์ฑํด์ ํด๋ผ์ด์ธํธ์ ๋ฐํํ๋ค.
→ DB ์ฐ๊ฒฐํ ๋๋ง๋ค Connection ๊ฐ์ฒด๋ฅผ ์๋ก ๋ง๋๋ ๊ฒ์ ๋น์ฉ์ด ๋ง์ด ๋ค๋ฉฐ, ๊ต์ฅํ ๋นํจ์จ์ ์ด๋ค.
- ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ํ๋ฆฌ์ผ์ด์ ๋ก๋ฉ ์์ ์ Connection ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์์ฑํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ์ด ํ์ํ ๊ฒฝ์ฐ ๋ฏธ๋ฆฌ ์ค๋น๋ Connection ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฑ๋ฅ์ ํฅ์ํ๋ ์ปค๋ฅ์ ํ (Connection Pool)์ด ๋ฑ์ฅํ๊ฒ ๋๋ค.
(2) ์ปค๋ฅ์ ํ ๋์ ๊ตฌ์กฐ
โ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ํ๋ ์์ ์ ์ปค๋ฅ์ ํ์ ํ์ํ ๋งํผ ์ปค๋ฅ์ ์ ๋ฏธ๋ฆฌ ์์ฑํ์ฌ ๋ณด๊ดํ๋ค.
โก ์๋น์ค์ ํน์ง๊ณผ ์คํ์ ๋ฐ๋ผ ์์ฑ๋๋ Connection ๊ฐ์ฒด์ ๊ฐ์๋ ๋ค๋ฅด์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ๊ธฐ๋ณธ๊ฐ์ผ๋ก 10๊ฐ๋ฅผ ์์ฑํ๋ค.
โข ์ปค๋ฅ์ ํ์ ๋ค์ด์๋ Connection ๊ฐ์ฒด๋ TCP/IP๋ก DB์ ์ฐ๊ฒฐ๋์ด ์๋ ์ํ์ด๊ธฐ ๋๋ฌธ์ ์ฆ์ SQL์ DB์ ์ ๋ฌํ ์ ์๋ค.
โฃ ์ฆ, DB ๋๋ผ์ด๋ฒ๋ฅผ ํตํด ์๋ก์ด ์ปค๋ฅ์ ์ ํ๋ํ๋ ๊ฒ์ด ์๋ ์ด๋ฏธ ์์ฑ๋์ด ์๋ ์ปค๋ฅ์ ์ ์ฐธ์กฐํ์ฌ ์ฌ์ฉํ๊ฒ ๋๋ค.
โค ์ปค๋ฅ์ ํ์ ์๋ ์ปค๋ฅ์ ์ ์์ฒญํ๋ฉด ์ปค๋ฅ์ ํ์ ์์ ์ด ๊ฐ์ง๊ณ ์๋ ์ปค๋ฅ์ ๊ฐ์ฒด ์ค ํ๋๋ฅผ ๋ฐํํ๋ค.
→ DB ๋๋ผ์ด๋ฒ๋ฅผ ํตํด ์ปค๋ฅ์ ์ ์กฐํ, ์ฐ๊ฒฐ, ์ธ์ฆ, SQL์ ์คํํ๋ ์๊ฐ ๋ฑ ์ปค๋ฅ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ์ํ ๊ณผ์ ์ ์๋ตํ ์ ์๊ฒ ๋๋ค.
(3) ์ปค๋ฅ์ ํ ์ข ๋ฅ
- ์ปค๋ฅ์ ํ์ ๋จ์ํด์ ์ง์ ๊ตฌํํ ์๋ ์์ง๋ง, ์ฌ์ฉ๋ ํธ๋ฆฌํ๊ณ ์ฑ๋ฅ๋ ๋ฐ์ด๋ ์คํ์์ค ์ปค๋ฅ์ ํ์ด ๋ง๊ธฐ ๋๋ฌธ์ ์คํ์์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
- ๋ํ์ ์ธ ์ปค๋ฅ์ ํ ์คํ์์ค๋ก๋ “common-dbcp2”, “tomcat-jdbc Pool”, “DrvierManager DataSource”, “HikariCP” ๋ฑ์ด ์๋ค.
- Java์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ์ถ์ํํ DataSource ์ธํฐํ์ด์ค๋ฅผ ๊ฐ๊ฐ์ ์ปค๋ฅ์ ํ ์คํ์์ค์์ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด์ DriverManager ํด๋์ค๋ฅผ ์ด์ฉํ์ฌ Connection ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ฌ์ฉํ๋ค ํ๋๋ผ๋ ์์ค ์ฝ๋ ๋ณ๊ฒฝ ์์ด ๋ฐ๊ฟ ์ ์๋ค.
- Spring Boot 2.0 ์ด์ ๋ฒ์ ์์๋ Apche ์ฌ๋จ์ ์คํ ์์ค์ธ Apache Commons DBCP๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ์์ง๋ง, Spring Boot 2.0 ์ดํ์๋ HikariCP๋ฅผ ๊ธฐ๋ณธ DBCP๋ก ์ฑํํ์ฌ ์ฌ์ฉ๋๊ณ ์๋ค.
[์ฐธ๊ณ ] HikariCP
- HikariCP๋ ๊ฐ๋ฒผ์ด ์ฉ๋๊ณผ ๋น ๋ฅธ ์๋๋ฅผ ๊ฐ์ง๋ ์ฐ์ํ ์ฑ๋ฅ์ JDBC Connection Pool ํ๋ ์์ํฌ์ด๋ค.
- ์คํ๋ง ๋ถํธ 2.0 ์ดํ๋ถํฐ๋ ์ปค๋ฅ์ ํ์ ๊ด๋ฆฌํ๊ธฐ ์ํด HikariCP๋ฅผ ์ฑํํ์ฌ ์ฌ์ฉํ๊ณ ์๋๋ฐ ๋ค๋ฅธ ์ปค๋ฅ์ ํ ์คํ์์ค์ ๋น๊ตํ์ ๋, ์ฑ๋ฅ์ ์ผ๋ก ์ผ๋ง๋ ๋ฐ์ด๋ ์ง ์๋์ ๊ทธ๋ฆผ์ ์ฐธ๊ณ ํ์!
(4) ์ค์ต
[DriverManager ๋ฐฉ์]
Class.forName("com.mysql.cj.jdbc.Driver");
// ์ ์ ์ ๋ณด
String url = "jdbc:mysql://localhost:3306/sesac?serverTimezone=Asia/Seoul&characterEncoding=UTF-8";
String id = "root";
String pwd = "root";
// Connection ๊ฐ์ฒด ์์ฑ
Connection conn = DriverManager.getConnection(url, id, pwd);
→ DB ์ฐ๊ฒฐ์ ์ํด ๋งค๋ฒ Connection ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ ํ๊ณ ์ ์ ์ ๋ณด๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๊ณ์ ๋ฃ์ด์ค์ผ ํ๋ค.
[Connection Pool ๋ฐฉ์]
// ์ ์ ์ ๋ณด
String url = "jdbc:mysql://localhost:3306/sesac?serverTimezone=Asia/Seoul&characterEncoding=UTF-8";
String id = "root";
String pwd = "root";
// ์ปค๋ฅ์
ํ ๊ด๋ จ ์ค์
HikariDataSource dataSource = new HikariDataSource();
// ์ปค๋ฅ์
ํ - ์ ์ URL ์ค์
dataSource.setJdbcUrl(url);
// ์ปค๋ฅ์
ํ - ๊ณ์ ์ค์
dataSource.setUsername(id);
// ์ปค๋ฅ์
ํ - ๋น๋ฐ๋ฒํธ ์ค์
dataSource.setPassword(pwd);
// ์ปค๋ฅ์
ํ - ์์ฑํ Connection ๊ฐ์ฒด ์ ์ค์ (Maximum)
dataSource.setMaximumPoolSize(100);
// ์ปค๋ฅ์
ํ - ์ด๋ฆ ์ค์
dataSource.setPoolName("test");
// Connection ๊ฐ์ฒด ์์ฑ
Connection conn = dataSource.getConnection();
→ ์ปค๋ฅ์
ํ์์ ๋ฏธ๋ฆฌ Connection ๊ฐ์ฒด๋ฅผ ์์ฑํด๋์๊ธฐ์, ๊ธฐ์กด์ ์์ฑ๋ Connection ๊ฐ์ฒด์ ์ฐธ์กฐ๋ฅผ ์ป์ด์ ์ฌ์ฉํ๋ค.
→ ๋ฏธ๋ฆฌ ์์ฑํด๋์๊ธฐ์ ๋ถํ๋ฅผ ์ค์ผ ์ ์์ผ๋ฉฐ, ์ ์ ์ ๋ณด ๋ํ ํ๋ผ๋ฏธํฐ๋ก ๋ฃ์ด์ค ํ์๊ฐ ์๋ค.
[Reference]
'๐จโ๐ป Back End > JDBC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋น๊ด์ ๋ฝ (Pessimistic Lock)์ ์ด์ฉํ ๋์์ฑ ์ด์ ํด๊ฒฐ (0) | 2023.08.28 |
---|---|
Synchrozied ํค์๋๋ฅผ ์ด์ฉํ ๋์์ฑ ์ด์ ํด๊ฒฐ (0) | 2023.08.28 |
Statement๋ณด๋ค PreparedStatement๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ด์ (2) | 2023.08.27 |
JDBC์์ ์์ฃผ ์ฌ์ฉ๋๋ ๋ฉ์๋ ์ ๋ฆฌ (0) | 2023.08.26 |
JDBC๋ฅผ ์ด์ฉํ CRUD ์ค์ต (0) | 2023.08.26 |