Post

[Java] JNDI ์„ค์ •(server.xml)

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

DB ์ ‘์† ์ •๋ณด(URL, ๊ณ„์ •, ๋น„๋ฐ€๋ฒˆํ˜ธ)๋ฅผ ์†Œ์Šค ์ฝ”๋“œ์— ํ•˜๋“œ์ฝ”๋”ฉํ•˜๋ฉด, ๊ฐœ๋ฐœยท์šด์˜ ํ™˜๊ฒฝ์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์ฝ”๋“œ๋ฅผ ๊ณ ์ณ์•ผ ํ•œ๋‹ค. ์ด๋Ÿฐ ํ™˜๊ฒฝ๋ณ„๋กœ ๋‹ฌ๋ผ์ง€๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ฝ”๋“œ ๋ฐ–์—์„œ ๊ด€๋ฆฌํ•˜๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฒƒ์ด JNDI๋‹ค.

JNDI(Java Naming and Directory Interface)๋ž€? ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋„ค์ด๋ฐยท๋””๋ ‰ํ„ฐ๋ฆฌ ์„œ๋น„์Šค์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ API. ์ด๋ฆ„(name)์— ๊ฐ์ฒด(object)๋ฅผ ๋งคํ•‘ํ•ด๋‘๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๊ทธ ์ด๋ฆ„๋งŒ์œผ๋กœ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•œ๋‹ค.

JNDI๋Š” ์ฃผ๋กœ ๋‹ค์Œ์— ์‚ฌ์šฉ๋œ๋‹ค.

์šฉ๋„์˜ˆ
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณดDataSource
๋ฉ”์ผ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ์ •๋ณดMail Session
๋ฆฌ์†Œ์Šค ์„ค์ • ์ •๋ณดํŒŒ์ผ ๊ฒฝ๋กœ, ๋””๋ ‰ํ„ฐ๋ฆฌ ๋“ฑ
1
2
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ โ”€โ”€"jdbc/myDataSource" ์ด๋ฆ„์œผ๋กœ lookupโ”€โ”€โ–บ JNDI โ”€โ”€โ–บ ์‹ค์ œ DataSource
                                                    (์ด๋ฆ„ โ†” ๊ฐ์ฒด ๋งคํ•‘)

1. ์„œ๋ฒ„ ํ™˜๊ฒฝ ์„ค์ • (server.xml)

JNDI๋ฅผ ์“ฐ๋ ค๋ฉด ๋จผ์ € ์„œ๋ฒ„์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋“ฑ๋กํ•ด์•ผ ํ•œ๋‹ค. ํ†ฐ์บฃ(Tomcat)์˜ ๊ฒฝ์šฐ server.xml(๋˜๋Š” context.xml)์—์„œ ์„ค์ •ํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<Context>
    <!-- JNDI ์„ค์ • -->
    <Resource name="jdbc/myDataSource"
              auth="Container"
              type="javax.sql.DataSource"
              driverClassName="com.mysql.jdbc.Driver"
              url="jdbc:mysql://localhost:3306/mydb"
              username="user"
              password="password"
              maxTotal="100"
              maxIdle="30"
              validationQuery="SELECT 1"
              maxWaitMillis="10000"/>
</Context>

โš ๏ธ ์‹ค๋ฌด์—์„œ ์‚ฝ์งˆํ•œ ํฌ์ธํŠธ: validationQuery๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ๊ทธ DB์— ๋งž๋Š” ์ฟผ๋ฆฌ๋ฅผ ์จ์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Oracle์ด๋ผ๋ฉด SELECT 1์ด ์•„๋‹ˆ๋ผ SELECT 1 FROM DUAL์„ ์จ์•ผ ํ•œ๋‹ค. ์ด๊ฑธ ๋นผ๋จน์–ด์„œ ํšŒ์‚ฌ์—์„œ ํ•œ์ฐธ ํ—ค๋งธ๋‹ค.


2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ JNDI ์‚ฌ์šฉ

