ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링(Spring) 개발 - (9) Mybatis (마이바티스) 연동하기
    Spring 2015.03.26 11:57

    이번글에서는 웹개발에 빠질수 없는 데이터베이스 연결에 대해서 이야기하려고 합니다.


    지난 글에서 이제 간단한 게시판을 만들어본다고 했는데, 그것의 사전준비라고 생각하시면 됩니다.


    앞으로 여러가지 설정들도 나오게 되는데, 그것들은 필요할때마다 하나씩 설정하도록 하겠습니다.


    ------------------------------------------------------------------------------------


    1. Mybatis

    1. MyBatis(마이바티스)란?

    일단 MyBatis 홈페이지에서는 다음과 같이 정의하고 있다. 

    MyBatis is a first class persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis eliminates almost all of the JDBC code and manual setting of parameters and retrieval of results. MyBatis can use simple XML or Annotations for configuration and map primitives, Map interfaces and Java POJOs(Plain Old Java Objects) to database records.


    간단하지만 MyBatis에 대한 개념을 알게해주는 설명글이다. 


    영어로 써있지만 문제없이 읽을수 있을것이라고 믿어 의심치 않는다. (다들 이정도 영어는 기본으로 읽지 않나?)


    ..........


    ...............


    ..............................



    마이바티스 홈페이지는 다행히 한글도 지원한다. 다음은 마이바티스 한국어 페이지에서 가져온 내용이다. 

    MyBatis는 개발자가 지정한 SQL, 저장프로시저, 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다. MyBatis는 JDBC 코드와 수동으로 셋팅하는 파라미터와 결과 매핑을 제거한다. MyBatis는 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO를 설정하고 매핑하기 위해 XML과 애노테이션을 사용할 수 있다.



    영어나 한글이나 뭔 소리인지 이해가 안간다. 


    기존에 JDBC를 이용하여 프로그래밍을 하는 방식에 비해서 MyBatis는 개발자의 부담을 굉장히 많이 덜어주고, 생산성 향상에도 도움이 된다.

    기존에 JDBC를 이용하여 프로그래밍을 하는 방식은 프로그램 소스안에 SQL문을 작성하는 방식이었다.

    커넥션을 맺고, 셀렉트문 날려서 리절트셋 나오고, 그걸 rs.next()등을 이용하여 하나씩 받아오는....

    (이 말이 무슨소리인지 모르겠으면...굳이 찾아보지는 말자. 정신건강에 좋지 않다.)

    따라서 SQL의 변경 등이 발생할 경우, 프로그램(java 파일)을 수정하기 때문에 그 유연성이 좋지 못했는데, MyBatis에서는 SQL을 xml 파일에 작성하기 때문에, SQL의 변환이 자유롭고, 가독성이 좋다는 장점이 있다.


    이후에 실제로 하나씩 만들어보면서 이게 무슨소리인지 확인하도록 하자.


    2. MyBatis 라이브러리 

    스프링에서 MyBatis를 사용하려면 라이브러리가 필요하다. 

    우리는 이미 Maven을 이용하여 라이브러리를 관리하기 때문에, 라이브러리의 추가가 굉장히 쉽다.

    pom.xml에 다음을 추가한다. (http://addio3305.tistory.com/41 글을 따라했다면 이미 추가되어 있다.)

    <dependency>
    	<groupId>org.mybatis</groupId>
    	<artifactId>mybatis</artifactId>
    	<version>3.2.2</version>
    </dependency>
    
    <dependency>
    	<groupId>org.mybatis</groupId>
    	<artifactId>mybatis-spring</artifactId>
    	<version>1.2.0</version>
    </dependency>
    
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${org.springframework-version}</version>
    </dependency>
    
    <dependency>
    	<groupId>commons-dbcp</groupId>
    	<artifactId>commons-dbcp</artifactId>
    	<version>1.4</version>
    </dependency>
    


    여기까지가 공통으로 들어가는 라이브러리고, 사용하는 DB에 따라서 추가할 라이브러리가 약간 다르다. 

    1) MySql을 사용할 경우

    <dependency>
    	<groupId>mysql</groupId>
    	<artifactId>mysql-connector-java</artifactId>
    	<version>5.1.31</version>
    </dependency>

    이것만 추가하면 된다. 


    2) Oracle의 경우 

    오라클의 경우, 약간 손이 더 간다. 


    ojdbc.jar 파일을 검색할 경우, 다음과 같은 dependency가 나오는데, 실제로는 다운받을수가 없다.

    <dependency>
            <groupId>ojdbc</groupId>
            <artifactId>ojdbc</artifactId>
            <version>14</version>
    </dependency>
    


    따라서 다음의 dependency로 바꿔준다.

    <dependency>
    	<groupId>com.oracle</groupId>
    	<artifactId>ojdbc14</artifactId>
    	<version>10.2.0.4.0</version>
    </dependency>
    

    이렇게 작성하여도 아직은 에러가 나온다. 

    따라서 상단의 <properties> 다음에 다음 코드를 추가한다.

    <repositories>
    	<repository>
    		<id>mvn2</id>
    		<url>http://repo1.maven.org/maven2/</url>
    		<releases>
    			<enabled>true</enabled>
    		</releases>
    		<snapshots>
    			<enabled>true</enabled>
    		</snapshots>
    	</repository>
    	
    	<repository>
    	     <id>oracle</id>
    	     <name>ORACLE JDBC Repository</name>
    	     <url>http://mesir.googlecode.com/svn/trunk/mavenrepo</url>
    	</repository> 
    </repositories>
    

    ojdbc를 다운받을 수 있는 Repository를 수동으로 등록한 것이다. 


    3. MyBatis와 DB(데이터베이스) 연결 설정

    마이바티스와 데이터베이스를 연결하는 방법을 살펴보자.


    1) src/java/resource 폴더 밑에 config > spring 폴더를 만들다.


    2) spring 폴더 안에 context-datasource.xml 파일을 만든다.


    위와 같은 구조로 만들어준다. 


    3) web.xml에서 위의 설정파일을 읽도록 되어있는지 확인한다.

    web.xml의 하단에 다음의 코드가 있어야한다. 

    <context-param>
    	<param-name>contextConfigLocation</param-name>
    	<param-value>classpath*:config/spring/context-*.xml</param-value>
    </context-param>
    


    이는 최초 서버가 시작될 때, 해당 위치에 있는 context 파일을 모조리 읽어들이는 것을 뜻한다. 

    xml 태그에서 알 수 있듯이, contextConfigLocation을 설정하고, 그 위치는

    위에서 만들었던 config > spring 폴더에 있는 context-로 시작하는 모든 xml 파일을 의미한다. 

    앞으로 스프링 관련 여러가지 설정파일이 있기 때문에, 위와같이 설정파일을 읽어올 수 있도록 하였다.


    4) MyBatis 연결 설정을 하자.

    4-1) MySQL 의 경우

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    						http://www.springframework.org/schema/jdbc  http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd">
        
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
            <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
            <property name="url" value="jdbc:mysql://주소/스키마"/>
            <property name="username" value="아이디"/>
            <property name="password" value="비밀번호"/>
        </bean>
    </beans>
     
    
    


    별달리 여려운 설정은 없을것이라고 생각한다.

    url에서 MySQL이 설치된 서버의 주소와 사용할 DB 스키마를 적어주면 된다. (개인PC에서 개발할 경우 localhost/스키마 또는 127.0.0.1/스키마 로 적어주면 된다.)


    4-2) Oracle의 경우

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    						http://www.springframework.org/schema/jdbc  http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd">
        
        <bean id="dataSource" class="org.apache.commons.dbcp.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="아이디"/>
            <property name="password" value="비밀번호"/>
        </bean>
    </beans>
    

    오라클의 경우도 별다를건 없다. MySQL과 다른거는 dataSource의 class와 url이 다르다.

    그 점을 자세히 보길 바란다. 


    (오라클의 경우 보통 Oracle 10g XE 또는 Oracle 11g XE 를 깔아서 연습하기때문에, 그에 맞춰서 소스를 썼다. 실제 오라클 엔터프라이즈의 경우 localhost 대신 IP 주소, XE 대신 사용하는 DB 스키마를 적어준다.)


    4. MyBatis와 Spring의 연결

    1) resource 폴더에 mapper 폴더를 생성한다.


    2) resource > config > spring 폴더에 context-mapper.xml 파일을 생성한다.


    3) context-mapper.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"
    	xsi:schemaLocation="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.xsd">
    
    	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
    		<property name="dataSource" ref="dataSource" />
    		<property name="mapperLocations" value="classpath:/mapper/**/*_SQL.xml" />
    	</bean>
    	
    	<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
            <constructor-arg index="0" ref="sqlSession"/>
        </bean>  
    </beans>
    

    몇가지 살펴보자.

    6번째 줄의 property의 name과 ref가 dataSource로 정의되어있다. 

    이 두가지는 같은것을 의미하지 않는다. name은 위에서 등록한 sqlSession 빈(bean)에서 사용할 이름이 dataSource이고, ref의 dataSource는 우리가 context-datasource.xml에서 정의한 빈(bean)을 참조하는 것을 의미한다. 


    7번째 줄의 mapperLocations는 앞으로 우리가 작성할 SQL문이 위치할 장소이다. 여기서 classpath:/mapper/**/*_SQL.xml 이라는 정의를 살펴보자. 


    앞에서 web.xml에서 spring context 설정파일을 읽어오기 위해서 classpath*:config/spring/context-*.xml 라고 정의했던것을 기억하자.


    앞으로 우리는 다양한 SQL 파일을 만들것인데, 그것을 일일이 등록해서 사용할 수는 없다. (원래는 xml 파일에 XML도 bean으로 설정해야한다.) 그렇지만 다양한 사람들이 작업하는 프로젝트의 특성상, 그것을 일일이 등록할 수 없고, 할 수 있더라도 귀찮은 일이다. 따라서 서버가 시작될 때 자동으로 SQL이 정의되어 있는 XML 파일도 읽어오도록 하는것이 필요하다. 

    따라서 SQL이 위치할 mapper 폴더를 잡아주고, 그 안에 모든 폴더를 의미하는 **를 붙여준 후, 마지막으로 _SQL로 끝나는 모든 xml 파일을 읽어주도록 한다. 

    여기서 중간에 ** 를 붙인 이유는, 유연한 폴더구조의 변경을 위해서 이렇게 작성했다. 예를 들어 mapper > first > *_SQL.xml 와 mapper > first > second > *_SQL.xml 은 다른 경로이다. (mapper 폴더 밑에 first, second 라는 이름의 폴더가 있는 경우를 의미)

    우리는 앞으로 게시판에 관련된 쿼리만 작성하겠지만, 실제 프로젝트에서는 굉장히 많은 패키지가 생성되기 때문에 2,3단계로 구분된다. 그것을 유연성있게 대처하도록 해줬다. 


    마지막으로 10번째 줄의 sqlSessionTemplate은 마이바티스 스프링 연동모듈의 핵심이다. SQLSessionTemplate은 SqlSession을 구현하고, 코드에서 SqlSessoin을 대체하는 역할을 한다. 실제 코드에서 어떻게 사용하는지를 나중에 보면서 다시 이야기해보자.


    5. DAO 작성

    마지막으로 실제 소스에서 위에서 선언한 SqlSessionTemplate을 사용할 DAO를 만들어주자.

    DAO는 Data Access Object의 약자로, Data Access Object를 Factory 패턴화 시키는 것으로, 비즈니스 로직을 모듈화 하는 방법이다. Factory 패턴이 무엇인지 잘 모르면, 디자인 패턴에 대해서 공부하면 좋다. 여기서는 디자인 패턴에 대한 설명은 생략하고 어떻게 사용하는지만 보도록 하겠다. 


    1) src/main/java 폴더의 first > common 패키지 밑에 dao 패키지를 생성한다.


    2) dao 패키지 안에 AbstractDAO.java를 생성한다.

    위와 같은 구조를 가지게 된다. 


    3) AbstractDAO에 다음 소스를 작성한다.

    public class AbstractDAO {
    	protected Log log = LogFactory.getLog(AbstractDAO.class);
    	
    	@Autowired
    	private SqlSessionTemplate sqlSession;
    	
    	protected void printQueryId(String queryId) {
    		if(log.isDebugEnabled()){
    			log.debug("\t QueryId  \t:  " + queryId);
    		}
    	}
    	
    	public Object insert(String queryId, Object params){
    		printQueryId(queryId);
    		return sqlSession.insert(queryId, params);
    	}
    	
    	public Object update(String queryId, Object params){
    		printQueryId(queryId);
    		return sqlSession.update(queryId, params);
    	}
    	
    	public Object delete(String queryId, Object params){
    		printQueryId(queryId);
    		return sqlSession.delete(queryId, params);
    	}
    	
    	public Object selectOne(String queryId){
    		printQueryId(queryId);
    		return sqlSession.selectOne(queryId);
    	}
    	
    	public Object selectOne(String queryId, Object params){
    		printQueryId(queryId);
    		return sqlSession.selectOne(queryId, params);
    	}
    	
    	@SuppressWarnings("rawtypes")
    	public List selectList(String queryId){
    		printQueryId(queryId);
    		return sqlSession.selectList(queryId);
    	}
    	
    	@SuppressWarnings("rawtypes")
    	public List selectList(String queryId, Object params){
    		printQueryId(queryId);
    		return sqlSession.selectList(queryId,params);
    	}
    }
    

    간단히 살펴보자. 

    우리가 앞에서 SqlSessionTemplate을 설정하였고, 이는 SqlSession을 대체한다고 이야기 했었다.

    5번째 줄에 SqlSessionTemplate을 선언하고 여기에 Autowired 어노테이션(Annotation)을 통해서 xml에 선언했던 의존관계를 자동으로 주입하도록 하였다. 


    쿼리는 sqlSession.메서드를 호출하면 되는데, 여기서는 앞으로 개발할때, 좀 더 보기편하게 로그를 남기기위해서 AbstractDAO를 만들어서 insert, delete, update, select 메서드를 재정의 하였다. 


    실제 개발에서는 각 비즈니스 로직을 담당할 DAO를 생성하여 AbstractDAO를 상속받도록 할 계획이다. 

    앞으로 개발하면서 차차 보게될 것이다. 


    여기까지 작성하고 서버를 실행시켜서 에러가 나지 않으면, 설정에 문제가 없는것으로 판단할 수 있다. 


    ------------------------------------------------------------------------------------

    여기까지 MyBatis의 설정이 완료되었습니다. 


    MyBatis와 Spring의 연동은 간단한데, 그것을 글로 풀어쓰면서 추후 확장성을 고려하여 이야기를 하다보니, 조금 복잡해진 것 같네요.


    또한, 설정한것을 실제로 확인해보지 않아서, 정말 확실히 연결이 되었는지 의구심이 들수도 있는데, 그것을 모두 확인하기 위해서는 DB에 테이블도 만들고, 스프링 비지니스 로직을 구현하여 쿼리를 호출하는것까지 설명해야 하는데, 이번글에서 모두 작성하기에는 조금 무리가 있다고 생각했습니다.


    다음글에서는 본격적으로 게시판을 만들건데요. 일단 게시판 목록 페이지를 구현하면서, 우리가 그동안 작성했던 내용들이 정확히 되었는지 확인하면서 진행할 계획입니다. 


    또한, 소스를 요청하시는 분들이 있어서 이번글부터는 소스파일도 첨부합니다.

    first.zip


    댓글 109

    • 이전 댓글 더보기
    • 신입 2016.10.24 17:11

      16년 10월 24일 기준

      oracle maven 되네요..

      <dependency>
      <groupId>com.oracle</groupId>
      <artifactId>ojdbc6</artifactId>
      <version>11.2.0.3</version>
      </dependency>
      ...
      <repositories>
      <repository>
      <id>codelds</id>
      <url>https://code.lds.org/nexus/content/groups/main-repo</url>
      </repository>
      </repositories>

    • 확인점요 2016.11.03 09:11

      첨부된 파일로 임포트 시켜서 실행 안되시는분들 서버에 톰켓 더블클릭하시고 Modules 들어가셔서 수정하시면됩니다.

    • 김승하 2016.11.17 23:41

      context-datasource.xml 만들자마자 에러가생기네요..
      Description Resource Path Location Type
      Error occured processing XML 'Premature end of file.'. See Error Log for more details 와
      Premature end of file.
      이렇게 에러가납니다. 혹시 xml에따로 추가해야될게 있나요?

    • 뒹구르르 2017.01.23 15:54

      마이바티스 설정 잘 보았습니다. 에러나는부분도 댓글 참고해서 해결했네요. 감사합니다^^

    • 노인 2017.02.21 17:09

      context-datasource.xml 만들자마자 에러가생기네요..
      Description Resource Path Location Type
      Error occured processing XML 'Premature end of file.'. See Error Log for more details 와
      Premature end of file.
      이렇게 에러가납니다. 혹시 xml에따로 추가해야될게 있나요?

    • 웹개발뉴비 2017.03.29 11:58

      4) MyBatis 연결 설정을 하자.
      여기서 저 처럼 있는 그대로 따라하시는분에게 조금이나마 도움이 되도록 제가 겪었던 해결 방법 알려드립니다.

      오라클 sql-developer를 쓰시는분은 context-datasource 내용 보면 <property name="username" value="아이디"/>
      <property name="password" value="패스워드"/>
      부분이 나오는데 아이디/패스워드를 DB접속할때 사용했던 이름을 사용하셔야 합니다. 안그럼 500 internal server error를 맞이하게 되네요

      제가 했던건 상관있나 없나 모르겠지만 저는 mybatis 세팅 사용전에
      이클립스에서 oracle 연동을 이미 끝마쳤었습니다. 사용 방법은 http://blog.naver.com/PostView.nhn?blogId=acid33&logNo=90125137391&categoryNo=0&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=&isAfterWrite=true&userTopListOpen=true&userTopListCount=5&userTopListManageOpen=false&userTopListCurrentPage=1 여기랑 https://www.youtube.com/watch?v=-pZRydD8BBM 참 도움이 많이 됐네요
      참고하실분은 참고바랍니다. 저같은 초보적인 실수를 저지르지 않게 하기 위하여

    • help 2017.07.18 11:28

      위 예제기반으로 다중 DB가 필요하신분들 아래 소스 참고하시면되겠습니다.
      이렇게 해서 다중DB연결 성공했네요...^^
      http://blog.naver.com/eungsik80/221053921874

    • 들벗 2018.01.05 15:18

      왜이런에러가 나죠?여기서부터 막히네요
      org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSession' defined in file [C:\eGovFrame-3.5.1\workspace.edu\.metadata\.plugins\org.eclipse.wst.server.core\tmp2\wtpwebapps\first\WEB-INF\classes\config\spring\context-mapper.xml]: Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type 'java.lang.String' to required type 'org.springframework.core.io.Resource[]' for property 'mapperLocations'; nested exception is java.lang.IllegalArgumentException: Could not resolve resource location pattern [classpath:/mapper/**/*_SQL.xml]: class path resource [mapper/] cannot be resolved to URL because it does not exist
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:529)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
      at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
      at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
      at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
      at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
      at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:610)
      at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
      at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
      at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389)
      at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:294)
      at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
      at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5016)
      at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5524)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
      at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1575)
      at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1565)
      at java.util.concurrent.FutureTask.run(FutureTask.java:262)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
      at java.lang.Thread.run(Thread.java:745)
      Caused by: org.springframework.beans.TypeMismatchException: Failed to convert property value of type 'java.lang.String' to required type 'org.springframework.core.io.Resource[]' for property 'mapperLocations'; nested exception is java.lang.IllegalArgumentException: Could not resolve resource location pattern [classpath:/mapper/**/*_SQL.xml]: class path resource [mapper/] cannot be resolved to URL because it does not exist
      at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:468)
      at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:494)
      at org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:488)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1433)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1392)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1128)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
      ... 20 more
      Caused by: java.lang.IllegalArgumentException: Could not resolve resource location pattern [classpath:/mapper/**/*_SQL.xml]: class path resource [mapper/] cannot be resolved to URL because it does not exist
      at org.springframework.core.io.support.ResourceArrayPropertyEditor.setAsText(ResourceArrayPropertyEditor.java:139)
      at org.springframework.beans.TypeConverterDelegate.doConvertTextValue(TypeConverterDelegate.java:452)
      at org.springframework.beans.TypeConverterDelegate.doConvertValue(TypeConverterDelegate.java:424)
      at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:181)
      at org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:448)
      ... 26 more

    • 초보 2018.01.19 10:25

      지금 mysql-connector-java-5.1.31.jar 설치가 무한로딩 걸려서 껏다켰다 하는데도 계속 꺼지지도 않고 진행도 안되네요... 이거 어떻게 해결해야되나요... 이클립스 사용을 못하고 있네요

    • 들벗 2018.01.23 17:44

      2016, 04, 26 부로 메이븐 추가 주소가 바뀌었다.

      <repositories>
          <repository>
              <id>mesir-repo</id>
              <url>https://maven.atlassian.com/3rdparty/</url>
          </repository>
      </repositories>    
       
      <!-- https://mvnrepository.com/artifact/com.oracle/ojdbc6 -->
      <dependency>
          <groupId>com.oracle</groupId>
          <artifactId>ojdbc6</artifactId>
          <version>12.1.0.1-atlassian-hosted</version>
      </dependency>

    • 들벗 2018.01.23 17:44

      2016, 04, 26 부로 메이븐 추가 주소가 바뀌었다.

      <repositories>
          <repository>
              <id>mesir-repo</id>
              <url>https://maven.atlassian.com/3rdparty/</url>
          </repository>
      </repositories>    
       
      <!-- https://mvnrepository.com/artifact/com.oracle/ojdbc6 -->
      <dependency>
          <groupId>com.oracle</groupId>
          <artifactId>ojdbc6</artifactId>
          <version>12.1.0.1-atlassian-hosted</version>
      </dependency>

    • 바부멍충 2018.04.24 09:31

      와 저 완전 바보였네요 자꾸 bean 생성 에러가 나길래 댓글 열심히 찾아봤더니 context-*.xml 들이 문제였네요
      src/main/resources 밑에 config 파일 밑에 spring 파일을 만들었어야 했는데 first밑에 spring 이라고 파일명을 저도 모르게 혼자 멋대로 변경해서 500에러가 발생했었네요.. 경로명 조심하시길 바랍니다

    • dddddddyjlee 2018.08.03 20:43

      import 하고 ..class not found 에러가 나오는데요..https://m.blog.naver.com/PostView.nhn?blogId=heartflow89&logNo=221003777591&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F 여기서 보고 해결했네요

    • 박재헝 하악하악 2018.08.08 16:11

      ojdbc 안되시는 분 그냥 ojdbc 6을 다운받아서 repository>oracle>ojebc6>11.2.0.4 아래의 ojdbc와 바꿔치기 하세요. 중요한건 이름도 ojdbc6-11.2.0.4로 바꿔야 합니다

    • 고수 2018.08.10 15:18

      나는 고수

    • 개린이 2018.12.10 17:29

      pom.xml 에서 ojdbc14 추가하실 때 오류나는 거 바로 잡았습니다.
      우선 oracle.com에서 최신 버전을 받았을 경우 설치하게 되면 ojdbc6 버전으로 설치가 될 겁니다.

      <repositories>
      <repository>
      <id>codelds</id>
      <url>https://code.lds.org/nexus/content/groups/main-repo</url>
      </repository>
      </repositories>

      이것을 반드시 <dependencies> 위에 선언해주셔야 합니다 안에서 하면 오류나요.

      그 후에 <dependencies> 안에

      <dependency>
      <groupId>com.oracle</groupId>
      <artifactId>ojdbc6</artifactId> <!-- 최신이면 6이고 블로그 대로면 14 -->
      <version>11.2.0.2.0</version> <!-- 버전에 맞는 걸로 쓰시면 됨 -->
      </dependency>

      상황에 따라서 톰캣 구동시에 지정된 JAR 파일 찾을 수 없다고 오류 뜰 수 있는데
      그럴 경우에는 오라클이 설치된 경로 저 같은 경우에는
      C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib
      이런 식으로 되어 있는데 아마 거의 기본 경로일 겁니다. 따라서 이 안에 있는 ojdbc6.jar 또는 ojdbc14.jar 파일 복사해서
      C:\dev\apache-maven-3.6.0\repository\com\oracle\ojdbc6\11.2.0.2.0 에 붙여넣으시면 됩니다. 저 같은 경우에는 블로그대로 만들어서 C드라이브 밑에 dev 폴더 생성해서 진행했고 maven도 역시 dev 폴더에 붙여넣기 했고, 직접 생성한 repository 폴더 안에 com/oracle/ojdbc6 또는 ojdbc14/1x.x.x.x 폴더(본인 버전에 맞는 오라클 버전)를 들어가서 ojdbc6.jar를 붙여넣고 ojdbc6-11.2.0.2.0으로 파일명을 변경했습니다. 이렇게 하니 오류가 잡히더군요. 참고하셔서 저처럼 하루종일 헤매는 일 없으시길 바랍니다

      <참고 블로그>
      http://blog.naver.com/PostView.nhn?blogId=yo2dh&logNo=220795637365&parentCategoryNo=&categoryNo=53&viewDate=&isShowPopularPosts=true&from=search

    • Favicon of https://cheont.tistory.com BlogIcon cjsrud 2019.01.17 14:25 신고

      감사합니다

    • Favicon of https://cheont.tistory.com BlogIcon cjsrud 2019.01.17 14:25 신고

      감사합니다

    • 음음음 2019.03.11 17:20

      너무도 감사합니다. 하지만, 순차적으로 쭉 따라해보면 세세한 명시가 안되어 있기 때문에 절대로 실행되지 않습니다.

    • 승훈 2019.03.19 11:10

      안녕하세요 지금 현재 여기까지 따라해 보았는데요

      ---------------------
      org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSession' defined in file [C:\dev\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\first\WEB-INF\classes\config\spring\context-mapper.xml]: Initialization of bean failed; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert property value of type 'java.lang.String' to required type 'org.springframework.core.io.Resource[]' for property 'mapperLocations'; nested exception is java.lang.IllegalArgumentException: Could not resolve resource location pattern [classpath:/mapper/**/*_SQL.xml]: class path resource [mapper/] cannot be resolved to URL because it does not exist
      ---------------------
      현재 이런 오류가 뜹니다.
      진행사항 1. context_mapper.xml에 의심이 가는 <property name="mapperLocations" value="classpath:/mapper/**/*_SQL.xml" />을 주석처리하니까 오류가 뜨지 않습니다.

      2번쨰 진행 주석처리의 문제가 아니라 지금 mapper 아래 폴더에 *_SQL.xml 파일이 없는서 인가 의심이되서 Test_SQL.xml을 만들어 보았더니
      -------------------
      Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 39; 예기치 않은 파일의 끝입니다.
      at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
      at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(Unknown Source)
      at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
      at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(Unknown Source)
      at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(Unknown Source)
      at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(Unknown Source)
      at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
      at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
      at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
      at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
      at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
      at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
      at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
      at org.apache.ibatis.parsing.XPathParser.createDocument(XPathParser.java:251)
      ... 27 more
      ------------------
      아래와 같은 에러가 뜨는데 해결방법좀 부탁드립니다....


      ------------------------
      수정 -> 지금 주석처리 안하고 오류가 안뜨는 법을 찾긴했는데 맞는지 모르겠네요
      classpath뒤에 * 붙이니까 오류는 안뜨네요

Designed by Tistory.