결론 : 버전에 맞지 않는 jdbc driver 를 사용하는 경우 위와 같은 오류메시지가 발생할수 있다.

메시지의 내용이 좀 엉뚱맞아서 한참을 헤맸다. 

더 이상한것은 URL IP 끝자리가 100번인데, 1까지만 나오는점이다.

 

상황

이전에 사용하던 DB커넥션 테스트소스를 새로운 mysql db로의 접속테스트 시도하려는데, 위 제목과 같은 오류메시지가 발생.

 

dbeaver에서도 잘 되고, myslq server에 들어가서 상태를 체크해봐도 이상없는데...

pom.xml의 jdbc driver 버전을 올려주었더니 바로 OK ㅠ.ㅠ;;;

 

그런데 이게 왠만큼 버전차이가 발생하면 이상이 없는듯하다.

구 소스에서 사용하던 드라이버 버전이 mysql 5.1.9 버전이었고, 접속하려는 DB의 버전은 8.0.x였다.

드라이버 버전을 5.1.49버전에서 멀쩡하게 돌아가는것으로 보아 해당 버전사이에 어떠한 업데이트가 있었던듯하다.

 

가급적이면 접속하려는 서버의 버전과 맞춰서 사용하자.

 



어느순간 SpringFramework을 사용하는 프로젝트는 springboot가 대세가 되버렸고, 

이제는 점점 springboot + maven + mybatis 에서 maven자리를 gradle이 대체하는 추세인듯하다. (개인적인 느낌)

여전히 Maven이 친숙한 입장에서 gradle이 익숙하지 않은데서 오는 삽질이 또다시 반복되고 있다.(ㅠ.ㅠ)

(앞으로도 개발을 놓기전까지 이런 패턴은 계속될듯...)

 

eclipse나 sts등의 IDE에서 gradle로 관리하는 프로젝트에서 mybatis mapper.xml 에서 domain class의 typealias를 인식하지 못하고 오류표시를 내곤한다.

Class/TypeAlias 인식하지 못한 오류

그런데 springboot로 실행하면 특별한 오류없이 잘 실행되곤 한다. 그냥 내버려두고 싶다가도 계속 눈에 거슬리다보니 원인과 해결책을 찾아 메모해둔다. 

 

개인의견으로는 Spring의 설정이 xml 에서 annotation으로 변화되면서 실행시점에 mapper와 domain class를 인식하기에 실행에는 문제가 없으나 IDE Tool에서는 이를 인지하기엔 추가적인 설정이 필요하지만 적용하지 않아 발생하는 오류로 보인다.

기본적인 springboot+mybatis+gradle  프로젝트 설정 이후 DataSource관련 추가설정을 별도의 class로 분리하여 아래와 같이 설정했다.

 

1. 일반적인 springboot 설정

@SpringBootApplication
public class TestBootApplication {

	public static void main(String[] args) {
		
		SpringApplication app = new SpringApplication(TestBootApplication.class);
		app.run(args); 
	}

2. DataSource Config설정

@Configuration
@ComponentScan
@EnableTransactionManagement
public class DataSourceConfig {
	
	@Bean
	public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
		SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
		sessionFactory.setDataSource(dataSource);
		sessionFactory.setVfs(SpringBootVFS.class); 
		
		Properties properties = new Properties();
		properties.setProperty("callSettersOnNulls", "true");
		sessionFactory.setConfigurationProperties(properties);
		
		org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
		configuration.setCallSettersOnNulls(true);
		sessionFactory.setConfiguration(configuration);
		sessionFactory.setTypeAliasesPackage("com.test.dto");

		return sessionFactory.getObject();
	}	
}

여기까지만 해도 실행에는 문제가 발생하지 않는다. 하지만 서두의 문제처럼 IDE에서 오류가 발생한다.

 

application.properties나 application.yml에 아래의 설정을 추가해주자.

