MyBatis ( http://www.mybatis.org/mybatis-3/ ) 은 SQL 매핑(mapping) 프레임워크
JDBC 코드의 복잡한 작업을 피하는 용도로 사용한다.
mybatis-spring 이라는 라이브러리를통해 쉽게 연동작업을 처리할수있다.
MyBatis 관련 라이브러리 추가
- mybatis
- mybatis-spring
- spring-jdbc
- spring-tx
mybatis / mybatis : MyBatis와 스프링 연동용 라이브러리
spring-jdbc / spring-tx : 스프링에서의 데이터베이스 처리와 트랜잭션처리 (추가하지않은경우 에러발생)
XML 설정
1. pom.xml에 라이브러리를 추가해준다. ( 메이븐 저장소 , pom.xml의 Dependencies )
<!-- 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-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${org.springframework-version}</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>
입력후 메이븐 업데이트 실행
${org-springframework-version} 은 현재 사용하고있는 스프링의 버전을 의미
2. root-context.xml에 <bean>SQLSessionFactory 작성
MyBatis의 가장 핵심적인 객체인 SQLSession , SQLSessionFactiory
SQLSessionFactory : 내부적으로 SQLSession이라는 것을 만들어내는 존재
개발에서는 SQLSession을 통해 Connection을 생성 , 원하는 SQL 전달 , 결과를 리턴 받는 구조로 작성
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
JAVA설정
1. pom.xml에 라이브러리를 추가해준다. ( 메이븐 저장소 , pom.xml의 Dependencies )
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
입력후 메이븐 업데이트 실행
${org-springframework-version} 은 현재 사용하고있는 스프링의 버전을 의미
2. RootConfig 클래스에 @Bean을 이용해 설정
@Bean
public SqlSessionFactory sqlSessionFactiory() throws Exception {
SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
sqlSessionFactory.setDataSource(dataSource());
return (SqlSessionFactory) sqlSessionFactory.getObject();
}
테스트
테스트클래스인 DataSourceTests 클래스에서 SqlSessionFactoryBean을 이용해서 SqlSession을 사용해보는 테스트
@Setter(onMethod_ = {@Autowired})
private SqlSessionFactory sqlSessionFactory;
@Test
public void testMyBatis() {
try(SqlSession session = sqlSessionFactory.openSession();
Connection con = session.getConnection();
){
log.info(session);
log.info(con);
}catch(Exception e) {
e.getMessage();
}
}
정상적으로 실행된다면 아래와 비슷한 로그가 출력되는것을 볼수있다.
스프링과의 연동 처리
SQLSessionFactory를 이용해서 코드를 작성해도 직접 Connection을 얻어서 JDBC 코딩이 가능하지만
더욱 편하게 하기위해서 SQL을 어떻게 처리할것인지 설정을 분리 , 자동으로 처리되는 방식을 이용하는것이 좋다.
MyBatis의 Mapper
SQL과 그에대한 처리를 지정하는 역할
MyBatis-Spring을 이용하는 경우 Mapper를 XML과 인터페이스 + 어노테이션의 형태로 작성할수있다.
Mapper인터페이스
XML설정
1. src/main/java 에서 mapper 패키지를 만들고 TimeMapper라는 인터페이스를 추가한다.
2. TimeMapper 인터페이스에는 MyBatis의 어노테이션을 이용해 SQL을 메서드에 추가한다.
3. Mapper를 작성했다면 MyBatis가 동작할때 Mapper를 인식할수있도록 root-context.xml에 설정을 추가한다.
root-context.xml 파일의 Namespaces항목에서 mybatis-spring 체크
추가해준 mybtis-spring 태그로 san 설정을 해준다.
<mybatis-spring:scan> 태그의 base-package 속성은 지정된 패키지의 모든 MyBatis 관련 오너테이션을 찾아 처리한다.
JAVA설정
1. src/main/java 에서 mapper 패키지를 만들고 TimeMapper라는 인터페이스를 추가한다.
2. TimeMapper 인터페이스에는 MyBatis의 어노테이션을 이용해 SQL을 메서드에 추가한다.
3. 클래스 선언부에 mybatis-spring 에서 사용하고있는 @MapperScan을 이용해서 처리
Mapper 테스트
MyBatis-Spring 은 Mapper 인터페이스를 이용해 실제 SQL 처리가 되는 클래스를 자동으로 생성한다.
개발자들은 인터페이스와 SQL만을 작성하는 방식으로 모든 JDBC 처리를 끝낼수가있다.
1. TimeMapper를 테스트하는 코드를 만들기위해 src/test/java 밑에 TimeMapperTests 클래스를 만들어준다.
@RunWith(SpringJUnit4ClassRunner.class)
//XML설정
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
//JAVA설정
//@ContextConfiguration(classes = {org.zerock.config.RootConfig.class})
@Log4j
public class TimeMapperTests {
@Setter(onMethod_= @Autowired)
private TimeMapper timeMapper;
@Test
public void testGetTime() {
log.info(timeMapper.getClass().getName());
log.info(timeMapper.getTime());
}
}
TimeMapper가 정상적으로 사용이 가능한지를 알아보기위한 테스트 코드
위의 코드가 정상적으로 동작한다면 스프링 내부에는 TimeMapper타입으로 만들어진 스프링객체(bean)이 존재한다는것
XML 매퍼와 같이 사용하기
SQL이 복잡하거나 길어지는 경우에는 어노테이션 보다는 XML을 이용하는 방식을 더 선호한다.
MyBatis-Spring의 경우 Mapper 인터페이스와 XML을 동시에 이용할 수 있다.
XML을 작성해서 사용할때는 XML의 파일위치 , XML 파일에 지정하는 namespace속성이 중요하다
XML파일 위치의 경우 Mapper 인터페이스가 있는곳에 같이 작성하거나
src/main/resources 구조에 XML을 저장할 폴더를 생성한다.
XML파일을 만들때 이름은 Mapper 인터페이스와 같은 이름을 이용하는 것이 가독성에 좋다.
1. src/main/resources 에 src/main/java 에서 Mapper를 만들었던 패키지와 동일한 경로를 폴더생성을 통해 만들어준다.
2. XML 파일에는 MyBatis의 XML 매퍼에서 이용하는 태그에 대한 설정이 필요하다
mybatis.org/mybatis-3/ko/getting-started.html 을 통해 확인이 가능하다.
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">
getTime2 메소드를 XML을 이용해서 SQL을 처리한다.
XML매퍼를 이용할 경우에는 <mapper>태그의 namespace 속성값을 신경써주어야한다.
MyBatis는 Mapper 인터페이스와 XML을 인터페이스의 이름과 namespace속성값을 가지고 판단하기때문
* 위와같이 같은경로 인터페이스가 존재하고, XML의 namespace가 동일한 이름이라면 이를 병합해서 처리한다.
위 경우는 메서드선언은 인터페이스 , SQL에 대한 처리는 XML을 이용하는 방식
<select>태그의 id 속성의 값은 메서드의 이름과 동일하게 맞춰주어야한다.
<select>태그의 resultType 속성은 인터페이스에 선언된 메서드의 리턴타입과 동일하게 맞춰준다.
테스트 결과는 getTime( ) 과 동일하게 나타난다.
log4jdbc-log4j2 설정
MyBatis는 내부적으로 JDBC의 PreparedStatement를 이용해 SQL을 처리한다.
SQL에 전달되는 피라미터는 JDBC에서와 같이 '?' 로 치환되어 처리된다.
복잡한 SQL의 경우에는 이 '?'로 나오는 값이 제대로 되어있는지 확인하기 쉽지않고
실행된 SQL의 내용을 정확히 확인하기 어렵기때문에 SQL을 변환해서
PerparedStatement에 사용된 '?'가 어떤 값으로 처리되었는지 확인하는 기능을 추가한다.
SQL로그를 제대로 보기 위해서 log4jdbc-log4j2 라이브러리를 사용한다.
XML설정
1. pom.xml에 라이브러리를 설정 ( 메이븐 저장소 , pom.xml의 Depencies 로 추가 )
2. 로그 설정 파일을 추가
src/main/resources 밑에 log4jdbc.log4j2.properties 파일을 추가한다.
log4jdbc.log4j2.properties 파일 내용
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
3. JDBC의 연결정보 수정
log4jdbc를 이용하는 경우는 JDBC 드라이버와 URL 정보를 수정해주어야 한다.
xml 설정이기때문에 root-context.xml로 이동해 수정해주도록한다.
root-context.xml
<property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"/>
<property name="jdbcUrl" value="jdbc:log4jdbc:oracle:thin:@localhost:1521:XE"/>
JDBC드라이버와 URL정보 수정코드
테스트해보면 이전과 달리 JDBC와 관련된 로그들이 출력되는것을 확인할수있다.
JAVA 설정
1. pom.xml에 라이브러리를 설정 ( 메이븐 저장소 , pom.xml의 Depencies 로 추가 )
2. 로그 설정 파일을 추가
src/main/resources 밑에 log4jdbc.log4j2.properties 파일을 추가한다.
log4jdbc.log4j2.properties 파일 내용
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
3. JDBC의 연결정보 수정
log4jdbc를 이용하는 경우는 JDBC 드라이버와 URL 정보를 수정해주어야 한다.
JAVA 설정이기때문에 RootConfig클래스로 이동해 수정해주도록한다.
Rootconfig.java
hikariConfig.setDriverClassName("net.sf.log4jdbc.sql.jdbcapi.DriverSpy"); hikariConfig.setJdbcUrl("jdbc:log4jdbc:oracle:thin:@localhost:1521:XE");
JDBC드라이버와 URL정보 수정코드
테스트해보면 이전과 달리 JDBC와 관련된 로그들이 출력되는것을 확인할수있다.
로그의 레벨설정
테스트 코드를 실행하면 많은 양의 로그가 출력되기때문에 로그 레벨을 이용해 수정하는 방법
테스트코드가 실행될때 로그와 관련된 설정은 src/test/resources 의 log4j.xml 을 이용해 설정할수있다.
<logger name="jdbc.audit">
<level value="warn"/>
</logger>
<logger name="jdbc.resultset">
<level value="warn"/>
</logger>
<logger name="jdbc.connection">
<level value="warn"/>
</logger>
기본 설정의 로그는 info 레벨이기때문에 레벨을 warn 로 지정해서 좀 더 높은 레벨의 로그만 기록하게 수정
테스트 코드를 실행하면 이전에 비해 로그의 양이 줄어든것을 확인할수있다.
로그레벨에 대한 자세한설명은 밑의 주소를 참조
'Data Base' 카테고리의 다른 글
[postgreSQL] 문법 정리 (0) | 2021.10.01 |
---|---|
[Oracle] 힌트 사용 문법 (0) | 2021.05.03 |
[공통] 커넥션 풀 설정 (HikariCP) (0) | 2021.04.21 |
[Oracle] 이클립스 11g JDBC 연결 (0) | 2021.04.20 |
[Oracle] 포트번호 ( 확인 , 변경 ) (0) | 2021.04.20 |