Post

[Java] JNDI์™€ DBCP

๐Ÿ“Œ ๋“ค์–ด๊ฐ€๋ฉฐ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ๋งค๋ฒˆ ์ƒˆ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ๋น„์šฉ์ด ํฐ ์ž‘์—…์ด๋‹ค. ๋˜ ์ ‘์† ์ •๋ณด๋ฅผ ์ฝ”๋“œ์— ํ•˜๋“œ์ฝ”๋”ฉํ•˜๋ฉด ํ™˜๊ฒฝ์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค. ์ด ๋‘ ๋ฌธ์ œ๋ฅผ ๊ฐ๊ฐ DBCP(์—ฐ๊ฒฐ ์žฌ์‚ฌ์šฉ)์™€ JNDI(์„ค์ • ์™ธ๋ถ€ํ™”)๊ฐ€ ํ•ด๊ฒฐํ•œ๋‹ค. ๋‘ ๊ธฐ์ˆ ์„ ํ•จ๊ป˜ ์“ฐ๋ฉด ํšจ์œจ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋™์‹œ์— ์žก์„ ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ์ˆ ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ
JNDI์ ‘์† ์ •๋ณด๋ฅผ ์ฝ”๋“œ ๋ฐ–(์ค‘์•™)์—์„œ ๊ด€๋ฆฌ
DBCP์—ฐ๊ฒฐ์„ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ํ’€์— ๋‘๊ณ  ์žฌ์‚ฌ์šฉ

1. JNDI (Java Naming and Directory Interface)

JNDI๋Š” ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋„ค์ด๋ฐ/๋””๋ ‰ํ„ฐ๋ฆฌ ์„œ๋น„์Šค์— ์ ‘๊ทผํ•˜๋Š” API๋‹ค. ์ฃผ๋กœ ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ ๊ฐ์ฒด๋ฅผ ์ฐพ๊ณ , DB ์—ฐ๊ฒฐ ์ •๋ณด ๊ฐ™์€ ํ™˜๊ฒฝ ์„ค์ •์„ ์ค‘์•™์—์„œ ๊ด€๋ฆฌํ•œ๋‹ค.

์‚ฌ์šฉ ์ด์œ :

  • ์ค‘์•™ํ™”๋œ ํ™˜๊ฒฝ ์„ค์ •: ์ ‘์† ์ •๋ณด๋ฅผ ์ฝ”๋“œ์— ํ•˜๋“œ์ฝ”๋”ฉํ•˜์ง€ ์•Š๊ณ  ์ค‘์•™์—์„œ ๊ด€๋ฆฌ
  • ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด ๋ณ€๊ฒฝ: ์„ค์ •์ด ๋ฐ”๋€Œ์–ด๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋Š” ๊ทธ๋Œ€๋กœ
1
2
3
4
5
6
7
8
9
10
// JNDI๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๊ฐ€์ ธ์˜ค๊ธฐ
Context initialContext = new InitialContext();
DataSource dataSource =
    (DataSource) initialContext.lookup("java:comp/env/jdbc/myDataSource");

try (Connection connection = dataSource.getConnection()) {
    // ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—… ์ˆ˜ํ–‰
} catch (SQLException e) {
    e.printStackTrace();
}

"java:comp/env/jdbc/myDataSource"๋Š” JNDI ๋„ค์ด๋ฐ ๊ทœ์น™์— ๋”ฐ๋ฅธ ์ด๋ฆ„์ด๋‹ค. ์ด ์ด๋ฆ„์œผ๋กœ ๋“ฑ๋ก๋œ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์ฐพ์•„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.


2. DBCP (Database Connection Pooling)

DBCP๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด ํ’€(pool)์— ์ €์žฅํ–ˆ๋‹ค๊ฐ€, ํ•„์š”ํ•  ๋•Œ ๊บผ๋‚ด ์“ฐ๊ณ  ๋‹ค์‹œ ๋ฐ˜๋‚ฉํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

1
2
3
4
5
6
[DBCP ์—†์ด]  ์š”์ฒญ๋งˆ๋‹ค  ์—ฐ๊ฒฐ ์ƒ์„ฑ โ†’ ์‚ฌ์šฉ โ†’ ์ข…๋ฃŒ   (๋งค๋ฒˆ ๋น„์‹ผ ๋น„์šฉ)

[DBCP]       ํ’€์—์„œ ์—ฐ๊ฒฐ ๋Œ€์—ฌ โ†’ ์‚ฌ์šฉ โ†’ ๋ฐ˜๋‚ฉ        (์žฌ์‚ฌ์šฉ)
             โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Connection Pool โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
             โ”‚  [conn] [conn] [conn] [conn] ...  โ”‚
             โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

์‚ฌ์šฉ ์ด์œ :

์ด์œ ์„ค๋ช…
์„ฑ๋Šฅ ํ–ฅ์ƒ์—ฐ๊ฒฐ ์ƒ์„ฑ์€ ๋น„์šฉ์ด ํฐ ์ž‘์—… โ†’ ๋ฏธ๋ฆฌ ๋งŒ๋“  ์—ฐ๊ฒฐ ์žฌํ™œ์šฉ
์ปค๋„ฅ์…˜ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€๋ฐ˜ํ™˜๋˜์ง€ ์•Š์€ ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜ ์ œ๊ณต
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// DBCP ์„ค์ • (Apache Commons DBCP)
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mydatabase");
dataSource.setUsername("username");
dataSource.setPassword("password");
dataSource.setInitialSize(5);   // ์ดˆ๊ธฐ ์—ฐ๊ฒฐ ์ˆ˜
dataSource.setMaxTotal(10);     // ์ตœ๋Œ€ ์—ฐ๊ฒฐ ์ˆ˜

