4/07/2018

스프링에 오라클과 마이바티스 연동

스프링을 설치해서 웹어플리케이션(게시판, 쇼핑몰 등)을 개발할 수 있게되었지만, 데이터 베이스가 없다면 그냥 아무런 기능도 없는, 또는 기능은 있으나 저장할 수 없는 그런 사이트밖에 만들 수 없습니다.

스프링과 오라클, 마이바티스(MyBatis)를 연동하고 하나더 log4jdbc를 추가하겠습니다.

먼저 스프링 상단 메뉴 File → New → Spring Legacy Project로 새로운 프로젝트를 생성합니다.

원하는 프로젝트명을 입력하고, Spring MVC Project를 선택하고 다음(Next)버튼을 클릭합니다.

패키지 이름은 ***.***.*** 같은 방식으로 작성합니다. 저는 com.test.controller로 했습니다.

완료(Finish) 버튼을 클릭하면 새로운 프로젝트가 생성됩니다.

프로젝트 우클릭 → Properties → Project Facets에서 자바 버전을 1.8, 정확히는 설치된 JDK의 버전으로 맞춰줍니다. 프로젝트 내부의 pom.xml 파일을 열고, 하단 탭의 pom.xml을 선택하고 코드를 수정합니다.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.test</groupId>
 <artifactId>controller</artifactId>
 <name>testProject</name>
 <packaging>war</packaging>
 <version>1.0.0-BUILD-SNAPSHOT</version>
 <properties>
 <!-- 스프링 버전 수정 -->
  <java-version>1.8</java-version>
  <org.springframework-version>4.3.8.RELEASE</org.springframework-version>
  <org.aspectj-version>1.6.10</org.aspectj-version>
  <org.slf4j-version>1.6.6</org.slf4j-version>
 </properties>
 
 <!-- 오라클 -->
    <repositories>
        <repository>
               <id>oracle</id>
               <url>http://maven.jahia.org/maven2</url>
          </repository>
    </repositories>
   
   
 <dependencies>
  <!-- Spring -->
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context</artifactId>
   <version>${org.springframework-version}</version>
   <exclusions>
    <!-- Exclude Commons Logging in favor of SLF4j -->
    <exclusion>
     <groupId>commons-logging</groupId>
     <artifactId>commons-logging</artifactId>
     </exclusion>
   </exclusions>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-webmvc</artifactId>
   <version>${org.springframework-version}</version>
  </dependency>
    
  <!-- AspectJ -->
  <dependency>
   <groupId>org.aspectj</groupId>
   <artifactId>aspectjrt</artifactId>
   <version>${org.aspectj-version}</version>
  </dependency> 
  
  <!-- Logging -->
  <dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-api</artifactId>
   <version>${org.slf4j-version}</version>
  </dependency>
  <dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>jcl-over-slf4j</artifactId>
   <version>${org.slf4j-version}</version>
   <scope>runtime</scope>
  </dependency>
  <dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-log4j12</artifactId>
   <version>${org.slf4j-version}</version>
   <scope>runtime</scope>
  </dependency>
  <dependency>
   <groupId>log4j</groupId>
   <artifactId>log4j</artifactId>
   <version>1.2.15</version>
   <exclusions>
    <exclusion>
     <groupId>javax.mail</groupId>
     <artifactId>mail</artifactId>
    </exclusion>
    <exclusion>
     <groupId>javax.jms</groupId>
     <artifactId>jms</artifactId>
    </exclusion>
    <exclusion>
     <groupId>com.sun.jdmk</groupId>
     <artifactId>jmxtools</artifactId>
    </exclusion>
    <exclusion>
     <groupId>com.sun.jmx</groupId>
     <artifactId>jmxri</artifactId>
    </exclusion>
   </exclusions>
   <scope>runtime</scope>
  </dependency>

  <!-- @Inject -->
  <dependency>
   <groupId>javax.inject</groupId>
   <artifactId>javax.inject</artifactId>
   <version>1</version>
  </dependency>
    
  <!-- Servlet -->
  <dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>servlet-api</artifactId>
   <version>2.5</version>
   <scope>provided</scope>
  </dependency>
  <dependency>
   <groupId>javax.servlet.jsp</groupId>
   <artifactId>jsp-api</artifactId>
   <version>2.1</version>
   <scope>provided</scope>
  </dependency>
  <dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>jstl</artifactId>
   <version>1.2</version>
  </dependency>
 
  <!-- Test -->
  <!--
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.7</version>
   <scope>test</scope>
  </dependency>
   -->
  
  <!-- 새로 추가 -->
  
  <!-- 오라클 JDBC 드라이버 -->
        <dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>12.1.0.2</version>
        </dependency>
     
        <!-- spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
     
        <!-- Test --> <!-- 기존 Test는 주석 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version> <!-- <version>4.7</version> -->
            <scope>test</scope>
        </dependency> 
     
        <!-- spring-test -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${org.springframework-version}</version>
            <scope>test</scope>
        </dependency>
     
        <!-- log4jdbc-log4j2-jdbc4 -->
        <dependency>
            <groupId>org.bgee.log4jdbc-log4j2</groupId>
            <artifactId>log4jdbc-log4j2-jdbc4</artifactId>
            <version>1.16</version>
        </dependency>
  
  <!-- org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.1</version>
        </dependency>
      
        <!-- mybatis-spring -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.0</version>
        </dependency>
  
        
 </dependencies>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-eclipse-plugin</artifactId>
                <version>2.9</version>
                <configuration>
                    <additionalProjectnatures>
                        <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
                    </additionalProjectnatures>
                    <additionalBuildcommands>
                        <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
                    </additionalBuildcommands>
                    <downloadSources>true</downloadSources>
                    <downloadJavadocs>true</downloadJavadocs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <compilerArgument>-Xlint:all</compilerArgument>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <configuration>
                    <mainClass>org.test.int1.Main</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

