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>

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)