1. 일단 ibatis 설정하고 있는 템플릿을 모두 없애기로 마음먹음
7월 27, 2024 10:56:04 오전 org.apache.catalina.core.StandardContext listenerStart심각: Context initialized 이벤트를 [org.springframework.web.context.ContextLoaderListener] 클래스의 인스턴스인 리스너에 전송하는 동안 예외 발생org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cmmUseDAO': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.springframework.orm.ibatis.SqlMapClientFactoryBean] for bean with name 'egov.sqlMapClient' defined in file [C:\eGovFrameDev-3.8.0-64bit\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\hotelSys\WEB-INF\classes\egovframework\spring\com\context-sqlMap.xml]; nested exception is java.lang.ClassNotFoundException: org.springframework.orm.ibatis.SqlMapClientFactoryBean at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:321)
MyBatis와 iBATIS 간에는 몇 가지 중요한 차이점이 있습니다. MyBatis는 iBATIS의 후속 프로젝트로서 몇 가지 개선된 기능과 차별점을 제공합니다. 그러나 기본적인 개념은 유사합니다.
현재 에러 메시지는 org.springframework.orm.ibatis.SqlMapClientFactoryBean 클래스를 찾을 수 없다는 것을 나타내며, 이는 여전히 iBATIS 설정을 사용하고 있음을 의미합니다.
MyBatis와 iBATIS 간의 DAO 작성 방법의 주요 차이점은 다음과 같습니다:
iBATIS에서 DAO 작성
iBATIS에서는 DAO 클래스를 작성할 때 SqlMapClient 객체를 사용합니다. iBATIS 설정 파일(sql-map-config.xml)과 SQL 맵 파일이 필요합니다. iBATIS에서는 SqlMapClientTemplate 클래스를 사용하여 SQL 실행을 수행합니다.
MyBatis에서 DAO 작성
MyBatis에서는 DAO 클래스를 인터페이스로 정의하고, MyBatis가 이 인터페이스의 구현체를 자동으로 생성합니다. MyBatis 설정 파일(mybatis-config.xml)과 매퍼 XML 파일이 필요합니다.
MyBatis로 전환하기 위해 필요한 변경 사항
- iBATIS 설정 제거
- 모든 iBATIS 관련 설정을 제거합니다.
- MyBatis 설정 추가
- context-sqlMap.xml 파일을 업데이트하여 MyBatis 설정을 추가합니다.
- MyBatis 매퍼 XML 파일을 작성합니다.
- DAO 인터페이스 작성
- MyBatis 스타일로 DAO 인터페이스를 작성합니다.
아래는 iBATIS 설정을 제거하고 MyBatis로 전환하기 위한 예시입니다:
context-sqlMap.xml 업데이트
기존 iBATIS 설정을 제거하고 MyBatis 설정을 추가합니다.
<?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:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd">
<!-- 환경설정 기본정보를 globals.properties 에서 참조하도록 propertyConfigurer 설정 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:/egovframework/egovProps/globals.properties</value>
<!-- value>file:/product/jeus/egovProps/globals.properties</value-->
</list>
</property>
</bean>
<!-- datasource 설정(propertyConfigurer 활용) -->
<alias name="dataSource-${Globals.DbType}" alias="dataSource" />
<alias name="dataSource-${Globals.DbType}" alias="egov.dataSource" />
<!-- hsql -->
<jdbc:embedded-database id="dataSource-hsql" type="HSQL">
<jdbc:script location="classpath:/db/shtdb.sql"/>
</jdbc:embedded-database>
<!-- mysql -->
<bean id="dataSource-mysql" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${Globals.DriverClassName}"/>
<property name="url" value="${Globals.Url}"/>
<property name="username" value="${Globals.UserName}"/>
<property name="password" value="${Globals.Password}"/>
</bean>
<!-- MyBatis SqlSessionFactory 설정 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource-mysql"/>
<property name="mapperLocations" value="classpath:/egovframework/sqlmap/*.xml"/>
</bean>
<!-- MyBatis SqlSessionTemplate 설정 -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>
</beans>
DAO 인터페이스 작성
MyBatis에서는 DAO 인터페이스를 정의하고 매퍼 XML 파일에서 SQL 문을 매핑합니다.
매퍼 XML 파일 작성
egovframework/sqlmap/UserMapper.xml 파일을 작성하여 SQL 문을 매핑합니다.
package egovframework.let.main.data;
import java.util.List;
public interface UserMapper {
List<User> selectAllUsers();
}
이와 같이 설정을 변경하면 iBATIS 설정을 제거하고 MyBatis로 전환할 수 있습니다. MyBatis 설정이 제대로 적용되었는지 확인한 후 애플리케이션을 다시 시작해 보세요.
2.그냥 오류 된다고 하는 ibatis 관련 api 들고 있는 파일 싹 다 지움, 그랬더니 이거 뜸 이건 내가 써야하는건데..
심각: Context initialized 이벤트를 [org.springframework.web.context.ContextLoaderListener] 클래스의 인스턴스인 리스너에 전송하는 동안 예외 발생
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionTemplate' defined in file [C:\eGovFrameDev-3.8.0-64bit\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\hotelSys\WEB-INF\classes\egovframework\spring\com\context-sqlMap.xml]: Cannot resolve reference to bean 'sqlSessionFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in file [C:\eGovFrameDev-3.8.0-64bit\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\hotelSys\WEB-INF\classes\egovframework\spring\com\context-sqlMap.xml]: Invocation of init method failed; nested exception is org.springframework.core.NestedIOException: Failed to parse mapping resource: 'file [C:\eGovFrameDev-3.8.0-64bit\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\hotelSys\WEB-INF\classes\egovframework\sqlmap\UserMapper.xml]'; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: java.lang.IllegalArgumentException: Mapped Statements collection already contains value for egovframework.let.main.data.UserMapper.selectAllUsers
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:321)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1268)
at org.sp
에러 메시지에 따르면 UserMapper.xml 파일에서 중복된 매핑이 존재하는 것으로 보입니다. egovframework.let.main.data.UserMapper.selectAllUsers에 대한 매핑이 두 번 정의되어 있습니다. 이는 MyBatis가 동일한 매핑 ID를 두 번 읽으려고 할 때 발생하는 일반적인 문제입니다.
이 문제를 해결하기 위해 다음 단계를 따라보세요:
- UserMapper.xml 파일을 확인: UserMapper.xml 파일에서 중복된 매핑 정의가 있는지 확인합니다. 중복된 매핑 정의를 제거하세요.
- Context 설정 확인: context-sqlMap.xml 파일에서 MyBatis 매퍼 설정을 확인합니다. mapperLocations 속성에 동일한 경로가 두 번 이상 포함되어 있는지 확인하고, 중복된 경로를 제거하세요.
- 전체 설정 파일 확인: 설정 파일 전체에서 UserMapper.xml이 중복으로 로드되지 않도록 설정을 확인합니다.
일단 context-sqlMap.xml에서 호출하던 SqlMapClient 설정을 죽임
그랬더니
3. UserService를 수정함
월 27, 2024 11:38:51 오전 org.apache.catalina.core.StandardContext listenerStart
심각: Context initialized 이벤트를 [org.springframework.web.context.ContextLoaderListener] 클래스의 인스턴스인 리스너에 전송하는 동안 예외 발생
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionTemplate' defined in file [C:\eGovFrameDev-3.8.0-64bit\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\hotelSys\WEB-INF\classes\egovframework\spring\com\context-sqlMap.xml]: Cannot resolve reference to bean 'sqlSessionFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in file [C:\eGovFrameDev-3.8.0-64bit\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\hotelSys\WEB-INF\classes\egovframework\spring\com\context-sqlMap.xml]: Invocation of init method failed; nested exception is org.springframework.core.NestedIOException: Failed to parse mapping resource: 'file [C:\eGovFrameDev-3.8.0-64bit\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\hotelSys\WEB-INF\classes\egovframework\sqlmap\UserMapper.xml]'; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing Mapper XML. Cause: java.lang.IllegalArgumentException: Mapped Statements collection already contains value for egovframework.let.main.data.UserMapper.selectAllUsers
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:321)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1268)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
package egovframework.let.main.service;
import java.util.List;
//import javax.annotation.Resource;
//import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import egovframework.let.main.data.User;
import egovframework.let.main.data.UserMapper;
@Service("userService")
public class UserService {
/*
@Resource(name="sqlSessionTemplate")
private SqlSessionTemplate sqlSession;
public List<User> selectAllUsers() {
return sqlSession.getMapper(UserMapper.class).selectAllUsers();
}
*/
@Autowired
private UserMapper userMapper;
public List<User> getAllUsers() {
return userMapper.selectAllUsers();
}
}
4. mybatis-config에 mapper 지정되어 있던걸 삭제함
<mappers>
<mapper resource="egovframework/sqlmap/UserMapper.xml" />
</mappers>
이 부분 삭제
월 27, 2024 11:56:19 오전 org.apache.catalina.core.StandardContext listenerStart
심각: Context initialized 이벤트를 [org.springframework.web.context.ContextLoaderListener] 클래스의 인스턴스인 리스너에 전송하는 동안 예외 발생
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userService': Unsatisfied dependency expressed through field 'userMapper'; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [egovframework.com.cmm.EgovMessageSource] for bean with name 'egovMessageSource' defined in file [C:\eGovFrameDev-3.8.0-64bit\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\hotelSys\WEB-INF\classes\egovframework\spring\com\context-common.xml]; nested exception is java.lang.ClassNotFoundException: egovframework.com.cmm.EgovMessageSource
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
at or
5. 여기서는 mysql 말고 다른 것들 선언 싹 다 없앰, pom.xml , context-datasource.xml 같은 곳에서
Caused by: org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'databaseType' threw exception; nested exception is java.lang.IllegalStateException: Driver for test database type [HSQL] is not available
at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:121)
at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:75)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1566)
... 43 more
6. 성공

