1.문제상황
log4jdbc와 mysql을 연동하는 도중 문제가 발생했다.
WARN : org.springframework.context.support.GenericApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in URL [file:src/main/webapp/WEB-INF/spring/root-context.xml]: Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Constructor threw exception; nested exception is java.lang.RuntimeException: Driver net.sf.log4jdbc.sql.jdbcapi.DriverSpy claims to not accept jdbcUrl, jdbc:mysql://localhost:3306/board?useUnicode=true&characterEncoding=utf8
ERROR: org.springframework.test.context.TestContextManager - Caught exception while allowing TestExecutionListener [org.springframework.test.context.support.DependencyInjectionTestExecutionListener@7c711375] to prepare test instance [org.kihyeok.boardservice.dao.BoardDaoImplTest@7bfc3126]
2.문제 해결 과정
에러 메시지를 읽고 구글링도 해본 결과 두 가지 문제점이 있다는 걸 알았다.
첫째는 pox.xml에 mysql드라이버가 설치되어있지 않다.
둘째는 rootcontext.xml에 JdbcUrl 주소가 잘못되어있다.
첫번째 문제를 해결하기 위해 pom.xml에 mysql드라이버를 설치하고 메이븐을 업데이트 했다. 하지만 그래도 똑같은 오류 메시지가 떴다.
<pom.xml설치>
<mysql connector 라이브러리 설치확인>
그래서 jdbcUrl 주소가 잘못됐다고 판단하고 주소를 살펴봤다. 포트번화, 테이블 이름, 아이디와 비밀번호 모두가 틀린게 없었지만, 그래도 똑같은 오류가 떴다.
<rootcontext 설정 내용확인>
아무리 생각해도 jdbc url이 잘못 설정 된 것 같아 다시 살펴보니 log4jdbc가 빠져있었다. drive가 log4jdbc인데 이걸 빼먹으니 당연히 url주소가 안맞다고 할 수 밖에... 그런데
log4jdbc를 설정값으로 추가하니 또 다른 에러가 떴다.
WARN : org.springframework.context.support.GenericApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'boardDaoImpl': Unsatisfied dependency expressed through field 'session'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.apache.ibatis.session.SqlSession' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
mybatis에서 SqlSession에서 요구하는 bean이 빠졌다는 메세지 였다. 즉 bean을 찾을 수 없다는 메시지다. 자세히 살펴보니 rootcontext.xml에 mybatis를 설정하는 사항이 몇 개 빠져있었다. Bean을 등록하기 위한 클래스 패스와 SQL명령을 수행하는데 필요한 메서드인 SqlSessionTemplate을 빼먹어 추가해줬다.
WARN : org.springframework.context.support.GenericApplicationContext - Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in URL [file:src/main/webapp/WEB-INF/spring/root-context.xml]: Invocation of init method failed; nested exception is org.springframework.core.NestedIOException: Failed to parse config resource: class path resource [mybatis-config.xml]; nested exception is org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibatis.builder.BuilderException: Error registering typeAlias for 'BoardDto'. Cause: java.lang.ClassNotFoundException: Cannot find class: org.kihyeok.boardservice.dao.BoardDto
그래도 아직 에러가 발생한다. 에러 메시지를 보니 typeAlias를 잘못 설정했다. typeAilas에서 BoardDto라고 명시된 클래스를 찾을 수 없다는 메시지였다. myBatis-config.xml을 살펴보니 type="org.kihyeok.boardservice.dao.BoardDto"로 잘못 명시 되어있었다. 이를 고쳐주니 올바르게 작동했다.
3.에러 원인
① driverclass와 url 잘못 연결
② mapper를 생성하는 mapper파일 경로를 설정하지 못했다.
③ myBatis-cofig의 typeAlias의 타입 경로를 잘못 설정했다.
4.깨달은 점
①에러 메시지를 잘 읽자
②설정 파일을 제대로 설정하기란 쉽지 않은 일이다.
'기혁씨의 삽질표류기' 카테고리의 다른 글
[기혁씨의 삽질표류기] 디렉토리 경로 문제 (0) | 2024.01.09 |
---|---|
[삽질표류기/JAVA] Static변수/메서드, Instance변수/메서드와 Instance의 관계 (0) | 2023.01.27 |
[삽질표류기/SQL] TO_CHAR와 TO_DATE (0) | 2023.01.09 |
[삽질표류기/문법]변수를 사용하는 이유. (0) | 2023.01.09 |
[삽질표류기/DB] JDBC와 DB연결 설정 (0) | 2022.12.28 |