개키우는개발자 : )

MyBatis(마이바티스) 애플리케이션 작성(2) 본문

JAVA/Spring Framework

MyBatis(마이바티스) 애플리케이션 작성(2)

DOGvelopers 2019. 2. 9. 16:22
반응형

Spring Framework MyBatis(마이바티스) 

애플리케이션 작성(2)



학습 목표

  • Mapper 인터페이스 개념
  • Mapper 인터페이스 작성 및 설정
  • 여러 개의 Mapper 인터페이스 설정



1.Mapper 인터페이스 개념


1-1 MyBatis3.0의 Mapper 인터페이스


Mapper 인터페이스는 Mapping 파일에 기재된 SQL을 호출하기 위한 인터페이스


- Mapper 인터페이스는 SQL을 호출하는 프로그램을 Type Safe 하게 기술하기 위해 MyBatis3.x 부터 등장


- Mapping 파일에 있는 SQL을 자바 인터페이스를 통해 호출할 수 있도록 해줌.


1-2 Mapper 인터페이스를 사용하지 않았을 때



- Mapper 인터페이스를 사용하지 않으면, SQL을 호출하는 프로그램은 SqlSession의 메서드의 아규먼트에 문자열로 

네임스페이스 + "." + SQL ID 로 지정해야 함.


- 문자열로 지정하기 때문에 오타에 의해 버그가 숨어있거나, IDE에서 제공하는 code assist 를 사용할 수 없음.


1-3 Mapper 인터페이스를 사용하였을 때



- UserMapper 인터페이스는 개발자가 작성


- 패키지 이름+ "." +인터페이스 이름+"."+메서드 이름 이 네임스페이스+"."+SQL ID가 되도록 네임스페이스와 SQL의 ID를 설정해야 함.


- 네임스페이스 속성에는 패키지를 포함한 Mapper 인터페이스 이름


- SQL ID에는 매핑하는 메서드 이름을 지정하는 것


2.Mapper 인터페이스 작성 및 설정


2-1 Mapping 파일 수정