자바 버전과 스프링 버전, JUnit 버전을 수정하였고, 오라클 드라이버와 Spring JDBC, 스프링 Test, log4jdbc, mybatis, mybatis-Spring을 추가하였습니다.

수정이 완료되었으면 Alt + S 키를 눌러 저장하면 스프링 우측 하단에 진행상태가 표시됩니다.

src/main/resources에 log4jdbc.log4j2.properties파일을 생성합니다.

코드를 추가합니다.

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

src → main → webapp → WEB-INF → spring → root-context.xml 파일을 열어서 Namespaces 탭을 선택후 beans, context, jdbc, mybatis-spring을 체크합니다.

Source 탭을 선택해서 코드를 수정합니다.

<?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:jdbc="http://www.springframework.org/schema/jdbc"
 xmlns:mybatis-spring="http://mybatis.org/schema/mybatis-spring"
 xsi:schemaLocation="http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.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-4.3.xsd">
 
 <!-- Root Context: defines shared resources visible to all other web components -->
 
 <!-- 오라클 접속 -->
    <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">
        <property value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy" name="driverClassName"/>
        <property value="jdbc:log4jdbc:oracle:thin:@localhost:1521/XE" name="url"/>
        <property value="kuzuro" name="username"/>
        <property value="1111" name="password"/>
    </bean>
   
    <!-- 마이바티스 연동 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
         <property name="dataSource" ref="dataSource"></property>
         <property name="configLocation" value="classpath:/mybatis-config.xml"></property>
         <property name="mapperLocations" value="classpath:mappers/**/*Mapper.xml"/>
    </bean>
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
        <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
    </bean>
   
</beans>

오라클 부분의 username과 password는 실제로 사용하고있는 계정과 비밀번호를 입력합니다.

src/main/resources에 mybatis-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>
  
</configuration>

src/main/resources에 mappers 폴더를 생성하고, 그 폴더에 testMapper.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="com.test.mappers.testMapper">
   
</mapper>

스프링은 프로젝트내에 에러가 있다면 실행되지 않기 때문에, 지금까지한 작업들이 제대로 잘 되었나 테스트를 해야합니다. 첫번째는 오라클에 제대로 접속이 되는지 테스트해야하고, 두번째는 마이바티스가 제대로 연결되었는지 확인해야합니다.

