일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- org.mybatis.spring.MyBatisSystemException
- HTTP와 HTTPS의 차이
- 스프링 게시판 만들기
- pom.xml 설정
- @RediretAttribute
- @RequiredArgsConstructor
- 테스트코드 작성
- 톰캣에러
- 쿠키와 세션의 차이
- and Java EE 5
- WAS와 WEB서버 차이
- 코드로 배우는 스프링 웹 프로젝트
- 공개 암호화키
- 정보처리기사 1과목
- 코드로 배우는 스프링 웹프로젝트
- 정보처리기사 해설
- 인터페이스와 추상클래스 차이
- Junit Test 에러
- and 7 Web modules
- 쿠키와 세션의 특징
- 정보처리기사 20년
- java jdk 오류
- Tomcat version 8.5 only supports J2EE 1.2
- 코드로 배우는 스프링부트 웹 프로젝트
- 게시판 만들기
- HTTP
- oracle Database 설정
- 정보처리기사
- 의존성 주입
- java 면접질문
- Today
- Total
모아이티
[게시판 만들기] 코드로 배우는 스프링 웹 프로젝트 Part1 - Mybatis 연동 본문
Mybatis란?
https://mvnrepository.com/artifact/org.mybatis/mybatis/3.5.6
Maven Repository: org.mybatis » mybatis » 3.5.6
mvnrepository.com
https://mvnrepository.com/artifact/org.mybatis/mybatis-spring/2.0.6
Maven Repository: org.mybatis » mybatis-spring » 2.0.6
mvnrepository.com
Mybatis, Mybatis spring maven 추가 후 - update project
그리고 pom.xml에서 spring-text를 복사 후에 spring-tx와 spring-jdbc 추가
<!-- spring-tx 추가 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- spring-jdbc 추가 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
root-context.xml에 sqlSessionFactory 설정하기
<!-- sqlSessionFactory 설정 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>
Test
DataSource.java 클래스에 테스트를 진행합니다.
package org.zerock.persistence;
import java.sql.Connection;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class DataSourceTests {
@Autowired
private DataSource ds;
@Autowired
private SqlSessionFactory sessionFactory;
@Test
public void testConnection() {
// try(Connection con = ds.getConnection()){
// log.info(con);
// }catch (Exception e) {
// log.error(e.getMessage());
// }
}
@Test
public void testConnection2() {
try(SqlSession session = sessionFactory.openSession();
Connection con = session.getConnection()){
log.info(session);
log.info(con);
}catch (Exception e) {
e.printStackTrace();
}
}
}
TimeMapper 인터페이스를 생성해주는데 날짜를 테스트해준다.
root-context.xml - namespace - context 체크 후 패키지 설정
<mybatis-spring:scan base-package="org.zerock.mapper"/>
interface TimeMapper.java
package org.zerock.persistence;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.zerock.mapper.TimeMapper;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class TimeMapperTests {
@Autowired
private TimeMapper timeMapper;
@Test
public void testTime1() {
log.info(timeMapper.getTime());
}
}
이런 에러가 나왔는데 알고 보니 @Test 어노테이션을 설정을 안 했다. 이런 기본적인 실수는 하지 말아야 한다.
어노테이션 추가후 결과는 시간이 나온 걸 볼 수 있다.
mapper 패키지에 있는 인터페이스와 똑같은 파일명과 패키지 폴더명으로 resources 폴더에 폴더 생성
TimeMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.zerock.mapper.TimeMapper">
<select id="getTime2" resultType="string">
select sysdate from dual
</select>
</mapper>
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the Mapped Statement 'org.zerock.mapper.TimeMapper.getTime2'. It's likely that neither a Result Type nor a Result Map was specified.
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:96)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441)
at com.sun.proxy.$Proxy20.selectOne(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:160)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:87)
at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:152)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:85)
at com.sun.proxy.$Proxy22.getTime2(Unknown Source)
at org.zerock.persistence.TimeMapperTests.testTime2(TimeMapperTests.java:28)
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.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:73)
at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:83)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:89)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)
Caused by: org.apache.ibatis.executor.ExecutorException: A query was run and no Result Maps were found for the Mapped Statement 'org.zerock.mapper.TimeMapper.getTime2'. It's likely that neither a Result Type nor a Result Map was specified.
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.validateResultMapsCount(DefaultResultSetHandler.java:289)
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(DefaultResultSetHandler.java:191)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:65)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79)
at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63)
at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325)
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:89)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:76)
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:427)
... 38 more
이 에러가 나온 이유는 Sql은 실행이 됐지만 결과 처리를 위해 resultType을 설정해 줘야 한다.
resultType을 string으로 설정 후 테스트를 거치 고나니 알맞은 시간 결괏값이 나오게 된다.
log4 jdbc-log4 j2 설정
https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4.1/1.16
Maven Repository: org.bgee.log4jdbc-log4j2 » log4jdbc-log4j2-jdbc4.1 » 1.16
org.bgee.log4jdbc-log4j2 log4jdbc-log4j2-jdbc4.1 1.16 // https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4.1 implementation group: 'org.bgee.log4jdbc-log4j2', name: 'log4jdbc-log4j2-jdbc4.1', version: '1.16' // https://mvnre
mvnrepository.com
주의할 점
- 라이브러리 추가
- 설정 DataSource 설정 변경, 프로퍼티 파일 추가
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
src/main/resources 와 src/test/resources에 추가
root-context.xml에서 driverClassName value 값 변경과 jdbcUrl value 값 변경
이 두 설정이 돼있지 않으면 데이터베이스의 로그가 정삭적으로 출력되지 않는다.
<!-- hikariConfig 설정 -->
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"></property>
<property name="jdbcUrl" value="jdbc:log4jdbc:oracle:thin:@localhost:1521:orcl"></property>
<property name="username" value="board"></property>
<property name="password" value="board"></property>
</bean>
테스트 코드를 진행해보면 전과 달리 JDBC와 관련된 로그들이 출력되는 것을 볼 수 있습니다.
'Spring 게시판 만들기' 카테고리의 다른 글
[게시판 만들기] 코드로 배우는 스프링 웹 프로젝트 Part3 - Day1 CRUD 구현 (0) | 2021.03.07 |
---|---|
[게시판 만들기] 코드로 배우는 스프링 웹 프로젝트 Part2 - 스프링MVC (0) | 2021.03.05 |
[게시판 만들기] 코드로 배우는 스프링 웹 프로젝트 Part1 - JDBC 연결 & Hikari CP 커넥션 풀 설정 (0) | 2021.03.02 |
[게시판 만들기] 코드로 배우는 스프링 웹 프로젝트 - Part1 Oracle Database 연동 (0) | 2021.03.02 |
[게시판 만들기] 코드로 배우는 스프링 웹 프로젝트 Part 1 - 의존성 주입 (0) | 2021.03.02 |