ํ๊ฒฝ ์ ๋ณด
IntelliJ IDEA 2019.3 Ultimate, Amazon Corretto 11, Tomcat 9, JDBC 4.2, ์์กด์ฑ ๊ด๋ฆฌ ํ๊ฒฝ X
Tomcat ์๋ฒ DataSource ์ค์ ๋ฐฉ๋ฒ (+JNDI)
โ ํฌ์คํธ ์๋จ์๋ DataSource, JNDI์ ์ด๋ก ์ ์ธ ๋ด์ฉ์ด ํฌํจ๋์ด ์์ผ๋ฏ๋ก ๋ฐ๋ก ์ค์ , ์ ์ฉ ๋ฐฉ๋ฒ์ ๋ณด๋ ค๋ฉด ์คํฌ๋กค์ ๋ฐ์ผ๋ก ๋ด๋ ค 'DataSource ์ ์ฉ'๋ถํฐ ๋ณด๋ฉด ๋ฉ๋๋ค.
DataSource๋ JDK 1.4๋ถํฐ ํฌํจ๋ javax.sql ํจํค์ง์ API์ด๋ค. DataSource๋ฅผ ์ด์ฉํ์ฌ Java EE ์๋ฒ(์: ํฐ์บฃ ์๋ฒ)์์ DB ์ปค๋ฅ์ ํ์ ๊ด๋ฆฌํ ์ ์๋ค.
javax.sql ํจํค์ง
javax.sql ํจํค์ง๋ java.sql ํจํค์ง์ ๊ธฐ๋ฅ์ ๋ณด์กฐํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ํ์ฅ ํจํค์ง์ด๋ค.
์๋ฒ ์ชฝ ๋ฐ์ดํฐ ์์ค์ ๋ํ ์ ๊ทผ์ ์ฝ๊ฒ ํ๊ณ ๋ ๋ค์ํ ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ์ ์๋ API๋ฅผ ์ ๊ณตํ๋ค.
JDK 1.4๋ถํฐ ํฌํจ๋์๊ณ Java EE์์ ๊ธฐ๋ณธ ํจํค์ง๋ก ์ ์๋์ด ์๋ค.
๐ javax.sql ํจํค์ง ์ฃผ์ ๊ธฐ๋ฅ
โ DriverManager๋ฅผ ๋์ฒดํ ์ ์๋ DataSource ์ธํฐํ์ด์ค ์ ๊ณต
โ Connection, Statement ๊ฐ์ฒด์ Pooling
โ ๋ถ์ฐ ํธ๋์ญ์ ๊ด๋ฆฌ
โ Rowsets ์ง์
DataSource
DataSource๋ DriverManager๋ฅผ ํตํด DB ์ปค๋ฅ์ ์ ์ป๋ ๊ฒ ๋ณด๋ค ๋ ์ข์ ๊ธฐ๋ฒ์ ์ ๊ณตํ๋ค.
โ ์ฒซ์งธ, DataSource๋ ์๋ฒ์์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ DB๋ JDBC ๋๋ผ์ด๋ฒ๊ฐ ๋ณ๊ฒฝ์ด ์์ํ๋ค.
DriverManager๋ฅผ ์ฌ์ฉํ๋ฉด ์น ์ดํ๋ฆฌ์ผ์ด์ ์์ ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ DB ์ ์ ์ ๋ณด๋ JDBC ๋๋ผ์ด๋ฒ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฝ๋๋ ๋ณ๊ฒฝํด์ผํ๊ธฐ ๋๋ฌธ์ด๋ค.
โ ๋์งธ, Connection, Statement ๊ฐ์ฒด๋ฅผ poolingํ ์ ์์ผ๋ฉฐ ๋ถ์ฐ ํธ๋์ญ์ ์ ๋ค๋ฃฐ ์ ์๋ค. ์ฆ DataSource๋ ์์ฒด์ ์ผ๋ก Connection Pool ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค. DriverManager๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ Connection Pool ๊ธฐ๋ฅ์ ๋ณ๋๋ก ๊ฐ๋ฐํ๊ณ ๊ด๋ฆฌํด์ผํ๋ค.
๐ DataSource์ Connection
DataSource๊ฐ ๋ฐํํ๋ Connection ๊ฐ์ฒด๋ DriverManager์ Connection ๊ฐ์ฒด๋ฅผ ํ๋ฒ ๋ ๊ฐ์ผ ํํ์ด๋ค.
DAO๊ฐ DataSource์๊ฒ Connection์ ๋ฌ๋ผ๊ณ ์์ฒญํ๋ฉด DataSource๋ Connection ๋ํ ๊ฐ์ฒด(Proxy Object)๋ฅผ ๋ฐํํ๋ค. Apache DBCP ์ปดํฌ๋ํธ์ ๊ฒฝ์ฐ ๋ํ ๊ฐ์ฒด์ธ PoolableConnection์ ๋ฐํํ๋ค.
PoolableConnection ๊ฐ์ฒด๋ Connection ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์์ผ๋ฉฐ ์ค์ Connection์ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ ๋ณ์(_conn)์ connection pool์ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ ๋ณ์(_pool)๊ฐ ๋ค์ด์๋ค. ๊ทธ๋์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด PoolableConnection์ด ์ง์ ์ฒ๋ฆฌํ๋๊ฒ ์๋๋ผ ์ค์ Connection์๊ฒ ์ฒ๋ฆฌ๋ฅผ ์์ํ๋ค.
๋ฐ๋ผ์ DataSource๊ฐ ๋ฐํํ Connection ๊ฐ์ฒด์ close()๋ฅผ ํธ์ถํ๋ฉด PoolableConnection์ ์ค์ Connection ๊ฐ์ฒด๋ฅผ connection pool์ ๋ฐํํ๋ค. ์ฆ ์ค์ ๋ก Connection ๊ฐ์ฒด๊ฐ ๋ซํ๋๊ฒ ์๋๋ผ ์ฌ์ฌ์ฉํ ์ ์๋๋ก pool์ ๋ฐ๋ฉ๋๋ ๊ฒ์ด๋ค.
JNDI(Java Naming and Directory Interface API)
๋๋ ํฐ๋ฆฌ ์๋น์ค์ ์ ๊ทผํ๋๋ฐ ์ฌ์ฉํ๋ API
์ดํ๋ฆฌ์ผ์ด์
์ JNDI๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ์ resource๋ฅผ ์ฐพ๋๋ค.
ํนํ JDBC resource๋ฅผ data source๋ผ๊ณ ๋ถ๋ฅธ๋ค.
Resource๋ฅผ ์๋ฒ์ ๋ฑ๋กํ ๋ ๊ณ ์ ํ JNDI ์ด๋ฆ์ ๋ถ์ด๋๋ฐ, JNDI ์ด๋ฆ์ ๋๋ ํฐ๋ฆฌ ๊ฒฝ๋ก ํํ๋ฅผ ๊ฐ์ง๋ค.
์๋ฅผ ๋ค์ด data source์ JNDI ์ด๋ฆ์ 'jdbc/mydb' ํ์์ผ๋ก ์ง๋๋ค.
๋ค์์ Java EE ์๋ฒ์์ ์์์ ์ฐพ์๋์ ๊ธฐ๋ณธ JNDI ์ด๋ฆ์ด๋ค.
JNDI ์ด๋ฆ | ์ค๋ช |
java:comp/env | ์์ฉ ํ๋ก๊ทธ๋จ ํ๊ฒฝ ํญ๋ชฉ |
java:comp/env/jdbc | JDBC Data Source |
java:comp/ejb | EJB ์ปดํฌ๋ํธ |
java:comp/UserTransaction | UserTransaction ๊ฐ์ฒด |
java:comp/env/mail | JavaMail ์ฐ๊ฒฐ ๊ฐ์ฒด |
java:comp/env/url | URL ์ ๋ณด |
java:comp/env/jms | JMS ์ฐ๊ฒฐ ๊ฐ์ฒด |
๋ฐ๋ผ์ ์๋ฒ์์ 'jdbc/mydb'๋ผ๋ data source๋ฅผ ์ฐพ์ผ๋ ค๋ฉด 'java:comp/env/jdbc/mydb'๋ผ๋ JNDI ์ด๋ฆ์ผ๋ก ์ฐพ์์ผ ํ๋ค. ์ฆ lookup() ๋ฉ์๋์ 'java:comp/env/jdbc/mydb'๋ฅผ ์ธ์๊ฐ์ผ๋ก ๋๊ธด๋ค.
lookup() ๋ฉ์๋๋ InitialContext ํด๋์ค์ ๋ฉ์๋๋ก JNDI ์ธํฐํ์ด์ค๋ฅผ ํตํด ์๋ฒ์ ๋ฑ๋ก๋ ๊ฐ์ฒด๋ฅผ ์ฐพ๋๋ค.
DataSource ์ ์ฉ
1. DataSource ๊ตฌํ์ฒด ์ค๋น
JDBC๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด JDBC ๊ตฌํ์ฒด = JDBC ๋๋ผ์ด๋ฒ๊ฐ ํ์ํ๋ฏ์ด DataSource๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด javax.sql ํจํค์ง ๊ตฌํ์ฒด๊ฐ ํ์ํ๋ค.
http://commons.apache.org/ ์ ์ ์ํ๋ค.
'Components' ํด๋ฆญ
'DBCP' ํด๋ฆญ
'Downloads' ํด๋ฆญ
'commons-dbcp2-2.7.0-bin.zip'์ ํด๋ฆญํ์ฌ ๋ค์ด๋ก๋๋ฐ๋๋ค.
commons-dbcp2-2.7.0-bin
commons-dbcp2-2.7.0.jar ํ์ผ์ ํ๋ก์ ํธ lib ๋๋ ํ ๋ฆฌ์ ๋ณต์ฌํด๋๋ค.
DBCP ์ปดํฌ๋ํธ๋ ๋ด๋ถ์ ์ผ๋ก Pool, Logging ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํด๋น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค์ด๋ก๋ ๋ฐ์์ผ ํ๋ค.
DBCP๋ฅผ ๋ค์ด๋ฐ์ ๊ฒ๊ณผ ๋์ผํ๊ฒ Apache Commons ์ฌ์ดํธ์ Components ๋ชฉ๋ก์์ Logging, Pool ๋งํฌ๋ฅผ ํด๋ฆญํด์ ๋ค์ด๋ก๋ ๋ฐ๋๋ค.
commons-pool2-2.8.0
commons-logging-1.2
Pool, Logging jarํ์ผ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ํ๋ก์ ํธ lib ๋๋ ํ ๋ฆฌ์ ๋ณต์ฌํด๋๋ค.
์ด๋ ๊ฒ ์ด 3๊ฐ์ jarํ์ผ - commons-dbcp.jar, commons-pool.jar, commons-logging.jar ์ ์ค๋นํด ๋๋ค.
Project Structure - Dependencies์ ๋ค์ด๋ฐ์ jarํ์ผ์ ์ถ๊ฐํด์ค๋ค.
2. ํฐ์บฃ ์๋ฒ์ DataSource ์ค์
๋ค์์ ํฐ์บฃ ์คํ ํ๊ฒฝ์์ DataSource๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์๋ฒ์ ๋ฐ๋ผ ์ค์ ๋ฐฉ๋ฒ์ด ๋ค๋ฅด๋ ๋ค๋ฅธ ์๋ฒ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ํด๋น ์ ํ์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์.
ํ๋ก์ ํธ(๋ชจ๋)์ context.xml์ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ๋ค.
ํ๋ก์ ํธ๋ณ context descriptor ํ์ผ์ ์ถ๊ฐํ์ง ์์์ ๊ฒฝ์ฐ ์ด ํฌ์คํธ๋ฅผ ์ฐธ๊ณ ํด์ ์ถ๊ฐํ๋ค.
context.xml
1
2
3
4
5
6
7
8
9
10
|
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/">
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource name="jdbc/knou" auth="Container" type="javax.sql.DataSource"
maxActive="10" maxIdle="3" maxWait="10000"
username="butterfield" password="1234"
driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3307/knou"
closeMethod="close" />
</Context>
|
cs |
๐ context.xml
Tomcat์ Web application container๋ฅผ ์ ์ฌํ ๋, context๋ฅผ ์ฐธ๊ณ ํ๋ค. ์ผ๋ฐ์ ์ผ๋ก Tomcat์ context.xml์ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ์ฐพ์์ Web application container์ ์ ์ฉํ๋ค.
โ server.xml <Context.xml> ์ฐธ์กฐ - ๊ถ์ฅํ์ง ์์
โก CATALINA_HOME/conf/ENGINE_NAME/HOST_NAME/CONTEXT_PATH.xml ์ฐธ์กฐ
<Host>์ ์์ฑ์ xmlBase ๊ฐ์ด ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ, ์ ์์น์ ํด๋นํ๋ file์ ์ฐธ์กฐํ๊ฒ ๋ฉ๋๋ค. <Engine>์ name์์ฑ์ด “Catalina“, <Host>์ name์์ฑ์ด “localhost”์ด๋ฉด WebApp01์ context ์ค์ file์ ์์น๋ “CATALINA_HOME/conf/Catalina/localhost/WebApp01.xml“์ด ๋๋ค.
โข Web application WAR, directory์ /META-INF/context.xml์ ์ฐธ์กฐํ๋ค.
โฃ CATALINA_HOME/conf/context.xml ์ฐธ์กฐ - ๋ค๋ฅธ context file์ด ์๋ ๊ฒฝ์ฐ
(์ฐธ๊ณ : https://daitso.kbhub.co.kr/61344/)
<WatchedResource> ํ๊ทธ
<WatchedResource>์ ์ค์ ํ file์ ๋ณ๊ฒฝ์ด ์์ ๋ค์ ๋ก๋ํ๋ค.
<Resource> ํ๊ทธ
์ด ํ๊ทธ์ JNDI๊ฐ web.xml์ <resource-ref>์ <resource-env-ref> ์์๋ฅผ ์กฐํ(lookup)ํ ์ ์๊ฒ ๋ฐํํ resource๋ฅผ ์ ์ธํ๋ค.
์์ฑ๋ช | ์ค๋ช |
name | JNDI ์ด๋ฆ Context์ lookup()์ ์ฌ์ฉํ์ฌ ์์์ ์ฐพ์๋ ์ฌ์ฉํ๋ค. java:comp/env ๋๋ ํฐ๋ฆฌ์์ ์ฐพ์ ์ ์๋ค. |
auth | ์์ ๊ด๋ฆฌ์ ์ฃผ์ฒด๋ฅผ ์ง์ ํ๋ค. Application / Container๋ฅผ ์ง์ ํ ์ ์๋ค. |
type | Resource์ ํ์ ์ ํจํค์ง ์ด๋ฆ์ ํฌํจํ ํด๋์ค ์ด๋ฆ(QName)์ ์ง์ ํ๋ค. |
driverClassName | JDBC ๋๋ผ์ด๋ฒ ํด๋์ค์ ์ด๋ฆ ํจํค์ง ์ด๋ฆ์ ํฌํจํ ํด๋์ค ์ด๋ฆ(QName)์ ์ง์ ํ๋ค. |
url | DB ์ปค๋ฅ์ URL |
username | DB ์ฌ์ฉ์ ์ด๋ฆ |
password | DB ์ํธ |
maxActive | DataSource๋ก๋ถํฐ ๊บผ๋ผ ์ ์๋ ์ปค๋ฅ์
์ต๋ ๊ฐ์ ๊ธฐ๋ณธ๊ฐ : 8๊ฐ |
maxIdle | DataSource์์ ์ ์งํ ์ ์๋ ์ฌ์ฉ๋์ง ์๋ ์ปค๋ฅ์
์ ์ต๋ ๊ฐ์ ์ต๋ ์ ์ง ๊ฐ์๋ฅผ ๋์ด์ ๋ฐ๋ฉ๋๋ ์ปค๋ฅ์ ์ close๋๋ค. ๊ธฐ๋ณธ๊ฐ : 8๊ฐ |
maxWait | ๋ฐ๊ธํ ์ปค๋ฅ์
์๊ฐ ์ต๋๊ฐ์ธ ์ํ์์ ์ถ๊ฐ๋ก ์ปค๋ฅ์
๋ฐ๊ธ ์์ฒญ์ด ๋ค์ด์์๋ ์ปค๋ฅ์
์ ์ค๋นํ๊ธฐ ์ํด ๋ฐ๋ฉ์ ๊ธฐ๋ค๋ฆฌ๋ ์ต๋ ๋ฐ๋ฆฌ์ด ์ต๋ ๋ฐ๋ฆฌ์ด๊ฐ ์ง๋ ๋๊น์ง ๋ฐ๋ฉ๋๋ ์ปค๋ฅ์ ์ด ์์ผ๋ฉด Exception์ ๋์ง๋ค. ๊ธฐ๋ณธ๊ฐ : -1 (์ปค๋ฅ์ ๋ฐ๋ฉํ ๋๊น์ง ๊ธฐ๋ค๋ฆผ) |
closeMethod | ํฐ์บฃ ์๋ฒ๊ฐ ์ข
๋ฃ๋ ๋ ์์์ ํด์ ํ๊ธฐ ์ํด ํธ์ถํ๋ ๋ฉ์๋๋ช
๋งค๊ฐ๋ณ์๊ฐ ์์ด์ผ ํ๋ค. ํฐ์บฃ ์๋ฒ๋ ๋ด๋ถ์ ์ผ๋ก DataSource๋ฅผ ์์ฑํ ๋ ์ํ์น DBCP์ BasicDataSource ๊ตฌํ์ฒด๋ฅผ ์ฌ์ฉํ๋ฉฐ BasicDataSource์ ์์ ํด์ ๋ฉ์๋๋ close()์ด๋ค. |
3. web.xml ์ค์
context.xml์ ์ ์ธํ DataSource๋ฅผ ์น ์ดํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ๋ ค๋ฉด web.xml์ ํด๋น resource๋ฅผ ์ฐธ์กฐํ๋ค๋ ์ ์ธ์ ํด์ผํ๋ค.
web.xml์ <web-app> ํ๊ทธ ์์ ๋ค์ ํญ๋ชฉ์ ์ถ๊ฐํ๋ค.
web.xml
1
2
3
4
5
6
|
<!-- ์๋ฒ ์์ ์ฐธ์กฐ ์ ์ธ -->
<resource-ref>
<res-ref-name>jdbc/knou</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
|
cs |
๊ฐ ํ๊ทธ๋ ๋ค์์ ์๋ฏธํ๋ค.
ํ๊ทธ | ์ค๋ช |
<res-ref-name> | JNDI ์ด๋ฆ context.xml์ ์ ์ธํ resource์ ์ด๋ฆ์ ์ง์ ํ๋ค. |
<res-type> | ํฐ์บฃ ์๋ฒ์์ ๋ฆฌํดํ๋ resource์ ํด๋์ค ์ด๋ฆ(ํจํค์ง๋ช
ํฌํจ) context.xml์ ์ ์ธํ type๊ณผ ๊ฐ์์ผ ํ๋ค. |
<res-auth> | ์์ ๊ด๋ฆฌ ์ฃผ์ฒด Container : ์๋ฒ์์ ๊ด๋ฆฌํจ์ ์๋ฏธ |
4. InitialContext ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ DataSource ์ป๊ธฐ
์๋์ ๊ฐ์ด data source๋ฅผ ์ป์ ์ ์๋ค.
์ ์ธํ data source๋ฅผ ์ป๊ธฐ ์ํด InitialContext ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ lookup() ๋ฉ์๋์ JNDI ์ด๋ฆ "java:comp/env/jdbc/knou" ๋ฅผ ๋๊ฒจ ํด๋นํ๋ resource๋ฅผ ๋ฐํ๋ฐ๋๋ค.
1
2
3
4
5
6
7
8
|
// ํฐ์บฃ ์๋ฒ์์ ์์์ ์ฐพ๊ธฐ ์ํด InitialContext ์ธ์คํด์ค ์์ฑ
InitialContext initialContext = new InitialContext();
// lookup() ๋ฉ์๋๋ก JNDI ์ด๋ฆ์ผ๋ก ๋ฑ๋ก๋ผ์๋ ์๋ฒ ์์ ์ฐพ์
// @name : ์๋ฒ ์์์ JNDI ์ด๋ฆ
// ์ฐพ์ผ๋ ค๋ ์์์ด JDBC DataSource์ด๋ฏ๋ก java:comp/env...
DataSource ds = (DataSource) initialContext.lookup(
"java:comp/env/jdbc/knou"
);
|
cs |
References
์ดํ๊ฐ์ ์๋ฐ ์น ๊ฐ๋ฐ ์ํฌ๋ถ(ํ๋ฆฌ๋ , 2016, ์์ง์)
'Javaยท๏ปฟServletยท๏ปฟJSP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JAVA ์น ํ๋ก์ ํธ์์ Properties ํ์ผ ํ์ฉํ๊ธฐ (0) | 2020.02.20 |
---|---|
๋ฆฌํ๋์ API๋ฅผ ์ด์ฉํ Front Controller ์๋ํ (0) | 2020.02.20 |
ServletContextListener๋ก DB ์ปค๋ฅ์ , DAO ๊ณต์ ๊ฐ์ฒด ๊ด๋ฆฌํ๊ธฐ (0) | 2020.02.15 |
[IntelliJ] ํ์๊ฐ์ ์์ (MVC) - (7) DAO ๋ถ๋ฆฌํ๊ธฐ (0) | 2020.02.15 |
[JSP] JSTL ํ์ฉ ๋ฐฉ๋ฒ - JSP์์ ์๋ฐ ์ฝ๋ ์ ๊ฑฐ (0) | 2020.02.15 |
๋๊ธ