먼저, 자바에 오라클용 JDBC를 사용할 수 있도록, jar파일을 복사해줘야합니다.

오라클이 설치된 경로 또는 드라이브에서 ojdbc6로 검색한 후, ojdbc6.jar 파일을 복사합니다.

복사한 ojdbc6 파일은 아래 경로에 붙여넣기합니다.

C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext
C:\Program Files\Java\jre1.8.0_171\lib\ext

잘라내기나 이동이 아닌 복사-붙여넣기입니다.

이제 src/test/java → com.test.controller 내부에 MyTest.java 파일(클래스)를 생성하고 아래의 코드를 추가합니다.

package com.test.controller;

import java.sql.Connection;

import javax.inject.Inject;
import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations ={"file:src/main/webapp/WEB-INF/spring/**/root-context.xml"})
public class MyTest {
 
    @Inject
    private DataSource ds;
       
    @Inject
    private SqlSessionFactory sqlFactory;
 
    @Test
    public void test() throws Exception{

        try(Connection conn = ds.getConnection()){
            System.out.println(conn);
        } catch(Exception e){
            e.printStackTrace();
        }
    }
   
  
    @Test
    public void factoryTest() {
        System.out.println(sqlFactory);
      
    }
  
    @Test
    public void sessionTest() throws Exception{
      
        try(SqlSession session = sqlFactory.openSession()) {
            System.out.println(session);
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
}

각 메서드 이름 또는 내부에서 우클릭 → Run As → JUnit을 선택합니다.

이렇게 에러 메시지가 없고, JUnit이 녹색으로 나온다면 이상이 없다는것입니다.

게시물 수정
  1. 오라클부분 실제 사용하는 테이블명 말하는거에요 관리자계정 말하는거에요 배우는입장으로 알수가 없네요;;

    답글삭제
    답글
    1. 오라클 부분의 username과 password는 실제로 사용하고있는 계정과 비밀번호를 입력합니다.
      ↑ 이 부분 말씀이시라면, 오라클에서 사용하시는 계정과 비밀번호입니다.

      삭제
  2. 좋은 예제 시리즈 감사합니다!!!

    MyTest.java에서 JUnit이 임포트가 안 되시는 분들은 Java Build Path의 Source탭에서 두 테스트 폴더의 Contains test source를 Yes로 토글해주시면 됩니다.

    Test 코드는 JUnit 4.12이상 버전에서만 작동하며, pom.xml에서 JUnit을 4.12 버전으로 설정해야 테스트가 돌아가더라고요. 주석처리되어 있는 거 풀어줬다가 다시 주석처리하면 될 거 같습니다!

    답글삭제
    답글
    1. 익명5/22/2020

      저에게 딱 맞는 답변으로 너무나 쉽게 해결했습니다 ! 감사합니다 !!

      삭제
  3. 작성자가 댓글을 삭제했습니다.

    답글삭제
  4. 안녕하세요 ! 테스트 프로젝트 생성 후 아무 이상없던 파일이
    pom.xml 스프링 버전 수정하는 곳에서 자바 버전을 1.8로 바꾸면 이상이 없는데
    스프링 버전을 3.1.1.RELEASE에서 4.3.8.RELEASE로 변경하면
    src>main>webapp>WEB-INF>spring>appServlet에 servlet-context.xml 파일의 이 부분에서 오류가 납니다..
    Error occured processing XML 'org/springframework/format/support/
    FormattingConversionServiceFactoryBean'. See Error Log for more details
    위와 같은 오류요.
    이럴땐 어떻게 해야하나요?? 그냥 스프링 버전을 바꾸지 말아야하나요?

    답글삭제
    답글
    1. 안녕하세요?

      먼저 프로젝트의 자체 JDK 및 JRE를 동일한 1.8 버전으로 변경하지 않았다면 변경해주시고, 상단 메뉴에서 프로젝트 → 클린을 해보시고

      그럼에도 같은 에러가 발생한다면 .m2 내부의 리포지터리(repository) 내부를 모두 삭제한 뒤 스프링을 완전히 종료했다가 다시 실행해보세요.

      스프링(=이클립스)는 기존에 남아있는 설정이나 파일 때문에 에러가 발생하는 경우가 많으므로, 각종 초기화(프로젝트, 리파지토리, 메이븐 등)를 해본 뒤 실행하면 잘 되실겁니다.

      삭제
  5. 익명5/04/2019

    java.sql.SQLException: Listener refused the connection with the following error:
    ORA-12514, TNS:listener does not currently know of service requested in connect descriptor

    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:412)
    at oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:531)
    at oracle.jdbc.driver.T4CConnection.(T4CConnection.java:221)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:503)
    at net.sf.log4jdbc.sql.jdbcapi.DriverSpy.connect(DriverSpy.java:399)
    at java.sql.DriverManager.getConnection(DriverManager.java:664)
    at java.sql.DriverManager.getConnection(DriverManager.java:208)
    at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:153)

    안녕하세요 콘솔창에서는 이런 오류가 뜨는데 JUnit은 녹색으로 뜨는데 무엇이 잘 못 되었는지 알 수 있을까요?
    오류가 엄청 길게 뜨는데 민폐가 될까봐 짤라서 올렸어요 ㅠㅠ

    답글삭제
    답글
    1. 익명5/04/2019

      ORA-12514가 "리스너가 현재 접속 기술자에 요청된 서비스를 알지 못함"란 오류인데
      해결 방법인 오라클서비스, 리스너서비스 정상동작 확인 코드로 잘 되는지 확인했고
      tnsnames.ora 와 listener.ora 설정 확인을 통해서 둘의 호스트네임도 똑같은 걸 확인했습니다
      이 방법들 외에는 없는거 같은데 JUnit은 녹색이니 그냥 진행해도 될까요?


      삭제
    2. 안녕하세요? 확인이 좀 늦었네요.

      .ora파일을 작업하실 땐 서비스에서 오라클 리스너를 중지하고 진행하며, 작업이 끝난 뒤에 시작 또는 재시작을 꼭 해보시기 바랍니다.

      호스트명이 같은데도 에러가 발생하는 경우, 호스트명을 컴퓨터 명칭이 아닌 IP로 변경해보시고 key값도 확인해보시기 바랍니다.

      삭제
  6. 아.. 빙시같이 src/main/java에다가 MyTest만들어놓고 왜 junit 임포트가 안될까 하다가 한시간째 헤맸네요... src/test/java에다가 했어야했는데 ㅠㅠ

    답글삭제
  7. 익명6/23/2020

    package com.test.controller;

    import java.sql.Connection;

    import javax.inject.Inject;
    import javax.sql.DataSource;

    import org.apache.ibatis.session.SqlSession;
    import org.apache.ibatis.session.SqlSessionFactory;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring/**/root-context.xml" })
    public class MyTest {

    @Inject
    private DataSource ds;
    @Inject
    private SqlSessionFactory sqlFactory;

    @Test
    public void test() throws Exception{

    try(Connection conn = ds.getConnection()){
    System.out.println(conn);
    } catch(Exception e){
    e.printStackTrace(); ==> 에러
            }
        }

    @Test
    public void factoryTest() {
    System.out.println(sqlFactory); ==> 에러
         
        }

    @Test
    public void sessionTest() throws Exception{

    try(SqlSession session = sqlFactory.openSession()) {
    System.out.println(session);
    }catch(Exception e) {
    e.printStackTrace(); ==> 에러
            }
        }
    }

    Mytest.java에서 코드에 표시해둔 부분에 에러가 나는데 왜그런지 모르겠어요 ㅜㅠ

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      에러가 생긴곳은 빨간줄이 그어지는데, 이곳에 마우스를 올려보시면 정확히 어떤 에러인지 확인하실 수 있습니다.

      삭제
    2. 이상하게 [코드 복사] 버튼을 이용해서 붙여넣으면 에러나고,
      그냥 드래그해서 복사해서 넣으면 에러가 안나더라구용..

      삭제
    3. 어.. 복사하는 과정에서 뭔가 문제가 있나보군요;
      냉큼 수정하겠습니다..ㅠㅠ

      삭제
  8. 안녕하세요?
    올려주신 프로젝트 잘 읽고 배우고 있습니다.
    다름이 아니라 마지막 부분에서 제가 junit으로 run했을때 initializationError가 뜨고 Failure Trace를 했을때:
    java.lang.NoSuchMethodError: org.springframework.util.Assert.notNull(Ljava/lang/Object;Ljava/util/function/Supplier;)V
    at org.springframework.test.context.support.ContextLoaderUtils.resolveContextConfigurationAttributes(ContextLoaderUtils.java:244)
    at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedContextConfiguration(AbstractTestContextBootstrapper.java:295)
    at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildTestContext(AbstractTestContextBootstrapper.java:108)
    at org.springframework.test.context.TestContextManager.(TestContextManager.java:139)
    at org.springframework.test.context.TestContextManager.(TestContextManager.java:124)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:151)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.(SpringJUnit4ClassRunner.java:142)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
    at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createUnfilteredTest(JUnit4TestLoader.java:90)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:76)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:49)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:525)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)
    위와 같은 에러가 뜹니다. 이전까지의 과정들은 올려주신대로 해보았고, 혹시라도 버전 문제일까봐 STS 3.9.6 exe 와 4.7.1로도 해보았는데 문제가 생겨서 댓글 남깁니다. 혹시 왜 그런지 알 수 있을까요? 감사합니다!

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      해당 에러는 동일한 클래스가 존재하거나, 반환(return)값이 없거나 맞지 않을경우 발생하는 에러로 추측됩니다.
      동일한 클래스가 있거나, 반환값(쿼리 메서드의 반환값은 int이지만 실제로 받지 않는 경우)을 확인해보시기 바랍니다.

      삭제
  9. MyTest.java에서

    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations ={"file:src/main/webap

    이 부분 전부 오류가 나는데 어떻게 해결해야 할까요?

    답글삭제
    답글
    1. 이부분은 따로 추가하지 않고 진행했더니 작동되고 있습니다! 추후에 추가해야겠어요.. 많은 도움이 되고 있습니다. 감사합니다.

      삭제
    2. 1. pom.xml의 spring-test의 test 를 지운다.
      2. add library에서 junit 추가
      3. 복사할때 메모장에 복붙

      삭제
    3. 앗.. 대신 답변해주신거 감사합니다(__)

      삭제
  10. < scope>test< /scope> 지워야해요

    답글삭제
  11. My.Test.java에서 어노테이션이나 try catch 구문에서 syntax 오류부분이 없는데 syntax error뜹니다.. 이유가 궁금해요!

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      정확히 어떤건지 잘 모르겠는데 에러 메시지를 봐야할 것 같습니다ㅠㅠ

      삭제
  12. Run As → JUnit 했는데 코드 내에서는 오류가 안뜨고
    java.lang.NoSuchMethodError: org.springframework.util.Assert.notNull(Ljava/lang/Object;Ljava/util/function/Supplier;)V
    at org.springframework.test.context.support.ContextLoaderUtils.resolveContextConfigurationAttributes(ContextLoaderUtils.java:240)
    at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedContextConfiguration(AbstractTestContextBootstrapper.java:295)
    at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildTestContext(AbstractTestContextBootstrapper.java:108)
    at org.springframework.test.context.TestContextManager.(TestContextManager.java:139)
    at org.springframework.test.context.TestContextManager.(TestContextManager.java:124)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:151)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.(SpringJUnit4ClassRunner.java:142)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
    at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createUnfilteredTest(JUnit4TestLoader.java:90)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:76)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:49)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:526)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)

    이렇게 실패했다고 뜨네요 ㅠㅠ 해결방법 알려주세요

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      해당 에러(java.lang.NoSuchMethodError)의 경우 아마 pom.xml에 선언된 junit의 버전 문제로 예상됩니다.
      버전을 변경하여 사용해보시면 되리라 봅니다.

      삭제
  13. 익명2/02/2021

    ㅜㅜ...ojdbc8은 있는데 6이없네요...공부한 부분과 다른점이많아서 따라가기가 힘드네요..ㅠㅠ 제가배운건 dao,daoimpl은 없고 mapper인터페이스를 사용하는 방식인데 dao사용하는법을 배워서 다시 방문하겠습니다!!

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      먼저 ojdbc6 또는 다른 버전의 ojdbc 파일은 오라클 사이트에서 받으실 수 있습니다.
      그리고 말씀하셨던 방법과 본문의 방법 모두 보편적으로 많이 사용하는 방식이므로, 둘다 알아두시면 좋을것 같습니다.

      삭제
  14. 익명2/04/2021

    pom.xml 저기 코드복사가능한 부분에 그대로 pom.xml에 옮겨붙이면 온갖 빨간에러 뜨는데..이게맞는건가요..??
    처음시작하는 입장에서 하나도 못따라가겠습니다..

    답글삭제
  15. 익명4/27/2021

    @Test
    public void sessionTest() throws Exception{

    try(SqlSession session = sqlFactory.openSession()) {
    System.out.println(session);
    }catch(Exception e) {
    e.printStackTrace();
    }
    }

    이 부분에서 try 문의 SqlSession 부분에 에러가 자꾸 뜨네요.
    에러 메시지는 The resource type SqlSession does not implement java.lang.AutoCloseable 라고 뜹니다.
    왜 이런거죠???
    분명 import는 org.apache.ibatis.session.SqlSession 으로 했습니다.

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      프로젝트의 설정에서 jdk 버전이 8이상인지 확인해보시기 바랍니다.

      삭제
  16. 익명9/10/2021

    안녕하세요! 신기해서 여쭤보고 싶었습니다.

    오라클 연결이 자꾸 안돼서 콘솔창 보니 ClassDeffounderror 이게 떠서 연결이 잘못되어 있는줄 알고 classpath 확인을 했는데, 정

    확 하드라고요... 그래서

    'DataSource 나 , JDBC연결이 안되어 있으니 ref값이 에러떠서 context 에서 아예 에러가 뜨는건가?'

    이 생각을 하고, 두개 테스트를 했는데 그냥 완벽했습니다.. 그래서 절망하고 우선 돌려봤는데, 갑자기 또 되네요?? 이럴수가 있나요..?? 아니 2시간동안 완전 이상한 헛짓한 기분,,,

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      이클립스 기반의 IDE를 사용중이시라면 흔히 겪는, 앞으로도 겪을 문제입니다..ㅠㅠ

      삭제
  17. 안녕하세요 글쓴이 님 덕분에 공부에 도움을 받습니다!

    다름이 아니라,

    java.lang.IllegalStateException: Failed to load ApplicationContext

    위와 같은 오류가 발생하는데, 아무것도 모르는 초심자라 어떤 문제인지 가늠이 안되네요!

    ojdbc를 6이 아닌 8을 사용하긴 했는데, 해당부분도 문제가 되나요?

    답글삭제
    답글
    1. 안녕하세요? 방문해주셔서 감사합니다.

      말씀하신 에러는.. 그 뒷내용까지 있어야 어디가 문제인지 파악할 수 있는 내용입니다ㅠㅠ

      또한 가급적이면 본문에 있는 버전을 그대로 따라가시는게 좋습니다.
      다른 버전에서 동작이 잘 된다는 보장이 하기가 어렵습니다.

      삭제
  18. 익명1/30/2022

    에러 생겼었는데 @RunWith(SpringJUnit4ClassRunner.class) 여기 위에 @WebAppConfiguration 이거 추가해주고, <property name="mapperLocations" value="classpath*: 이렇게 여기에 * 추가해주고, pom.xml에서 javax.servlet 부분 <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
    </dependency>

    이렇게 바꿔주니까 초록색으로 나오네욤 ㅎㅎ

    답글삭제