
2025-04-11
์ด๋ฒ ์ค์ต์์๋ JNDI ๊ธฐ๋ฐ Resource ์ค์ ์ ํตํด
Oracle/MySQL DB์ ์ปค๋ฅ์
ํ(Connection Pool)์ ์ฐ๋ํ๊ณ ,
ํ์๊ฐ์
๋ฐ ๋ก๊ทธ์ธ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค.
์ด๋ฅผ ํตํด Servlet + DB ์ฐ๋ + ์ธ์ฆ ํ๋ฆ์ ๋ช
ํํ๊ฒ ํ์ตํ๋ค.
lookup("java:/comp/env/...") ๋ฐฉ์์ JNDI์ ์ผ์ข
์ฆ, JNDI๋ ์ค์ ์ ๋ณด์ ์ค์ ์ฝ๋๋ฅผ ๋ถ๋ฆฌ์์ผ์ฃผ๋ฉฐ,
์์(๋ฆฌ์์ค)์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ฌ์ค๋ค.
context.xml์ ์ ์ํด๋๊ณ , JNDI๋ฅผ ํตํด ์ ๊ทผํ๋ ๊ตฌ์กฐ์ฝ๊ฒ ๋งํด,
context.xml์์ ์์์ ๋ฏธ๋ฆฌ ์ ์ํด๋๊ณ ,
์ฝ๋์์๋ ์ด๋ฆ๋ง ์์์ JNDI lookup()์ผ๋ก ๊ฐ์ ธ์ ์ฐ๋ ๋ฐฉ์์ด๋ค.
context.xml์์ DB ์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ๋ฏธ๋ฆฌ Resource๋ก ๋ฑ๋ก web.xml์์ Resource ์ด๋ฆ์ ์ ํ๋ฆฌ์ผ์ด์
๋ด์ ๋
ธ์ถ (JNDI ์ฐธ์กฐ๋ช
๋ฑ๋ก)DBUtils.java ํด๋์ค์์ ๋ค์๊ณผ ๊ฐ์ด lookupContext initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/OracleDB");
Connection conn = ds.getConnection();
DriverManager.getConnection(...)์ ์ฐ์ง ์๊ณ Resource๋ฅผ ์ธ๊น?์ ํต ๋ฐฉ์ (DriverManager) | Resource (JNDI + DataSource) |
|---|---|
| ์ฝ๋์์ ์ง์ ์ฐ๊ฒฐ์ ๋ณด ์ ๋ ฅ | ์ค์ ๋ถ๋ฆฌ (context.xml์ ๋ฐ๋ก ๊ด๋ฆฌ) |
| ์ปค๋ฅ์ ๋งค๋ฒ ์์ฑ/์ข ๋ฃ | ์ปค๋ฅ์ ํ ํ์ฉ (์ฑ๋ฅ ํฅ์) |
| ๋ณด์ ์ํ (๊ณ์ ๋ ธ์ถ) | ์ค์ ํ์ผ๋ก ๋ถ๋ฆฌํ์ฌ ๋ณด์ ๊ฐํ |
| ์ ์ง๋ณด์ ๋ถํธ | ํ๊ฒฝ๋ง ๋ฐ๊พธ๋ฉด ์ฝ๋ ์์ ็ก |
| ๊ธฐ๋ฅ | ์ค๋ช |
|---|---|
| ํ์๊ฐ์ | ์ฌ์ฉ์ ์ ๋ณด ์
๋ ฅ ํ DB์ ์ ์ฅ (/join.do) |
| ๋ก๊ทธ์ธ | DB์ ์ฌ์ฉ์ ์ ๋ณด์ ๋งค์นญํ์ฌ ์ธ์ฆ (/login.do) |
| ๋ฉ์ธ ํ์ด์ง | ๋ก๊ทธ์ธ ์ฑ๊ณต ์ ์ง์
(/main.do) |
| ํ์ผ๋ช | ์ญํ |
|---|---|
Home.java | /index.do, /main.do ์ฒ๋ฆฌ |
Join.java | GET: ํ์๊ฐ์ ํผ, POST: ํ์ ์ ๋ณด DB ์ ์ฅ |
Login.java | GET: ๋ก๊ทธ์ธ ํผ, POST: ๋ก๊ทธ์ธ ์ธ์ฆ + ์ธ์ ์ค์ |
| ํ์ผ๋ช | ์ค๋ช |
|---|---|
UserDto.java | ์ฌ์ฉ์ ์ ๋ณด ๋ชจ๋ธ ํด๋์ค (username, password, role) |
OracleDBUtils.java / MysqlDbUtils.java | DataSource(JNDI) ๊ธฐ๋ฐ DB ์ฐ๊ฒฐ ํด๋์ค, ์ฑ๊ธํค ๋ฐฉ์ |
| ํ์ผ๋ช | ๊ฒฝ๋ก | ์ญํ |
|---|---|---|
index.jsp | /WEB-INF/index.jsp | ์ง์ ํ์ด์ง |
join.jsp | /WEB-INF/user/join.jsp | ํ์๊ฐ์ ํผ |
login.jsp | /WEB-INF/user/login.jsp | ๋ก๊ทธ์ธ ํผ |
main.jsp | /WEB-INF/main.jsp | ๋ก๊ทธ์ธ ํ ๋ฉ์ธ ํ์ด์ง |
ํ์ ์ ๋ณด๋ฅผ ์ ์ฅํ ํ ์ด๋ธ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ๋ค:
CREATE TABLE tbl_user (
username VARCHAR2(100) PRIMARY KEY,
password VARCHAR2(100) NOT NULL,
role VARCHAR2(50) DEFAULT 'ROLE_USER'
);
๐ ์ ํ ์ด๋ธ์
UserDto๊ฐ์ฒด์ 1:1๋ก ๋งคํ๋๋ค.
context.xml โ ์ปค๋ฅ์
ํ ์ค์ <Resource driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:xe"
username="system"
password="1234"
name="jdbc/OracleDB"
type="javax.sql.DataSource"
auth="Container"
maxActive="20"
maxIdle="10"
maxWait="5000"/>
<Resource driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost/bookDb"
username="root"
password="1234"
name="jdbc/MysqlDB"
type="javax.sql.DataSource"
auth="Container"
maxActive="10"
maxIdle="2"
maxWait="5000"/>
web.xml โ JNDI ์ด๋ฆ ๋งคํ<resource-ref>
<res-ref-name>jdbc/OracleDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<resource-ref>
<res-ref-name>jdbc/MysqlDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
| ์ค์ ํ์ผ | ์ญํ |
|---|---|
context.xml | ์ค์ DB ์ฐ๊ฒฐ ์ ๋ณด (url, ๊ณ์ ๋ฑ) ์ ์ |
web.xml | ํ๋ก์ ํธ ๋ด์์ ์ฐธ์กฐํ ์ด๋ฆ ์ง์ (JNDI ์ด๋ฆ ๋งคํ) |
[GET] /join.do
โ ํ์๊ฐ์
ํผ(jsp) ์ถ๋ ฅ
[POST] /join.do
โ ์ฌ์ฉ์ ์ ๋ณด ์์ง
โ DB ์ ์ฅ(insert into tbl_user)
โ ์ฑ๊ณต ์ โ /login.do ๋ฆฌ๋ค์ด๋ ํธ
โ ์คํจ ์ โ /join.do ๋ค์ ํฌ์๋ฉ
[GET] /login.do
โ ๋ก๊ทธ์ธ ํผ(jsp) ์ถ๋ ฅ
[POST] /login.do
โ ์ฌ์ฉ์ ์ ๋ณด ๊ฒ์ฆ
โ DB์์ username ์กฐํ โ password ๋น๊ต
โ ์ฑ๊ณต ์ ์ธ์
์ ๋ก๊ทธ์ธ ์ ๋ณด ์ ์ฅ
โ /main.do ๋ฆฌ๋ค์ด๋ ํธ
โ ์คํจ ์ โ /login.do ๋ค์ ํฌ์๋ฉ
HttpSession session = req.getSession();
session.setAttribute("username", username);
session.setAttribute("role", dbUser.getRole());
context.xml, web.xml ์ค์ ์ ๋ช
ํํ ๊ตฌ๋ถํ์ฌ ์ ์ฉServlet + DTO + DBUtils + JSP๋ฅผ ํตํด ํ์๊ฐ์
/๋ก๊ทธ์ธ ์ ์ฒด ํ๋ฆ์ ๊ตฌํ์ด๋ฒ ์ค์ต์ ํตํด JNDI Resource ๊ธฐ๋ฐ์ DB ์ฐ๊ฒฐ๊ณผ ์ฌ์ฉ์ ์ธ์ฆ ํ๋ฆ์ ์ฒ์๋ถํฐ ๋๊น์ง ๊ตฌํํด๋ณด๋ฉฐ,
Java ์น ์ ํ๋ฆฌ์ผ์ด์
์์ ๋ฆฌ์์ค๋ฅผ ์์ ํ๊ณ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ตํ ์ ์์๋ค.
๋ค์์๋ ํํฐ(Filter), ์ธํฐ์
ํฐ, ๊ถํ ๋ถ๊ธฐ ์ฒ๋ฆฌ ๋ฑ์ ์ ์ฉํด๋ณด๋ฉฐ ๋ณด์ ์ฒ๋ฆฌ ํ๋ฆ์ ์ฌํ ํ์ตํ ๊ณํ์ด๋ค.