티스토리 뷰
1. Spring과 MyBatis 연동
- Spring과 MyBatis를 연동하기 위해서는 SqlSessionFactory 빈을 등록시켜야 한다.
- 스프링은 MyBatis와의 연결을 위한 mybatis-spring 라이브러리를 이용해서 연동한다.
2. 지금까지 Spring 설정한 것 정리
- 1 ) Eclipse Enterprise : Spring Tool 3 Add-on Plug 설치
- + Spring 프로젝트 생성시 도움을 준다.
- + 스프링 설정 등 수행 시, 설정 파일을 미리 생성해 준다.
- + 빈즈 그래프와 같이 개발시 시각적인 도움을 준다.
- 2 ) Spring 프로젝트 생성 후, 우리가 한 것
- + [1] pom.xml 파일에 스프링관련 dependency(라이브러리) 추가
- + AspectJ 2개 라이브러리와 Spring 관련 3개 라이브러리를 추가하였다.
- + [2] pom.xml 파일에 마이바틱스 라이브러리 2개 추가
- + 추가된 마이 바틱스 라이브러리는 SQL 처리와 스프링 연동에 필요하다.
- + [3] Bean 태그로 root-context.xml 파일에 Hikari DataSource 빈 추가
- + [4] Bean 태그로 root-context.xml 파일에 SqlSessionFactoryBean 빈 추가
- + 웹 어플리케이션 개발 시 의존성 주입(DI)을 통해서, 스프링 기반으로 MVC 패턴에 맞게 주입 받기 위해서 빈으로 등록한다.
[ 1. Log4j2 파일 설정 - 히카리CP 로그도 찍히게 하기 ] (*)
[ + 코드 보기 ]
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %5p --- [%10.50t] %-1.50c{1.}.%-1.20M:%L - %m%n%ex"/>
</Console>
</Appenders>
<Loggers>
<Logger name="org.zerock.myapp" level="trace"/>
<Logger name="org.springframework" level="info"/>
<Logger name="com.zaxxer.hikari" level="trace" />
<!-- log4jdbc -->
<logger name="log4jdbc.log4j2" level="info" additivity="false">
<MarkerFilter marker="LOG4JDBC_JDBC" onMatch="DENY" onMismatch="NEUTRAL"/>
<appender-ref ref="Console"/>
</logger>
<Root level="warn">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
[ 2. Spring에 MyBatis를 연동하기 위한 pom.xml 파일 설정 ] (***)
[ + 코드 보기 ]
<?xml version="1.0" encoding="UTF-8"?>
<!-- 1~2칸 띄우기 -->
<project
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.zerock</groupId>
<artifactId>chap04</artifactId>
<version>1.0.0-BUILD-SNAPSHOT</version>
<!-- 웹에 패키징되는 건 war -->
<packaging>war</packaging>
<name>chap04</name>
<url>http://chap04.example.com</url>
<description>Spring MVC project - maven</description>
<!-- 프로젝트 어디서든 가져다 쓸수 있도록 정의 -->
<properties>
<!-- 자바버전 -->
<java-version>11</java-version>
<!-- <java-home>${env.JAVA_HOME}</java-home> -->
<!-- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target> -->
<!-- 스프링버전 -->
<org.springframework-version>5.3.21</org.springframework-version>
<org.aspectj-version>1.9.9.1</org.aspectj-version>
<org.apache.logging.log4j-version>2.17.2</org.apache.logging.log4j-version>
</properties>
<dependencies>
<!-- =============== Logging =============== -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${org.apache.logging.log4j-version}</version>
</dependency>
<!-- For Spring framework, HikariCP, DriverSpy logging -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${org.apache.logging.log4j-version}</version>
</dependency>
<!-- ============= Servlet/JSP ============= -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- =============== AspectJ (스프링할 때 rt, weaver 꼭)=============== -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId> <!-- rt = runtime -->
<version>${org.aspectj-version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!-- ================ Spring (밑의 2개는 최소한 꼭) =============== -->
<!-- spring bean container -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- spring mvc 구동 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- spring test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
<scope>test</scope>
</dependency>
<!-- =============== JDBC =============== -->
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
<version>1.16</version>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8-production</artifactId>
<version>21.5.0.0</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>com.oracle.database.ha</groupId>
<artifactId>simplefan</artifactId>
</exclusion>
<exclusion>
<groupId>com.oracle.database.ha</groupId>
<artifactId>ons</artifactId>
</exclusion>
<exclusion>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>rsi</artifactId>
</exclusion>
<exclusion>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ucp</artifactId>
</exclusion>
<exclusion>
<groupId>com.oracle.database.xml</groupId>
<artifactId>xdb</artifactId>
</exclusion>
<exclusion>
<groupId>com.oracle.database.xml</groupId>
<artifactId>xmlparserv2</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- =============== Testing (버전 4,5 둘다 쓸줄알아야함)=============== -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<!-- ================ DataSource ================= -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.0.1</version>
<!-- 이 부분만 뺀다 -->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- ================ MyBatis ================= -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
<!-- ================ Misc ================= -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>/</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.10</version>
<configuration>
<downloadSources>true</downloadSources>
<downloadJavadocs>false</downloadJavadocs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<release>${java-version}</release>
</configuration>
</plugin>
</plugins>
</build>
</project>
[ 3. root-context.xml에 SqlSessionFactory 빈 등록하기 ] (****)
[ + classpath: ]
[ + 코드 보기 ]
<bean
id="hikariDataSource"
class="com.zaxxer.hikari.HikariDataSource"
destroy-method="close">
<description>HikariCP DataSource</description>
<!-- 생성자 매개변수가 2개 이상일 때 사용할 수 있는 속성 -->
<!-- <constructor-arg name="" value="" ref="" index=""/> -->
<constructor-arg ref="hikariConfig"/>
<!-- ref : 매개변수로 hikariConfig를 사용 -->
</bean>
<!-- MyBatis Configuration -->
<!-- SqlSessionFactory Bean 등록 -->
<bean
id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="hikariDataSource" />
<property name="configLocation" value="classpath:mybatis-config.xml" />
<!-- classpath:는 resources 객체를 만들어 준다. -->
<!-- classpath는 path 환경변수에 등록한 순서대로 파일을 찾아준다. -->
<!-- classpath: = /WEB-INF/classes/..... -->
<!-- /WEB-INF/classes/..... 아래의 파일들을 확인해 준다. -->
<!-- 폴더의 자세한 path는 설정의 Deployment Assembly를 확인하면 된다. -->
</bean>
[ 4. Mybatis-Config.xml 파일 생성 - MyBatis 설정파일 ]
[ + 코드 보기 ]
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
</configuration>
[ 5. pom.xml 파일에 spring-jdbc 추가하기 ] (*)
[ + 코드 보기 ]
<?xml version="1.0" encoding="UTF-8"?>
<!-- 1~2칸 띄우기 -->
<project
xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.zerock</groupId>
<artifactId>chap04</artifactId>
<version>1.0.0-BUILD-SNAPSHOT</version>
<!-- 웹에 패키징되는 건 war -->
<packaging>war</packaging>
<name>chap04</name>
<url>http://chap04.example.com</url>
<description>Spring MVC project - maven</description>
<!-- 프로젝트 어디서든 가져다 쓸수 있도록 정의 -->
<properties>
<!-- 자바버전 -->
<java-version>11</java-version>
<!-- <java-home>${env.JAVA_HOME}</java-home> -->
<!-- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target> -->
<!-- 스프링버전 -->
<org.springframework-version>5.3.21</org.springframework-version>
<org.aspectj-version>1.9.9.1</org.aspectj-version>
<org.apache.logging.log4j-version>2.17.2</org.apache.logging.log4j-version>
</properties>
<dependencies>
<!-- =============== Logging =============== -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${org.apache.logging.log4j-version}</version>
</dependency>
<!-- For Spring framework, HikariCP, DriverSpy logging -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${org.apache.logging.log4j-version}</version>
</dependency>
<!-- ============= Servlet/JSP ============= -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- =============== AspectJ (스프링할 때 rt, weaver 꼭)=============== -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId> <!-- rt = runtime -->
<version>${org.aspectj-version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${org.aspectj-version}</version>
</dependency>
<!-- ================ Spring (밑의 2개는 최소한 꼭) =============== -->
<!-- spring bean container -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- spring mvc 구동 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- spring test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
<scope>test</scope>
</dependency>
<!-- spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.21</version>
</dependency>
<!-- spring-tx manager -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.21</version>
</dependency>
<!-- =============== JDBC =============== -->
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
<version>1.16</version>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8-production</artifactId>
<version>21.5.0.0</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>com.oracle.database.ha</groupId>
<artifactId>simplefan</artifactId>
</exclusion>
<exclusion>
<groupId>com.oracle.database.ha</groupId>
<artifactId>ons</artifactId>
</exclusion>
<exclusion>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>rsi</artifactId>
</exclusion>
<exclusion>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ucp</artifactId>
</exclusion>
<exclusion>
<groupId>com.oracle.database.xml</groupId>
<artifactId>xdb</artifactId>
</exclusion>
<exclusion>
<groupId>com.oracle.database.xml</groupId>
<artifactId>xmlparserv2</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- =============== Testing (버전 4,5 둘다 쓸줄알아야함)=============== -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
<!-- ================ DataSource ================= -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.0.1</version>
<!-- 이 부분만 뺀다 -->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- ================ MyBatis ================= -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.10</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
<!-- ================ Misc ================= -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<finalName>/</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.10</version>
<configuration>
<downloadSources>true</downloadSources>
<downloadJavadocs>false</downloadJavadocs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<release>${java-version}</release>
</configuration>
</plugin>
</plugins>
</build>
</project>
[ 6. 등록한 SqlSessionFactoryBean이 정상 작동되는지 확인하기 ] (***)
[ + 코드 보기 ]
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.extern.log4j.Log4j2;
@Log4j2
@NoArgsConstructor
// JUNIT5 - 테스트 메소드 수행시 Spring FrameWork를 구동시키는 어노테이션
@ExtendWith(SpringExtension.class)
@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/spring/root-context.xml" })
//file: Spring 프로젝트 폴더를 의미한다. ( chap04를 의미 )
//file:에는 공백이 허용되지 않다.
//spring 폴더 -> root-context가 선택된다.
//와일드 카드도 사용이 가능하다.
@TestInstance(Lifecycle.PER_CLASS)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class SqlSessionFactoryTests {
// @BeforeAll
// @BeforeEach
// @Test
// @AfterAll
// @AfterEach
// @Autowired
@Setter(onMethod_= { @Autowired }) // ( 추천 )
private SqlSessionFactory sqlSessionFactory;
@Test
void dummyTest() {
log.trace("\t + dummyTest() invoked.");
} // dummyTest
} // end class
'KH 정보교육원 [ Java ]' 카테고리의 다른 글
KH 110일차 - Spring ( Spring MVC ) (****) (0) | 2022.08.03 |
---|---|
KH 109일차 - Spring ( mybatis-spring : mapper ) (******) (0) | 2022.08.02 |
KH 107일차 - Spring ( 설정 / 히카리CP ) (****) (0) | 2022.07.29 |
KH 106일차 - Spring ( 의존성 주입(DI) ) (*****) (0) | 2022.07.28 |
KH 105일차 - Spring 설치 및 프로젝트 생성 (*****) (0) | 2022.07.27 |