๐Ÿ“Œ Servlet + JNDI Resource ๊ธฐ๋ฐ˜ DB ์—ฐ๋™ ํšŒ์›๊ฐ€์ž…/๋กœ๊ทธ์ธ ๊ตฌํ˜„

My Pale Blue Dotยท2025๋…„ 4์›” 11์ผ

JSP/SERVLET

๋ชฉ๋ก ๋ณด๊ธฐ
21/25
post-thumbnail

๐Ÿ“… ๋‚ ์งœ

2025-04-11

๐Ÿ“ ํ•™์Šต ๋‚ด์šฉ

์ด๋ฒˆ ์‹ค์Šต์—์„œ๋Š” JNDI ๊ธฐ๋ฐ˜ Resource ์„ค์ •์„ ํ†ตํ•ด
Oracle/MySQL DB์™€ ์ปค๋„ฅ์…˜ํ’€(Connection Pool)์„ ์—ฐ๋™ํ•˜๊ณ ,
ํšŒ์›๊ฐ€์ž… ๋ฐ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.
์ด๋ฅผ ํ†ตํ•ด Servlet + DB ์—ฐ๋™ + ์ธ์ฆ ํ๋ฆ„์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•™์Šตํ–ˆ๋‹ค.


โ˜๏ธ JNDI์™€ Resource๋ž€?

๐Ÿ”ท JNDI (Java Naming and Directory Interface)

  • JNDI๋Š” Java์—์„œ ์ด๋ฆ„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ์ฒด(๋ฆฌ์†Œ์Šค)๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” API
  • ํ”ํžˆ ๋งํ•˜๋Š” lookup("java:/comp/env/...") ๋ฐฉ์‹์€ JNDI์˜ ์ผ์ข…
  • ํ†ฐ์บฃ์ด๋‚˜ WAS์— ๋ฏธ๋ฆฌ ๋“ฑ๋กํ•ด๋‘” ์ž์›(DB ์—ฐ๊ฒฐ, ํ™˜๊ฒฝ๊ฐ’ ๋“ฑ)์„ ์ฝ”๋“œ์—์„œ ์ง์ ‘ new๋กœ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์ฐธ์กฐ ๊ฐ€๋Šฅ

์ฆ‰, JNDI๋Š” ์„ค์ • ์ •๋ณด์™€ ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌ์‹œ์ผœ์ฃผ๋ฉฐ,
์ž์›(๋ฆฌ์†Œ์Šค)์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์—ฌ์ค€๋‹ค.


๐Ÿ”ท Resource (์ž์›)

  • ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ž์›์ด๋ž€ ์ฃผ๋กœ DB ์—ฐ๊ฒฐ ์ •๋ณด, ์™ธ๋ถ€ ์„œ๋ฒ„ ์—ฐ๊ฒฐ ์„ค์ • ๋“ฑ์„ ์˜๋ฏธ
  • ์ด ์ž์›๋“ค์„ context.xml์— ์ •์˜ํ•ด๋‘๊ณ , JNDI๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•˜๋Š” ๊ตฌ์กฐ

์‰ฝ๊ฒŒ ๋งํ•ด, context.xml์—์„œ ์ž์›์„ ๋ฏธ๋ฆฌ ์ •์˜ํ•ด๋‘๊ณ ,
์ฝ”๋“œ์—์„œ๋Š” ์ด๋ฆ„๋งŒ ์•Œ์•„์„œ JNDI lookup()์œผ๋กœ ๊ฐ€์ ธ์™€ ์“ฐ๋Š” ๋ฐฉ์‹์ด๋‹ค.


๐Ÿงฉ ์‹ค์Šต ํ๋ฆ„๊ณผ ์—ฐ๊ฒฐ

  • context.xml์—์„œ DB ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ๋ฏธ๋ฆฌ Resource๋กœ ๋“ฑ๋ก
  • web.xml์—์„œ Resource ์ด๋ฆ„์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์— ๋…ธ์ถœ (JNDI ์ฐธ์กฐ๋ช… ๋“ฑ๋ก)
  • DBUtils.java ํด๋ž˜์Šค์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด lookup
Context 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์— ๋”ฐ๋กœ ๊ด€๋ฆฌ)
์ปค๋„ฅ์…˜ ๋งค๋ฒˆ ์ƒ์„ฑ/์ข…๋ฃŒ์ปค๋„ฅ์…˜ ํ’€ ํ™œ์šฉ (์„ฑ๋Šฅ ํ–ฅ์ƒ)
๋ณด์•ˆ ์œ„ํ—˜ (๊ณ„์ • ๋…ธ์ถœ)์„ค์ •ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ณด์•ˆ ๊ฐ•ํ™”
์œ ์ง€๋ณด์ˆ˜ ๋ถˆํŽธํ™˜๊ฒฝ๋งŒ ๋ฐ”๊พธ๋ฉด ์ฝ”๋“œ ์ˆ˜์ • ็„ก

1๏ธโƒฃ ํ”„๋กœ์ ํŠธ ๊ฐœ์š” ๋ฐ ๊ตฌ์„ฑ

๊ธฐ๋Šฅ์„ค๋ช…
ํšŒ์›๊ฐ€์ž…์‚ฌ์šฉ์ž ์ •๋ณด ์ž…๋ ฅ ํ›„ DB์— ์ €์žฅ (/join.do)
๋กœ๊ทธ์ธDB์˜ ์‚ฌ์šฉ์ž ์ •๋ณด์™€ ๋งค์นญํ•˜์—ฌ ์ธ์ฆ (/login.do)
๋ฉ”์ธ ํŽ˜์ด์ง€๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ ์ง„์ž… (/main.do)

