기본적인 Spring legacy프로젝트는 2개의 context가 존재하며, 가장 보편적이다.
1. root-context.xml : DB, 보안 관련 등 공용으로 사용하는 빈 등
2. servlet-context.xml : servlet 관련 빈 등
root-context 하나에 servlet-context가 여러개 붙는 형식도 가능하다. 이유는 root-context의 빈들을 servlet-context의 빈에서 참조할 수 있기 때문이다. root-context가 먼저 생성되기 때문에 반대의 경우는 허용되지 않는다.
*root-context 설정파일의 위치는 web.xml에서 확인할 수 있다.
<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<annotation-driven />
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!-- Database Connection Pool -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>21.1.0.0</version>
</dependency>
<context:property-placeholder location="classpath:datasource.properties"/> // properties 위치 명시
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${datasource.driverClassName}"/>
<property name="url" value="${datasource.url}"/>
<property name="username" value="${datasource.username}"/>
<property name="password" value="${datasource.password}"/>
</bean>
3.datasource.properties 작성
datasource.driverClassName = oracle.jdbc.OracleDriver
datasource.url = jdbc:oracle:thin:@localhost:1521:xe
datasource.username =
datasource.password =
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath*:mapper/**/*-mapper.xml"/>
<property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactoryBean" index="0"/>
</bean>
<settings>
<setting name="jdbcTypeForNull" value="NULL"/> <!-- null데이터 전달시 그대로 null로 대입 -->
<setting name="mapUnderscoreToCamelCase" value="true"/> <!-- 카멜케이스 형식으로 변환해줌 -->
</settings>
<typeAliases>
<!-- <typeAlias type="com.kh.app.student.model.dto.Student" alias="student" 또는/> -->
<package name="com.kh.spring"/> <!-- 하위 클래스를 모두 소문자로 등록해줌 -->
</typeAliases>
5-2. Mapper 인터페이스 방식(Dao 구현 클래스 사용X)
<mybatis-spring:scan base-package="com.kh.**.dao"/>
5-3. Mapper를 사용하지 않는 방식
6-1. 오버라이드 메소드 작성
// setter
@Override
public void setNonNullParameter(PreparedStatement ps, int i, String[] parameter, JdbcType jdbcType)
throws SQLException {
String value = String.join(",", parameter); // C, Java,
ps.setString(i, value);
}
// resultSet 관련 getter
@Override
public String[] getNullableResult(ResultSet rs, String columnName) throws SQLException {
String value = rs.getString(columnName);
return value != null ? value.split(",") : null;
}
@Override
public String[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String value = rs.getString(columnIndex);
return value != null ? value.split(",") : null;
}
// 프로시저 관련 getter
@Override
public String[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
String value = cs.getString(columnIndex);
return value != null ? value.split(",") : null;
}
6-2. mybatis-config.xml에 TypeHandler 등록하기
<typeHandlers>
<!-- <typeHandler handler="com.kh.spring.typehandler.StringArrayTypeHandler"/> 또는 -->
<package name="com.kh.spring.common.typehandler"/>
</typeHandlers>