namespace 를 myspring.user.dao.UserMapper 로 변경한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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="myspring.user.dao.UserMapper">
    <select id="selectUserById" parameterType="String" resultType="User">
        select * from users where userid=#{userid}
    </select>
    <select id="selectUserList" resultType="User">
        select * from users order by userid
    </select>
    <insert id="insertUser" parameterType="User" >
        insert into users values (#{userid},#{name},#{gender},#{city})
    </insert>
    <update id="updateUser" parameterType="User">
        update users set name=#{name},gender=#{gender},city=#{city} where userid=#{userid}
    </update>
    <delete id="deleteUser" parameterType="String" >
        delete from users where userid =#{userid}
    </delete>
</mapper>
cs


2-2 DAO 클래스 수정


SqlSession 을 주석처리 한후 UserMapper 타입선언 후 자동주입


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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package myspring.user.dao;
 
import java.util.List;
 
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
 
import myspring.user.vo.UserVO;
 
@Repository("userDao")
public class UserDaoImplMapper implements UserDao{
    
    @Autowired
    private UserMapper userMapper;
    
    /*@Autowired
    private SqlSession session;*/
 
    public int insert(UserVO user) {
        int result = 0;
        result = userMapper.insertUser(user);
        System.out.println("등록된 Mapper UserId = " + user.getUserid() + " Mapper Name = " + user.getName());
        return result;
    }
 
    public List<UserVO> readAll() {
        
        List<UserVO> userList = userMapper.selectUserList();
        
        // SqlSession 방법
        //List<UserVO> userList = session.selectList("userNs.selectUserList");
        return userList;
    }
    
    public int delete(String id) {
        int result = 0;
        result = userMapper.deleteUser(id);
        return result;
    }
 
    public int update(UserVO user) {
        int result = 0;
        result = userMapper.updateUser(user);
        return result;
    }
 
    public UserVO read(String id) {
        UserVO user = userMapper.selectUserById(id);
        return user;
    }
 
}
 
cs


2-3 mybatisBeans.xml 에 mapperFactoryBean의 설정


1
2
3
4
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
    <property name="mapperInterface" value="myspring.user.dao.UserMapper" />
    <property name="sqlSessionTemplate" ref="sqlSession" />
</bean
cs

- MapperFactoyBean은 UserMapper를 구현하는 프록시 클래스를 생성하고, 그것을 어플리케이션에 injection 한다.

- 프록시는 런타임 시에 생성되므로, 지정된 Mapper는 실제 구현 클래스가 아닌, 인터페이스여야만 한다.

- MapperFactoryBean은 sqlSessionFactory나 sqlSessionTemplate를 필요로 한다.


3.여러 개의 Mapper 인터페이스 설정


3-1 MapperScannerConfigurer의 사용


- MapperFactoryBean을 이용해 Mapper 인터페이스를 등록할 때 Mapper 인터페이스의 개수가 많아지게 되면 일일이 정의하는데 시간이 많이 걸림.


- Mapper 인터페이스의 수가 많아지면 MapperScannerConfigurer를 이용하여 Mapper 인터페이스의 객체를 한 번에 등록하는 것이 편리함.


- MapperScannerConfigurer를 이용하면 지정한 패키지 아래 모든 인터페이스가 Mapper 인터페이스로 간주되어 Mapper 인터페이스의 객체가 DI 컨테이너에 등록되는 것.


3-2 MapperScannerConfigurer의 설정


1
2
3
4
5
<!-- 여러 개의 Mapper 인터페이스 설정  -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="myspring.user.dao" />
</bean>
cs


basePackage 속성에서 지정하는 것은 Mapper 인터페이스를 검색할 대상이 되는 Package


- myspring.user.dao 아래의 인터페이스들은 모두 Mapper 인터페이스에 대응하여 Mapper 객체가 생성된다는 점


- 예상하지 않은 다른객체가 등록되어 오류가 발생할 수 있음.


3-3 MapperScannerConfigurer의 설정 테스트


위의 설정을 테스트하면 myspirng.user.dao 패키지 하위의 모든 인터페이스를 찾기때문에 충돌이 일어난다.

오류를 해결하기 위해 다음과 같이 설정한다.


3-4 Marker 인터페이스와 Marker 어노테이션의 사용


- 검색의 대상이 되는 Package 아래의 인터페이스들 중에서 Mapper로서 작성한 인터페이스로만 범위를 좁히려면 Marker 인터페이스와 Marker 어노테이션을 작성하여 MapperScannerConfigurer에 설정하면 됨


myspring.user.dao 패키지 하위 -> New -> annotaion -> MyMapper 생성


1
2
3
package myspring.user.dao;
 
public @interface MyMapper {}
cs


UserMapper 인터페이스에 @MyMapper 어노테이션 선언


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package myspring.user.dao;
 
import java.util.List;
 
import javax.sql.DataSource;
 
import myspring.user.vo.UserVO;
 
@MyMapper
public interface UserMapper {
    UserVO selectUserById(String id);
    List<UserVO> selectUserList();
    int insertUser(UserVO userVO);
    int updateUser(UserVO userVO);
    int deleteUser(String id);
}
 
cs


3-5 MapperScannerConfigurer에 Marker 어노테이션 지정


1
2
3
4
5
<!-- 여러 개의 Mapper 인터페이스 설정  -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="myspring.user.dao" />
    <property name="annotationClass" value="myspring.user.dao.MyMapper" />
</bean> 
cs



3-6 MapperScannerConfigurer에 Marker의 설정테스트


1
2
3
4
5
6
@Test
public void getUserTest() {
    UserVO user = service.getUser("user1");
    System.out.println(user);
    assertEquals("name1",user.getName());
}
cs


테스트 완료


1
{"userid":"user1","name":"name1","gender":"여","city":"city1"}
cs


완성된 프로젝트 코드를 다운받으실수 있습니다.

https://dog-developers.tistory.com/30

반응형
Comments