๐Ÿ“‚ ์ฃผ์š” ํŒŒ์ผ ๊ตฌ์กฐ ์š”์•ฝ

๐Ÿ”น Servlet ํด๋ž˜์Šค

ํŒŒ์ผ๋ช…์—ญํ• 
Home.java/index.do, /main.do ์ฒ˜๋ฆฌ
Join.javaGET: ํšŒ์›๊ฐ€์ž… ํผ, POST: ํšŒ์› ์ •๋ณด DB ์ €์žฅ
Login.javaGET: ๋กœ๊ทธ์ธ ํผ, POST: ๋กœ๊ทธ์ธ ์ธ์ฆ + ์„ธ์…˜ ์„ค์ •

๐Ÿ”น DTO ๋ฐ ์œ ํ‹ธ ํด๋ž˜์Šค

ํŒŒ์ผ๋ช…์„ค๋ช…
UserDto.java์‚ฌ์šฉ์ž ์ •๋ณด ๋ชจ๋ธ ํด๋ž˜์Šค (username, password, role)
OracleDBUtils.java / MysqlDbUtils.javaDataSource(JNDI) ๊ธฐ๋ฐ˜ DB ์—ฐ๊ฒฐ ํด๋ž˜์Šค, ์‹ฑ๊ธ€ํ†ค ๋ฐฉ์‹

๐Ÿ”น JSP ๋ทฐ ํŒŒ์ผ

ํŒŒ์ผ๋ช…๊ฒฝ๋กœ์—ญํ• 
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๋กœ๊ทธ์ธ ํ›„ ๋ฉ”์ธ ํŽ˜์ด์ง€

2๏ธโƒฃ DB ํ…Œ์ด๋ธ” ๊ตฌ์กฐ

ํšŒ์› ์ •๋ณด๋ฅผ ์ €์žฅํ•  ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

CREATE TABLE tbl_user (
    username VARCHAR2(100) PRIMARY KEY,
    password VARCHAR2(100) NOT NULL,
    role     VARCHAR2(50)  DEFAULT 'ROLE_USER'
);

๐Ÿ”— ์œ„ ํ…Œ์ด๋ธ”์€ UserDto ๊ฐ์ฒด์™€ 1:1๋กœ ๋งคํ•‘๋œ๋‹ค.


3๏ธโƒฃ Resource ์„ค์ • (JNDI ๊ธฐ๋ฐ˜ DB ์—ฐ๊ฒฐ)

๐Ÿ”ง 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 ์ด๋ฆ„ ๋งคํ•‘)

4๏ธโƒฃ ์ „์ฒด ํ๋ฆ„ ๊ตฌ์กฐ

๐Ÿงฉ ๊ธฐ๋Šฅ ํ๋ฆ„: join.do

[GET] /join.do
 โ†’ ํšŒ์›๊ฐ€์ž… ํผ(jsp) ์ถœ๋ ฅ

[POST] /join.do
 โ†’ ์‚ฌ์šฉ์ž ์ •๋ณด ์ˆ˜์ง‘
 โ†’ DB ์ €์žฅ(insert into tbl_user)
 โ†’ ์„ฑ๊ณต ์‹œ โ†’ /login.do ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
 โ†’ ์‹คํŒจ ์‹œ โ†’ /join.do ๋‹ค์‹œ ํฌ์›Œ๋”ฉ

๐Ÿงฉ ๊ธฐ๋Šฅ ํ๋ฆ„: login.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());

๐Ÿ”ฅ ์š”์•ฝ

  • JNDI ๊ธฐ๋ฐ˜ ์ปค๋„ฅ์…˜ํ’€ ์„ค์ •์„ ํ†ตํ•ด ํšจ์œจ์ ์œผ๋กœ DB ์—ฐ๊ฒฐ ๊ด€๋ฆฌ
  • context.xml, web.xml ์„ค์ •์„ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ ์šฉ
  • Oracle๊ณผ MySQL ๋ชจ๋‘ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌ์„ฑ
  • Servlet + DTO + DBUtils + JSP๋ฅผ ํ†ตํ•ด ํšŒ์›๊ฐ€์ž…/๋กœ๊ทธ์ธ ์ „์ฒด ํ๋ฆ„์„ ๊ตฌํ˜„
  • ์„ธ์…˜ ๊ธฐ๋ฐ˜ ๋กœ๊ทธ์ธ ์ƒํƒœ ์œ ์ง€, ์‹คํŒจ ์‹œ ํฌ์›Œ๋”ฉ ์ฒ˜๋ฆฌ๋„ ๊ฒฝํ—˜ํ•จ

โœ๏ธ ๋А๋‚€ ์ 

์ด๋ฒˆ ์‹ค์Šต์„ ํ†ตํ•ด JNDI Resource ๊ธฐ๋ฐ˜์˜ DB ์—ฐ๊ฒฐ๊ณผ ์‚ฌ์šฉ์ž ์ธ์ฆ ํ๋ฆ„์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๊ตฌํ˜„ํ•ด๋ณด๋ฉฐ,
Java ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ์•ˆ์ „ํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ตํž ์ˆ˜ ์žˆ์—ˆ๋‹ค.
๋‹ค์Œ์—๋Š” ํ•„ํ„ฐ(Filter), ์ธํ„ฐ์…‰ํ„ฐ, ๊ถŒํ•œ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ ๋“ฑ์„ ์ ์šฉํ•ด๋ณด๋ฉฐ ๋ณด์•ˆ ์ฒ˜๋ฆฌ ํ๋ฆ„์„ ์‹ฌํ™” ํ•™์Šตํ•  ๊ณ„ํš์ด๋‹ค.


๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ


profile
Here, My Pale Blue.๐ŸŒ

0๊ฐœ์˜ ๋Œ“๊ธ€