mybatis:
  type-aliases-package: com.test.dto
  mapper-locations: com/test/mapper/*.xml

추가로

위의 mapper-locations 는 일정한 규칙대로 일괄적용하는 방식이라면

config-location=mybatis-config.xml 형식으로 지정하면 선택적인 mapper및 alias name을 적용할 있다. 

아래는 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>
 	<settings>
		<setting name="callSettersOnNulls"    value="true"/>
		<setting name="jdbcTypeForNull"       value="NULL" />
		<setting name="cacheEnabled"          value="false" />
		<setting name="useGeneratedKeys"      value="true" />
		<setting name="defaultExecutorType"   value="REUSE" />
		<setting name="mapUnderscoreToCamelCase" value="true"/>
	</settings>
 
  <mappers> 
    <mapper resource="com/test/oracle/mapper/TestMapper.xml"/>
    <mapper resource="com/test/oracle2/mapper/UserDao.xml"/>
    ...
  </mappers>

  <typeAliases>
	<typeAlias type="com.test.dto.UserDto" alias="User" />
  </typeAliases>

 

 



MyBatis Application Project 작업순서

Posted 2019. 7. 9. 11:24

java application project에서 테스트를 위한 작업순서(in Maven 프로젝트)

 

1. pom.xml 추가

  1.1 mybatis 기본 dependency 추가 

  <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
	<dependency>
	    <groupId>org.mybatis</groupId>
	    <artifactId>mybatis</artifactId>
	    <version>3.4.1</version>
	</dependency>

 

  1.2 config.xml 설정파일 관련 dependency 추가

<!-- https://mvnrepository.com/artifact/commons-configuration/commons-configuration -->
	<dependency>
	    <groupId>commons-configuration</groupId>
	    <artifactId>commons-configuration</artifactId>
	    <version>1.10</version>
	</dependency>
	
	<!-- https://mvnrepository.com/artifact/commons-collections/commons-collections -->
	<dependency>
	    <groupId>commons-collections</groupId>
	    <artifactId>commons-collections</artifactId>
	    <version>3.2.1</version>
	</dependency>

  1.3 Config.java, ConnectionFactory.java 생성   

-- Config.java --

public class Config {
	private static Configuration configuration;
	 
    static {
        try {
        	URL url = Config.class.getClassLoader().getResource("config/database.xml");
            if (configuration == null) {
				configuration = new XMLConfiguration(url);
            } else {
            	System.out.println("return configuration from Memory...");
            }
        } catch (ConfigurationException e) {
            e.printStackTrace();
        }
    }   
    public static Configuration getConfiguration() {
        return configuration;
    }
}

--  ConnectionFactory.java -----

public class MyBatisConnectionFactory {
	private static SqlSessionFactory sqlSessionFactory;
    static {
        try {
            final String resource = "config/mybatis-config.xml";
            Reader reader = Resources.getResourceAsReader(resource);
            if (sqlSessionFactory == null) {
            	Configuration conf = MyConfig.getConfiguration();    			
    			Properties props = new Properties();    			
    			props.setProperty("driver",	 	conf.getString("jdbc.driver","oracle.jdbc.driver.OracleDriver"));
    			props.setProperty("url", 		conf.getString("jdbc.url","jdbc:oracle:thin:@127.0.0.1:1521:orcl"));
    			props.setProperty("username", 	conf.getString("jdbc.username","test2018"));
    			props.setProperty("password", 	conf.getString("jdbc.password","test2018"));
    			
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader, props);
            }
        } catch (FileNotFoundException fileNotFoundException) {
            fileNotFoundException.printStackTrace();
        } catch (IOException iOException) {
            iOException.printStackTrace();
        }
    }
    public static SqlSessionFactory getSqlSessionFactory() {
        return sqlSessionFactory;
    }
}

 

2. TestMain.java 테스트 (Transaction 처리 포함 테스트)

  ...중략...
  
	public static void main(String[] args) {

		SqlSession sqlSession = null;
		try {
			sqlSession = MyBatisConnectionFactory.getSqlSessionFactory().openSession(false);

			//Mapper 사용하는 방법
			TestMapper testMapper = sqlSession.getMapper(TestMapper.class);
			List<Map<String, Object>> progrmList = testMapper.getProgrmList();
			
			//Sqlsession을 사용하는 방법
			List<Map<String, Object>> progrmList = (List<Map<String,Object>>)sqlSession.selectList("getProgrmList");
			
			
			for (Iterator iterator = progrmList.iterator(); iterator.hasNext();) {
				Map<String, Object> map = (Map<String, Object>) iterator.next();
				System.out.println(map);				
			}
			
			Map<String, Object> param = new HashMap<String, Object>();
			param.put("id", "test8");
			param.put("name", "test8 name");
			param.put("age", 88);
			
			testMapper.insertTest(param);
			
			Map<String, Object> param2 = new HashMap<String, Object>();
			param2.put("id", "test5");
			param2.put("name", "test5 update name");
			param2.put("age", 28);
			testMapper.updateTest(param2);
			
			// 커밋
			sqlSession.commit();
		} catch (Exception e) {
			// 롤백
			sqlSession.rollback();
			e.printStackTrace();
		} finally {
			sqlSession.close();
		}
	}

 

 

 

 



« PREV : 1 : 2 : 3 : NEXT »