티스토리 뷰

spring

day5 class03 스프링과 MyBatis 연동

일상다반ㅅㅏ 2019. 2. 24. 18:13

스프링은 Ibatis 연동을 위한 API를 지원하지만 Mybatis 연동에 필요한 API를 제공하진 않는다.

하지만 Mybatis에서 스프링 연동을 위한 API를 지원한다.


1. 라이브러리 내려받기

- mabatis는 순수하게 Mybatis 관련 라이브러리고, mybatis-spring는 Mybatis와 스프링 연동을 위한 라이브러리다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- pom.xml -->
 
<!-- Mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.3.1</version>
</dependency>
    
<!-- Mybatis Spring -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.2.4</version>
</dependency>
cs



2. mybatis 설정 파일 복사 및 수정

- mybatis프로젝트에서 사용했던 board-mapping.xml과 sql-map-config.xml파일을 src/main/resources폴더에 복사한다.

- dataSources는 스프링 설정으로 이미 사용하고 있고 DB연동뿐만아니라 트랜잭션 처리 처럼 다양한 곳에서 사용할 수 있으므로 스프링 설정에서 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- sql-map-config.xml -->
 
<configuration>
    <!-- Alias 설정 -->
    <typeAliases>
        <typeAlias alias="board" type="com.springbook.biz.board.BoardVO"></typeAlias>
    </typeAliases>
    
    <!-- Sql Mapper 설정 -->
    <mappers>
        <mapper resource="mappings/board-mapping.xml" />
    </mappers>
</configuration>
cs



3. 스프링 연동 설정

- SqlSessionFactoryBean 아래에 SqlSessionTemplate 클래스를 등록한다.

- SqlSessionTemplate 클래스에는 Setter 메소드가 없어서 Setter 인젝션 할 수 없다. 따라서 생성자 메소드를 이요한 Constructor 주입으로 처리해야한다. 그러고 나서 DAO 클래스를 구현할 때 SqlSessionTemplate 객체를 @Autowired를 이용하여 의존성 주입 처리하면 SqlSessionTemplate 객체로 DB연동 로직을 처리할 수 있다.

- 교재에는 database.properties를 등록하여 jdbc.~를 사용하는 부분이 안나와있다.

> 내가 지나친건가??

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
<!-- applicationContext.xml -->
 
<!-- DataSource 설정 -->
<context:property-placeholder location="classpath:config/database.properties" />
 
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driver}" />
    <property name="url" value="${jdbc.url}" />
    <property name="username" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
</bean>
    
<!-- Spring JDBC 설정 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"></property>
</bean>
 
<!-- Transaction 설정 -->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"></property>
</bean>
    
<!-- Spring과 Mybatis 연동 설정 -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <property name="configLocation" value="classpath:sql-map-config.xml"></property>
</bean>
    
<bean class="org.mybatis.spring.SqlSessionTemplate">
    <constructor-arg ref="sqlSession"></constructor-arg>
</bean>
cs



4. DAO 클래스 구현

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
32
33
34
35
36
37
38
39
// BoardDAOMybatis.java
 
@Repository
public class BoardDAOMybatis {
    
    @Autowired
    private SqlSessionTemplate mybatis;
 
    // CRUD 기능의 메소드 구현
    // 글 등록
    public void insertBoard(BoardVO vo) {
        System.out.println("===> mybatis로 insertBoard() 기능 처리");
        mybatis.insert("BoardDAO.insertBoard", vo);
    }
    
    // 글 수정
    public void updateBoard(BoardVO vo) {
        System.out.println("===> mybatis로 updateBoard() 기능 처리");
        mybatis.update("BoardDAO.insertBoard", vo);
    }
    
    // 글 삭제
    public void deleteBoard(BoardVO vo) {
        System.out.println("===> mybatis로 deleteBoard() 기능 처리");
        mybatis.delete("BoardDAO.deleteBoard", vo);
    }
    
    // 글 상세 조회
    public BoardVO getBoard(BoardVO vo) {
        System.out.println("===> mybatis로 getBoard() 기능 처리");
        return (BoardVO) mybatis.selectOne("BoardDAO.getBoard", vo);
    }
    
    // 글 목록 조회
    public List<BoardVO> getBoardList(BoardVO vo) {
        System.out.println("===> mybatis로 getBoardList() 기능 처리");
        return mybatis.selectList("BoardDAO.getBoardList", vo);
    }
}
cs



5. MyBatis 연동 테스트

- BoardServiceImpl파일을 수정하여 BoardDAOMybatis 객체를 의존성 주입할 수 있도록 한다.

1
2
3
4
5
6
7
// BoardServiceImpl.java
 
@Service("boardService")
public class BoardServiceImpl implements BoardService {
 
    @Autowired
    private BoardDAOMybatis boardDAO;
cs


6 Dynamic SQL으로 검색 처리
- SQL의 재사용성과 유연성을 향상해준다.
- 게시물 제목/내용 검색 시 다른 파일의 수정없이 board-mapping.xml 검색 쿼리만 수정하면 된다.
- 다른 쿼리에 있는 cdata를 지운것은 <if>가 문자처리되는 것을 방지하기 위해 제거한것으로 보인다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- board-mapping.xml -->
 
<select id="getBoardList" resultMap="boardResult">
    SELECT * 
    FROM BOARD
    WHERE 1 = 1
    <if test="searchCondition == 'TITLE'">
        AND TITLE LIKE '%'||#{searchKeyword}||'%'
    </if>
    <if test="searchCondition == 'CONTENT'">
        AND CONTENT LIKE '%'||#{searchKeyword}||'%'
    </if>
    ORDER BY SEQ DESC
</select>
cs