Spring + Mybatis에서 의존성 주입 시 this.mybatis = null 이 발생합니다. 도와주세요 ㅠㅠ.
조회수 918회
Mybatis - Spring 연동 중 오류가 발생해서 문의드립니다. getUser를 통해서 select문을 mybatis로 연동해서 수행하려고 합니다. 하지만 실행 시, this.mybatis is null이 발생합니다. 의존성 주입이 안되요 ㅠ.ㅜ 코드는 관련있어 보이는 코드들을 적어보았습니다. (JDK 1.8, Tomcat 9.0v, Spring 5.2.16.RELEASE)
프로젝트 구조
데이터 접근 객체(UserDAO.java)
package sch.spring.user;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository("userDAO")
public class UserDAO {
@Autowired
private SqlSessionTemplate mybatis; // 주입이 안되는 이유가 뭘까...
public UserVO getUser(UserVO vo) {
System.out.println("Mybatis로 getUser() 기능 처리");
// 이 부분에서NullPointerException 발생합니다.
return (UserVO) mybatis.selectOne("UserDAO.getUser", vo);
}
}
Maven(pom.xml)
<!-- Spring JDBC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.16.RELEASE</version>
</dependency>
<!-- Mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- Mybatis Spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
Mybatis 설정 파일 (sql-map-config.xml)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" >
<configuration>
<!-- Alias 설정 -->
<typeAliases>
<typeAlias alias="user" type="sch.spring.user.UserVO" />
<typeAlias alias="board" type="sch.spring.board.BoardVO" />
</typeAliases>
<!-- Sql Mapper 설정 -->
<mappers>
<mapper resource="mappings/user-mapping.xml" />
<mapper resource="mappings/board-mapping.xml" />
</mappers>
</configuration>
SQL XML 파일(user-mapping.xml)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="UserDAO">
<!-- 유저 조회 -->
<select id="getUser" resultType="user">
<![CDATA[
SELECT * FROM User WHERE id=#{id} AND password=#{password}
]]>
</select>
</mapper>
스프링 설정 파일(ApplicationContext.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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring-1.2.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
<context:component-scan
base-package="sch.spring"></context:component-scan>
<!-- Aspect 어노테이션 -->
<aop:aspectj-autoproxy />
<!-- 예외 처리 관련 어노테이션 -->
<mvc:annotation-driven />
<!-- DataSource에 사용할 Properties 등록 -->
<context:property-placeholder location="classpath:config/db.properties"/>
<!-- Mybatis SqlSessionFactory 등록 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:sql-map-config.xml"/>
</bean>
<!-- SqlSession 객체 등록 -->
<bean class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
<!-- DataSource 등록 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 트랜잭션 1. 네임 스페이스 등록 -->
<!-- 2. 트랜잭션 관리자 등록 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 3. 트랜잭션 어드바이스 설정 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/> <!-- get으로 시작하는 메서드는 제외 -->
<tx:method name="*"/> <!-- 모든 메서드에 트랜잭션 적용 -->
</tx:attributes>
</tx:advice>
<!-- 4. 트랜잭션 aop 설정 -->
<aop:config>
<aop:pointcut id="txPointcut" expression="execution(* sch.spring..*(..))"/>
<aop:advisor pointcut-ref="txPointcut" advice-ref="txAdvice"/>
</aop:config>
<!-- 파일 업로드 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="100000" />
</bean>
</beans>
댓글 입력