Coding Planet
Spring root-context.xml ๋ฏ์ด๋ณด๊ธฐ ๋ณธ๋ฌธ
๋ฐ์ํ
1. root-context.xml
- web.xml ํ์ผ์์ ๊ฐ์ฅ ๋จผ์ ์ฝ์ด๋ค์ด๋ ์ค์ ํ์ผ
- ํ๋ก์ ํธ ์ ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์์์ ์์ฑํ๊ณ ์ค์ ํ๋ ํ์ผ
- DB ์ฐ๊ฒฐ ๊ด๋ จ ์ ๋ณด, ํธ๋์ญ์ ์ฒ๋ฆฌ, ํ์ผ ์ ๋ก๋ ๋ฑ์ ์์ฑํ๋ค.
- Spring ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ๋ ์คํ๋ง์์ ์ ๊ณตํ๋ ์ปจํ ์ด๋๋ก, ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ํ์ํ ๊ณณ์์ DI(Dependency Injection)๋ก ์ฃผ์ ํ ์ ์๋ค. Spring ์ ํ๋ฆฌ์ผ์ด์ ์ปจํ ์คํธ๋ ์คํ๋ง์ ํต์ฌ์ ์ธ ๊ธฐ๋ฅ ์ค ํ๋์ด๋ค. ์ด๋ฌํ ์ปจํ ์คํธ๋ฅผ ์ค์ ํ๋๋ฐ ์ฌ์ฉ๋๋ ํ์ผ์ root-context.xml, servlet-context, applicationContext.xml ๋ฑ์ด ์๋ค.
- ์ด ์ค root-context.xmlํ์ผ์ ์ฃผ๋ก ์ ์ญ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ค์ ์ ๋ณด๋ฅผ ์ ์ํ๊ณ servlet-context.xml ํ์ผ์ ๊ฐ๊ฐ์ ์๋ธ๋ฆฟ์ ๋ํ ์ค์ ์ ๋ณด๋ฅผ ์ ์ํ๋ค.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<!-- 1.DBCP ์ฌ์ฉ์ ์ํ DataSource๋ฅผ bean ๋ฑ๋ก -->
<!-- DataSource: java์์ Connection pool์ ์ง์ํ๊ธฐ ์ํ ์ธํฐํ์ด์ค(์ปค๋ฅ์
์ ์์๋ฒ์ ) -->
<!-- destroy-method="close" : ์ฃผ์ด์ง ์ธ์
์ ์๋์ผ๋ก ๋ฐํํ๋ ์ค์ -->
<bean id="realDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
<property name="username" value="community"/>
<property name="password" value="1234"/>
<!-- SQL์ด ์ํ๋ ํ ์๋์ผ๋ก Commit ๋๋๊ฒ์ ์ง์ -->
<property name="defaultAutoCommit" value="false"/>
<!-- ์ปค๋ฅ์
ํ ์ค์ -->
<property name="initialSize" value="10" /> <!-- ์ด๊ธฐ ์ปค๋ฅ์
์, ๊ธฐ๋ณธ 0 -->
<property name="maxTotal" value="50" /> <!-- ์ต๋ ์ปค๋ฅ์
์, ๊ธฐ๋ณธ 8 -->
<property name="maxIdle" value="20" /> <!-- ์ ํด ์ํ๋ก ์กด์ฌํ ์ ์๋ ์ปค๋ฅ์
์ต๋ ์, ๊ธฐ๋ณธ 8 -->
<property name="minIdle" value="10" /> <!-- ์ ํด ์ํ๋ก ์กด์ฌํ ์ ์๋ ์ปค๋ฅ์
์ต์ ์, ๊ธฐ๋ณธ 0 -->
<property name="maxWaitMillis" value="-1" /> <!-- ์์ธ ๋ฐ์ ์ ์ปค๋ฅ์
์ด ๋ฐํ ๋ ๋ ๊น์ง ๋๊ธฐํ๋ ์ต๋ ์๊ฐ(ms), ๊ธฐ๋ณธ -1(๋ฌด๊ธฐํ) -->
</bean>
<!--
log4j๋ฅผ ์ด์ฉํ SQL ๋ก๊ทธ ์ถ๋ ฅ์ฉ bean ์์ฑ
* realDataSource๋ฅผ ์ด์ฉํด์ SQL ์ํ ๋ด์ฉ, ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ์ญํ
-> realDataSource๋ฅผ ๋์ฒดํ๋ ์ญํ
-->
<bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">
<constructor-arg ref="realDataSource" />
<property name="logFormatter">
<bean class="net.sf.log4jdbc.tools.Log4JdbcCustomFormatter">
<property name="loggingType" value="MULTI_LINE"/>
<property name="sqlPrefix" value="[SQL]" />
</bean>
</property>
</bean>
<!-- Mybatis ๊ด๋ จ Bean ์์ฑ -->
<!-- SqlSession : sql๊ตฌ๋ฌธ์ DB์ ์ ๋ฌ, ์คํํ๋ ๊ฐ์ฒด
SqlSessionFactory : SqlSession์ ๋ง๋๋ ๊ฐ์ฒด
sqlSessionFactoryBean : mybatis ์ค์ ํ์ผ(mybatis-config.xml)๊ณผ Connection Pool ์ ๋ณด๋ฅผ ์ด์ฉํ์ฌ SqlSessionFactory๋ฅผ ๋ง๋๋ ๊ฐ์ฒด
sqlSessionTemplate : SqlSession ๊ฐ์ฒด์ ํธ๋์ญ์
์ฒ๋ฆฌ ์ญํ ์ด ๊ฐ๋ฅํ๋๋ก ํ๋ ๊ฐ์ฒด -->
<!-- ๋ง์ด๋ฐํฐ์ค SqlSession ๋ฑ๋กํ๊ธฐ (xml ๋ฐฉ์์ผ๋ก bean ๋ฑ๋ก) -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- mybatis-config.xml ์ค์ ๋ถ๋ฌ์ค๊ธฐ -->
<property name="configLocation" value="classpath:mybatis-config.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
<!-- SqlSessionTemplate : ๊ธฐ๋ณธ SQL ์คํ + ํธ๋์ญ์
๊ด๋ฆฌ ์ญํ ์ ํ๋ SqlSession์ ์์ฑํ ์ ์๊ฒ ํ๋ ๊ฐ์ฒด(Spring bean์ผ๋ก ๋ฑ๋กํด์ผํจ.) -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactoryBean" />
</bean>
<!-- ์คํ๋ง์์ ์ฌ์ฉํ๋ proxy๋ฅผ ์ด์ฉํ ํธ๋์ญ์
์ ์ด๊ฐ ์๋ ๊ฒฝ์ฐ ์ถ๊ฐ์ ์ธ ํธ๋์ญ์
๋งค๋์ ๋ฅผ ์ถ๊ฐํด์ ๋ฌธ์ ํด๊ฒฐ -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- <tx:annotation-driven proxy-target-class="true"/> -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!--
ํ์ผ ์
๋ก๋๋ฅผ ์ํ MutipartResolver ๊ตฌํ์ฒด CommonsMultipartResolver bean ๋ฑ๋ก
-> CommonsMultipartResolver๋ฅผ bean์ผ๋ก ๋ฑ๋กํ๋ฉด
multipart/form-data ํ์์ผ๋ก ์์ฒญ ์ input type="file" ํ๊ทธ๋ฅผ ์๋์ ์ผ๋ก ์ธ์ํ์ฌ MultipartFile ๊ฐ์ฒด๋ก ๋ฐํํ๊ณ
ํ์ผ ์ธ์ ๋ฐ์ดํฐ(์ ์, ๋ฌธ์์ด ๋ฑ์ ํ
์คํธ ๋ฐ์ดํฐ)๋ ๊ธฐ์กด์ฒ๋ผ ์ฌ์ฉ ๊ฐ๋ฅ(MultipartRequest ํ์ ์์)
-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="104857600"/>
<property name="maxUploadSizePerFile" value="104857600"/>
<property name="maxInMemorySize" value="104857600"/>
</bean>
<!--
104857600 byte == 100MB
20971520 byte == 20MB
maxUploadSize
: ํ ์์ฒญ๋น ์
๋ก๋๊ฐ ํ์ฉ๋๋ ์ต๋ ์ฉ๋์ ๋ฐ์ดํธ ๋จ์๋ก ์ค์ .
-1 ์ ์ ํ์ด ์๋ค๋ ๋ป์ผ๋ก ์ด ํ๋กํผํฐ๋ฅผ ์ง์ ํ์ง ์์๋ ๊ธฐ๋ณธ๊ฐ.
maxUploadSizePerFile
: ํ ํ์ผ๋น ์
๋ก๋๊ฐ ํ์ฉ๋๋ ์ต๋ ์ฉ๋์ ๋ฐ์ดํธ ๋จ์๋ก ์ค์ .
-1 ์ ์ ํ์ด ์๋ค๋ ๋ป์ผ๋ก ์ด ํ๋กํผํฐ๋ฅผ ์ง์ ํ์ง ์์๋ ๊ธฐ๋ณธ๊ฐ.
maxInMemorySize
: ๋์คํฌ์ ์ ์ฅํ์ง ์๊ณ ๋ฉ๋ชจ๋ฆฌ์ ์ ์งํ๋๋ก
ํ์ฉํ๋ ๋ฐ์ดํธ ๋จ์์ ์ต๋ ์ฉ๋์ ์ค์ .
์ฌ์ด์ฆ๊ฐ ์ด๋ณด๋ค ํด ๊ฒฝ์ฐ ์ด ์ฌ์ด์ฆ ์ด์์ ๋ฐ์ดํฐ๋ ํ์ผ์ ์ ์ฅ๋ฉ๋๋ค.
๊ธฐ๋ณธ๊ฐ์ 10240 ๋ฐ์ดํธ.
-->
</beans>
2. root-context.xml ๋ฏ์ด๋ณด๊ธฐ
- Spring ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ ๋น(bean) ๊ฐ์ฒด๋ฅผ ์ ์ํ๋ค.
- ์ ์์์์๋ DataSource / log4j๋ฅผ ์ด์ฉํ SQL ๋ก๊ทธ ์ถ๋ ฅ์ฉ ๊ฐ์ฒด / SqlSessionTemplate ๋ฑ์ ๋น์ผ๋ก ๋ฑ๋กํ๊ณ ์๋ค.
1. DBCP ์ฌ์ฉ์ ์ํ DataSource
- DataSource: java์์ Connection pool์ ์ง์ํ๊ธฐ ์ํ ์ธํฐํ์ด์ค(์ปค๋ฅ์ ์ ์์๋ฒ์ ). ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ฒฐ๋ ์ปค๋ฅ์ ๊ฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๊ณ , ์ปค๋ฅ์ ์ ์์ฑ, ํ๋ง, ํด์ ๋ฑ์ ์ํํ๋ค.
- destroy-method="close" : ์ฃผ์ด์ง ์ธ์ ์ ์๋์ผ๋ก ๋ฐํํ๋ ์ค์
- DBCP๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ๋ํ ๋ถํ๋ฅผ ์ค์ด๊ธฐ ์ํด ์ปค๋ฅ์ ์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋๊ณ ์ฌ์ฉํ๋ ๊ธฐ๋ฒ์ด๋ค. ์ด๋ฅผ ์ฌ์ฉํ๊ธฐ์ํด 'id=realDataSource'๋ฅผ ์ค์ ํ๊ณ ๊ฐ์ฒด๋ฅผ ๋ฑ๋กํ๋ค.
- ์ด๋ ๊ฒ ๋ฑ๋ก๋ DataSource๋ ๋ค๋ฅธ Bean์์ DI(Dependency Injection)์ ํตํด ์ฃผ์ ๋ฐ์ ์ฌ์ฉํ ์ ์๋ค.
2. log4j๋ฅผ ์ด์ฉํ SQL ๋ก๊ทธ ์ถ๋ ฅ์ฉ bean ์์ฑ
- SQL๋ฌธ์ ๋ก๊ทธ ์ถ๋ ฅ์ ์ํ ์ค์ ์ ๋ด๋นํฉ๋๋ค
- Log4jdbcProxyDataSource๋ ์ค์ ๋ก DB์ ์ฐ๊ฒฐ๋ dataSource(realDataSource)๋ฅผ ๋์ ํ์ฌ ์ฌ์ฉ๋๋ฉฐ, ์ด๋ฅผ ํตํด SQL๋ฌธ์ด ์ํ๋ ๋ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ๋ค.
- Log4jdbcCustomFormatter๋ฅผ ํตํด ์ถ๋ ฅํ ๋ก๊ทธ์ ํ์์ ์ ์ํ ์ ์์ผ๋ฉฐ, loggingType์ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ๋ ๋ฐฉ์์ ์ค์ ํ ์ ์๋ค.
- MULTI_LINE์ผ๋ก ์ค์ ํ๋ฉด ์ฌ๋ฌ ์ค๋ก ๋๋์ด์ ์ถ๋ ฅ๋๋ค.
- sqlPrefix๋ ๋ก๊ทธ ์์ ์ถ๋ ฅ๋ ๋ฌธ์์ด์ ์ ์ํ๋ค.
- ์๋๋ ์ถ๋ ฅ ์์
3. ๋ง์ด๋ฐํฐ์ค(MyBatis) ๊ด๋ จ Bean์ ์์ฑ
- ๋ง์ด๋ฐํฐ์ค๋ SQL Mapper ํ๋ ์์ํฌ๋ก, JDBC๋ฅผ ์ฌ์ฉํ๋ ์์ ์ ๋๋ถ๋ถ ์ฒ๋ฆฌํด์ค๋ค.
- SqlSessionFactory: SqlSession์ ๋ง๋๋ ๊ฐ์ฒด๋ก 'mybatis-confing.xml' ์ค์ ํ์ผ๊ณผ Connection pool ์ ๋ณด๋ฅผ ์ด์ฉํ์ฌ SqlSessionFactory๋ฅผ ๋ง๋ค์ด ๋ธ๋ค.
- SQLSessionTemplate : SqlSession์ ์์ฑํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฐ์ฒด๋ก ๊ธฐ๋ณธ SQL ์คํ๊ณผ ํธ๋์ญ์ ๊ณผ๋ฆฌ ์ญํ ์ ํ๋ค.
- transactionManage : ํธ๋์ญ์ ์ฒ๋ฆฌ๋ฅผ ์ํ ๊ฐ์ฒด์ด๋ค.
- ๋ง์ง๋ง์ผ๋ก tx:annotation-driven ํ๊ทธ๋ฅผ ์ด์ฉํด transactionManager๋ฅผ ๋ฑ๋กํ๊ณ ์๋ค. ์ด ํ๊ทธ๋ฅผ ์ด์ฉํ๋ฉด ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ๊ฐํธํ๊ฒ ํธ๋์ญ์ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํด์ง๋ค.
๋ฐ์ํ
'๐ฑSPRING' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring JDBC์ ์ ์์ ํน์ง (2) | 2023.05.18 |
---|---|
Maven์ด๋? POM.XML์์ ์์กด์ฑ ๊ด๋ฆฌ, Maven ์ฌ์ฉํ์ฌ POM.XML์ DI ์ถ๊ฐํ๊ธฐ (0) | 2023.05.18 |
Mybatis-confing.xml ๋ฏ์ด๋ณด๊ธฐ (0) | 2023.05.03 |
MyBatis - ๋์ SQL ๊ตฌํํ๊ธฐ(if / choose / trim/ foreach) (0) | 2023.05.03 |
Spring @RequestMapping์ด๋? ์์ฑ๋ฐฉ๋ฒ, ์์ (0) | 2023.04.25 |
Comments