7. userlist 호출하니까 또 에러..;
7월 27, 2024 12:35:35 오후 org.apache.catalina.core.StandardWrapperValve invoke
심각: 경로 []의 컨텍스트 내의 서블릿 [action]을(를) 위한 Servlet.service() 호출이, 근본 원인(root cause)과 함께, 예외 [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'net.sf.log4jdbc.DriverSpy'
### The error may exist in file [C:\eGovFrameDev-3.8.0-64bit\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\hotelSys\WEB-INF\classes\egovframework\sqlmap\UserMapper.xml]
### The error may involve egovframework.let.main.data.UserMapper.selectAllUsers
### The error occurred while executing a query
### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'net.sf.log4jdbc.DriverSpy']을(를) 발생시켰습니다.
java.lang.ClassNotFoundException: net.sf.log4jdbc.DriverSpy
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1412)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1220)
at org.apache.commons.dbcp.BasicDataSource.createConnectionFactory(BasicDataSource.java:1420)
at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1371)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)
at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:84)
at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:70)
at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:336)
at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:84)
at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)
at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:434)
at com.sun.proxy.$Proxy33.selectList(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:231)
at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:137)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:75)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53)
at com.sun.proxy.$Proxy34.selectAllUsers(Unknown Source)
at egovframework.let.main.service.UserService.getAllUsers(UserService.java:31)
at egovframework.let.main.web.MainController.userList(MainController.java:41)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:655)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)'개인공부' 카테고리의 다른 글
| [vue3.js]const변수 (0) | 2024.08.04 |
|---|---|
| [eclipse+lombok]lombok 적용하기 (0) | 2024.07.28 |
| [egovFrame]log4j-slf4j-impl cannot be present with log4j-to-slf4j (1) | 2024.07.23 |
| [spring]@Controller와 @RestController의 차이 (0) | 2024.07.17 |
| [vuetify]grid (0) | 2024.07.09 |