try (Connection connection = dataSource.getConnection()) {
    // ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—… ์ˆ˜ํ–‰
} catch (SQLException e) {
    e.printStackTrace();
}

BasicDataSource๋Š” Apache Commons DBCP๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค๋กœ, ์—ฐ๊ฒฐ ํ’€์„ ์„ค์ •ยท๊ด€๋ฆฌํ•œ๋‹ค.


3. JNDI + DBCP ํ•จ๊ป˜ ์“ฐ๊ธฐ

JNDI๋กœ ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ์ค‘์•™ ๊ด€๋ฆฌํ•˜๊ณ , ๊ทธ ๋’ค์—์„œ DBCP๊ฐ€ ์—ฐ๊ฒฐ ํ’€์„ ๊ด€๋ฆฌํ•˜๋„๋ก ๊ฒฐํ•ฉํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
// JNDI๋กœ๋ถ€ํ„ฐ (DBCP๋กœ ๊ด€๋ฆฌ๋˜๋Š”) DataSource ์กฐํšŒ
Context initialContext = new InitialContext();
DataSource dataSource =
    (DataSource) initialContext.lookup("java:comp/env/jdbc/myDataSource");

try (Connection connection = dataSource.getConnection()) {
    // ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—… ์ˆ˜ํ–‰
} catch (SQLException e) {
    e.printStackTrace();
}

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋Š” ์ด๋ฆ„์œผ๋กœ lookup๋งŒ ํ•˜๋ฉด ๋˜๊ณ , ๊ทธ ๋’ค์˜ ํ’€ ๊ด€๋ฆฌ์™€ ์„ค์ •์€ ์ปจํ…Œ์ด๋„ˆ/DBCP๊ฐ€ ๋‹ด๋‹นํ•œ๋‹ค.


๐Ÿ“Œ ์„ฑ๋Šฅ ์ตœ์ ํ™” ํŒ

์„ค์ •์˜ต์…˜ํšจ๊ณผ
ํ’€ ํฌ๊ธฐ ์กฐ์ ˆsetInitialSize, setMaxTotal์ดˆ๊ธฐ/์ตœ๋Œ€ ์—ฐ๊ฒฐ ์ˆ˜๋ฅผ ์ž์›์— ๋งž๊ฒŒ ์กฐ์ ˆ
์œ ํœด ์—ฐ๊ฒฐ ๊ฒ€์‚ฌsetTestWhileIdle, setTimeBetweenEvictionRunsMillis์‚ฌ์šฉ ์•ˆ ํ•˜๋Š” ์—ฐ๊ฒฐ์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ •๋ฆฌ

๐Ÿ“ ์ •๋ฆฌ

1
2
3
4
JNDI + DBCP
โ”œโ”€ JNDI  ์ด๋ฆ„์œผ๋กœ ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ, ์ ‘์† ์ •๋ณด ์ค‘์•™ ๊ด€๋ฆฌ
โ”œโ”€ DBCP  ์—ฐ๊ฒฐ ํ’€์—์„œ ๋Œ€์—ฌยท๋ฐ˜๋‚ฉ โ†’ ์žฌ์‚ฌ์šฉ์œผ๋กœ ์„ฑ๋Šฅโ†‘, ๋ˆ„์ˆ˜ ๋ฐฉ์ง€
โ””โ”€ ๊ฒฐํ•ฉ  lookup์œผ๋กœ ์กฐํšŒ + ๋’ค์—์„œ ํ’€ ๊ด€๋ฆฌ (์„ค์ • ์™ธ๋ถ€ํ™” + ์„ฑ๋Šฅ)
๊ฐœ๋…ํ•œ ์ค„ ์ •์˜
JNDI์ด๋ฆ„์œผ๋กœ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๋Š” API (์„ค์ • ์™ธ๋ถ€ํ™”)
DBCP์—ฐ๊ฒฐ์„ ํ’€์— ๋‘๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ 
BasicDataSourceCommons DBCP์˜ ์—ฐ๊ฒฐ ํ’€ ๊ตฌํ˜„์ฒด

JNDI๋Š” โ€œ์„ค์ •์„ ์ฝ”๋“œ ๋ฐ–์œผ๋กœโ€, DBCP๋Š” โ€œ์—ฐ๊ฒฐ์„ ์žฌ์‚ฌ์šฉ์œผ๋กœโ€. ์ด ๋‘˜์„ ๊ฒฐํ•ฉํ•˜๋ฉด ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ์„ฑ๋Šฅ์„ ํ•จ๊ป˜ ํ™•๋ณดํ•˜๋Š”, ์‹ค๋ฌด์˜ ํ‘œ์ค€์ ์ธ DB ์—ฐ๊ฒฐ ๊ด€๋ฆฌ ๋ฐฉ์‹์ด ์™„์„ฑ๋œ๋‹ค.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.