๋“ฑ๋ก๋œ JNDI ๋ฆฌ์†Œ์Šค๋Š” InitialContext๋กœ ์กฐํšŒ(lookup)ํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import java.sql.Connection;

public class JndiExample {
    public static void main(String[] args) {
        try {
            Context context = new InitialContext();
            // ์ด๋ฆ„์œผ๋กœ DataSource๋ฅผ ์กฐํšŒ
            DataSource dataSource =
                (DataSource) context.lookup("java:comp/env/jdbc/myDataSource");
            Connection connection = dataSource.getConnection();
            // Connection์œผ๋กœ DB ์ž‘์—… ์ˆ˜ํ–‰
            connection.close();   // ์ž‘์—… ์™„๋ฃŒ ํ›„ ์—ฐ๊ฒฐ ๋‹ซ๊ธฐ
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

context.lookup("java:comp/env/jdbc/myDataSource") โ€” server.xml์— ๋“ฑ๋กํ•œ ์ด๋ฆ„์œผ๋กœ ์‹ค์ œ DataSource๋ฅผ ๋ฐ›์•„์˜จ๋‹ค. ์ฝ”๋“œ์—๋Š” ์ ‘์† ์ •๋ณด๊ฐ€ ์ „ํ˜€ ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.


3. JNDI ์„ค์ •์˜ ์žฅ์ 

์žฅ์ ์„ค๋ช…
์œ ์ง€๋ณด์ˆ˜์„ฑ์ ‘์† ์ •๋ณด๋ฅผ ์ฝ”๋“œ์™€ ๋ถ„๋ฆฌํ•ด ์™ธ๋ถ€์—์„œ ๊ด€๋ฆฌ
์œ ์—ฐ์„ฑยทํ™•์žฅ์„ฑ๋ฆฌ์†Œ์Šค๋ฅผ ์ค‘์•™์—์„œ ์ง‘์ค‘ ๊ด€๋ฆฌ
์ž์› ๊ณต์œ ์„œ๋กœ ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„ ์ž์› ๊ณต์œ  ๊ฐ€๋Šฅ

๐Ÿ“ ์ •๋ฆฌ

1
2
3
4
5
JNDI
โ”œโ”€ ๊ฐœ๋…      ์ด๋ฆ„(name) โ†” ๊ฐ์ฒด(object) ๋งคํ•‘, ์ด๋ฆ„์œผ๋กœ ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ
โ”œโ”€ ์„œ๋ฒ„ ์„ค์ • server.xml <Resource ...> ๋กœ DataSource ๋“ฑ๋ก
โ”œโ”€ ์•ฑ ์‚ฌ์šฉ   InitialContext.lookup("java:comp/env/...")
โ””โ”€ ์žฅ์       ์ ‘์† ์ •๋ณด ๋ถ„๋ฆฌ โ†’ ์œ ์ง€๋ณด์ˆ˜์„ฑยท์œ ์—ฐ์„ฑยท์ž์› ๊ณต์œ 
๊ฐœ๋…ํ•œ ์ค„ ์ •์˜
JNDI์ด๋ฆ„์œผ๋กœ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๋Š” ์ž๋ฐ” API
Resource(server.xml)์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ฆฌ์†Œ์Šค ๋“ฑ๋ก
validationQuery์ปค๋„ฅ์…˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ ์ฟผ๋ฆฌ (DB๋ณ„๋กœ ๋‹ค๋ฆ„!)

JNDI๋Š” โ€œ์ ‘์† ์ •๋ณด๋ฅผ ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ ์„œ๋ฒ„๊ฐ€ ๊ด€๋ฆฌํ•œ๋‹คโ€๋Š” ๋ฐœ์ƒ์ด๋‹ค. ํŠนํžˆ validationQuery๋Š” DB ์ข…๋ฅ˜์— ๋งž๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์ž โ€” ์‚ฌ์†Œํ•ด ๋ณด์ด์ง€๋งŒ ์‹ค๋ฌด์—์„œ ๋ฐœ๋ชฉ์„ ์žก๋Š”๋‹ค.

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

Comments powered by Disqus.