๐Ÿ‘จ‍๐Ÿ’ป Back End/JDBC

์ปค๋„ฅ์…˜ ํ’€์ด๋ž€ (Connection Pool)

Dev_sHu 2023. 8. 28. 11:35

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]

 

[๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค] Connection Pool์ด๋ž€?

cs-study์—์„œ ์Šคํ„ฐ๋””๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. DB Connection DB๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด DB์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„ ํ†ต์‹ ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ DB Connection์€ Database Driver์™€ Database ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ๋‹ด์€ URL์ด ํ•„์š”ํ•จ Java์˜ DB Con

steady-coding.tistory.com

 

[Java] JDBC๋ž€ ๋ฌด์—‡์ธ๊ฐ€? - Java Database Connectivity

JDBC๋ž€? JDBC(Java Database Connectivity)๋Š” Java ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ ๋ฐ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ Java์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ž๋ฐ” API์ด๋‹ค. JDB

ittrue.tistory.com

 

๋ฐ˜์‘ํ˜•