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.