MyBatis
=> DB/SQL 관련 동작을 쉽게 처리해 주는 프레임워크 (SQL Mapper 라이브러리)
- try-catch-finally 구문, 디비연결, pstmt, rs => 간결하게 처리
MyBatis 사용방식
1) XML만 사용하여 SQL 구문을 처리, DAO에서는 XML코드를 찾아서 실행
- 장점 : SQL 수정 및 유지보수가 우수
- 단점 : 개발 분량이 증가, 복잡도 증가
2) 애노테이션, 인터페이스를 사용한 SQL 구문 사용
- 장점 : DAO객체 없이도 개발가능, 생산성증가
- 단점 : SQL 애너테이션으로 생성하기 때문에, 수정할때 마다 매번 컴파일
3) 인터페이스(애노테이션), XML을 모두 활용한 방식
- 장점 : 간단한 구문은 애노테이션, 복잡한 구문은 XML코드로 표현
- 단점 : 개발자의 능력에 따른 형태가 정확하지 않음
MyBatis 사용하기(XML)
< pom.xml 파일 사전 설정 >
1) pom.xml 파일에 버전 설정
2) test 버전 설정
3) servlet 제일 위에 코드 수정
4) 외부 라이브러리 추가 (test주석 아래에 + dependencies 태그 안에 추가)
<!-- 외부 라이브러리 추가 -->
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</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>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.bgee.log4jdbc-log4j2/log4jdbc-log4j2-jdbc4 -->
<dependency>
<groupId>org.bgee.log4jdbc-log4j2</groupId>
<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
<version>1.16</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.4</version>
</dependency>
<!-- 외부 라이브러리 추가 -->
1- 데이터베이스 생성
- springdb 생성했음
2- 테이블 생성 & 설정
- tbl_member 테이블 생성했음
3- 도메인 객체 설계, 클래스 생성
4- DAO 인터페이스 생성
5 - 인터페이스에 필요한 동작을 구현(추상메서드)
6- XML Mapper 생성 (src/main/resources 아래에 mappers 폴더 안에 ~Mapper.xml 파일)
7 - dtd 설정 / XML Mapper에 SQL 구문 작성
- 파일 위에 Mapper DTD 추가
- Mapper namespace 설정 - 외부에서 호출하기위한 이름. 적절히 판단해서 이름 짓기
<?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="com.itwillbs.mapper.MemberMapper">
<select resultType="string" id="getTime">
select now()
</select>
<insert id="insertMember">
insert into tbl_member (userid,userpw,username,useremail)
values(#{userid},#{userpw},#{username},#{useremail})
</insert>
<update id="update">
update tbl_member
set username=#{username}, useremail=#{useremail}, updatedate=now()
where userid=#{userid} and userpw=#{userpw}
</update>
<delete id="delete">
delete from tbl_member
where userid=#{userid} and userpw=#{userpw}
</delete>
</mapper>
8 - MyBatis에서 Mapper를 인식하도록 root-context.xml 파일에 설정
9 - DAO 객체 생성 - src/main/java 안에 persistence 패키지 안에 DAO 인터페이스 구현해서 생성
package com.itwillbs.persistence;
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
@Repository
public class DBDAOImpl implements DBDAO {
// 디비 연결정보가 필요 => 의존 주입
@Inject
private SqlSession sqlSession;
// DB연결, 자원해제, SQL 실행
// mapper의 위치값(주소) 이름
private static final String NAMESPACE="com.itwillbs.mapper.DBMapper";
@Override
public String getTime() {
String time = sqlSession.selectOne(NAMESPACE+".getTime");
return time;
} // getTime()
}
10 - 스프링에서 필요한 동작 (test할 때)
* @RunWith(SpringJUnit4ClassRunner.class) 애노테이션
* @ContextConfiguration(locations = {"file:src~ root-context.xml"}) 애노테이션
* DAO 생성 - 객체 주입 (@Inject)
* @Test 실행
MyBatis 사용 프로젝트 설정 (요약)
=>
-> DB 생성
-> 프로젝트에서 jdk 버전 변경(1.8)
-> pom.xml 파일 설정 / 프로젝트 Maven Update
-> 패키지 생성 (src/main/java 아래에)
~.domain(VO용) / ~.persistence(DAO용) / ~.service(서비스용)
-> VO 클래스 생성 (dto역할) ( src/main 아래에 ~domain 패키지에 생성)
-> DAO 인터페이스 생성 (DB관련 동작은 src/main아래 ~persistence 패키지에 생성)
-> Service 인터페이스 생성 (src/main 아래에 ~service 패키지에 생성)
-> src/main/resources에 mappers 폴더 생성하고 안에 XML Mapper 생성, 여기에 SQL 구문 작성 (+dtd 설정)
-> root-context.xml 파일에 MyBatis에서 Mapper 인식 + MyBatis 설정 + 디비 연결 SqlSessionFactory 객체 생성 /
root-context.xml 파일 아래 참조 디비 연결 SqlSessionTemplate 객체도 생성
-> DAO 상속받은 클래스 생성 => 0) @Repository, log 생성 / 1) 디비 연결정보(sqlSession) 생성(객체 주입) /
2) mapper 위치값 받아와서(NAMESPACE) 메서드 오버라이딩 (selectOne, selectList, update, delete 등 결과 반환)
-> Service 상속받은 클래스 생성 => 0) @Service, log 생성 / 1) dao 객체 생성(객체 주입)
-> Controller => 0) @Controller, @RequestMapping(기능별 공통주소) / 2) service 객체 생성(객체 주입)
root-context.xml 설정
* SqlSessionFactory 객체 : mybatis <-> spring 연결할 때 필요한 Connection 형성 및 관리
=> Mapper 인식, MyBatis 설정, 디비 연결과 sql 실행할 때 필요한 객체
* SqlSessionTemplate 객체 : 디비 연결, 자원해제, 트랜잭션, 쓰레드 안전성 관리
<?xml version="1.0" encoding="UTF-8"?>
<beans
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans">
<!-- Root Context: defines shared resources visible to all other web components -->
<!-- DataSource객체 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.mysql.cj.jdbc.Driver</value>
</property>
<property name="url" value="jdbc:mysql://localhost:3306/springdb" />
<property name="username" value="root" />
<property name="password" value="1234" />
</bean>
<!-- DataSource객체 -->
<!-- SqlSessionFactory 객체 (디비연결, SQL 처리) -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:/mybatis-config.xml"></property>
<property name="mapperLocations" value="classpath:mappers/**/*Mapper.xml"></property>
</bean>
<!-- SqlSessionFactory 객체 -->
<!-- SqlSessionTemplate 객체 (디비연결, 자원해제, 트랜잭션, 쓰레드안전성) -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">
<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"></constructor-arg>
</bean>
<!-- SqlSessionTemplate 객체 -->
<!-- persistence 패키지 추가 -->
<context:component-scan base-package="com.itwillbs.persistence" />
<!-- service 패키지 추가 -->
<context:component-scan base-package="com.itwillbs.service" />
</beans>
문제 있으면 root-context.xml 우클릭 -> Spring -> Add~ 클릭
기타 설정
< mybatis-config.xml >
src/main/resources 에
1) mybatis-config.xml 파일 생성 => 이 파일에서 mybatis에 관한 설정을 지정할 것임!
2) dtd 파일 생성 (일단 생성만)
원래 맵퍼에서 resultType에 보면 아래와 같이 패키지명을 모두 적어줘야했음.
아래와 같이 mybatis-config.xml에 typeAliases 태그로 패키지를 추가해주면
<?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>
<typeAliases>
<package name="com.itwillbs.domain"/>
</typeAliases>
</configuration>
맵퍼에서 이런식으로 패키지는 제외하고 적어줘도 됨!
< log4j >
root-context에서 dataSource에 아래처럼 log4j 사용하면
<!-- DataSource객체 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="net.sf.log4jdbc.sql.jdbcapi.DriverSpy" />
<property name="url" value="jdbc:log4jdbc:mysql://localhost:3306/springdb" />
<property name="username" value="root" />
<property name="password" value="1234" />
</bean>
<!-- DataSource객체 -->
아래처럼 src/main/resources 아래에 파일 2개 추가
< log4jdbc.log4j2.properties >
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
< logback.xml >
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<!-- log4jdbc-log4j2 -->
<logger name="jdbc.sqlonly" level="DEBUG"/>
<logger name="jdbc.sqltiming" level="INFO"/>
<logger name="jdbc.audit" level="WARN"/>
<logger name="jdbc.resultset" level="ERROR"/>
<logger name="jdbc.resultsettable" level="ERROR"/>
<logger name="jdbc.connection" level="INFO"/>
</configuration>
'3. Back-end > 3-1. Spring MVC - 국비' 카테고리의 다른 글
SpringMVC - [ log 생성 단축키 / 로그 남기기 ] (0) | 2022.06.13 |
---|---|
Spring MVC - [ 외부 라이브러리 연결 ] (0) | 2022.06.09 |
Spring MVC - [ 한글 처리 ] (0) | 2022.06.08 |
Spring MVC - [ Spring 기본 / AOP / 버전 설정 / Maven Update ] (0) | 2022.06.07 |
STS4 설치 (0) | 2022.06.07 |