MyBatis와 mybatis-spring을 사용하기 위해서 pom.xml 파일에 추가적인 라이브러리들을 설정해야 한다.
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>![]
위의 라이브러리를 적용한 pom.xml은 다음과 같다.
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
각 버전마다 ComPile Dependencies를 확인해서 호환이 잘되는 버전을 확인할 수 있다.
Provided Dependencies 에서는 Version과 Updates를 확인해서 자신의 버전에 맞는 라이브러리를 설치한다.
- root-context.xml에 MyBatis 설정
- MyBatis의 핵심 객체는 SqlSessionFactory타입의 객체
- SqlSessionFactoryBean은 내부적으로 MyBatis의 SqlSessionFactory를 생성
root-context.xml에 다음과 같은 형태로 작성한다.
<!-- HikariCP configuration -->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"
destroy-method="close">
<constructor-arg ref="hikariConfig" />
</bean>
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>
MyBatis가 동작할 때 Mapper를 인식할 수 있도록 root-context.xml
에 추가적인 설정이 필요하다.
<mybatis-spring:scan>
태그의 base-package 속성은 지정된 패키지의 모든 MyBatis 관련 어노테이션을 찾아서 처리한다.
MyBatis-Spring은 mapper 인터터페이스를 이용해서 실제SQL 처리가 되는 클래스를 자동으로 생성한다.
콘솔창에서 쿼리 출력을 확인할 수 있다.
xml파일 생성
DTD와 스키마?
TimeMapper.xml 작성할때는 DTD나 스키마를 가지고 있어야 한다.
DTD를 위와같이 선언하지 않고 코드를 실행하면 DOCTYPE를 매핑시키지 못했다는 오류가 발생한다.
Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 50; Document root element "mapper", must match DOCTYPE root "null".
DTD를 작성한 후에는 아래와 같이 TimeMapper의 쿼리들이 정상적으로 실행됨을 확인할 수 있다.
pom.xml에 depency추가 후 적용 확인
src/main/resources 밑에 log4jdbc.log4j2.properties 파일을 추가한다.
(일반 파일 General>File)
쿼리가 어떤식으로 연결되고 실행되는지 출력을 해주는 역할을 한다.
log4jdbc를 이용하는 경우는 JDBC 드라이버와 URL 정보를 수정해야 한다. root-context.xml의 일부를 수정한다.
쿼리를 확인할 수 있도록 하려면 기존의 JDBC가 아닌 log4jdbc로 변경한다.
oracle하고 direct로 붙는 것이 아닌 Log4jdbc을 이용하고 그에 따라 클래스와 프로토콜을 수정하는 것이다.
properties 파일의 경로를 잘못 지정했더니 오류가 발생했다.
src/main/resouces가 아닌 src/test/resources에 생성하니
다음과 같은 오류가 발생했다.
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'driverClassName' threw exception; nested exception is java.lang.NoClassDefFoundError: Unable to find Log4j2 as default logging library. Please provide a logging library and configure a valid spyLogDelegator name in the properties file.
PropertyAccessException
오류와 함께 나타난 메시지를 분석하면, 두 가지 주요 문제점을 확인할 수 있습니다.
Property 'driverClassName' threw exception;
java.lang.NoClassDefFoundError: Unable to find Log4j2 as default logging library. Please provide a logging library and configure a valid spyLogDelegator name in the properties file.
spyLogDelegator
이름을 properties 파일에 설정하라는 메시지도 포함되어 있습니다. 이 부분은 P6Spy와 같은 라이브러리와 관련된 것 같습니다.어디서 오류가 발생하는지 정확히 알려면 스택 트레이스나 추가적인 코드/환경 설정 정보가 필요합니다. 그러나 기반 정보만으로는 다음과 같은 점검 항목을 제안할 수 있습니다:
pom.xml
또는 build.gradle
파일에서 사용하는 데이터베이스 JDBC 드라이버 라이브러리가 제대로 포함되어 있는지 확인합니다.spyLogDelegator
프로퍼티가 올바르게 설정되어 있는지 확인합니다.이러한 항목들을 점검하고 필요한 라이브러리나 설정을 추가/수정하여 문제를 해결할 수 있습니다.
설정을 변경한 후 기존의 테스트 코드를 실행하면 이전과는 달리 JDBC와 관련된 로그들이 출력되는 것을 볼 수 있다.