본문 바로가기
Spring

[spring] mapper 어노테이션을 통한 springboot, mybatis 세팅하기

by devjh 2021. 3. 15.
반응형

spring boot로 프로젝트를 생성, Mybatis 연동하는 예제입니다.

 

스프링에서 mybatis를 사용하는 방식은 SqlSession, SqlSessionTemplate을 설정하고

 

selectOne(maper네임스페이스.id, parameter) 등의 메서드를 통해 쿼리를 사용하였지만.

 

스프링부트, mybatis 3.0이상에서는 sqlSessionTemplate을 설정하고, selectone 메서드를 사용하지 않고,

 

복잡한 ~~~context.xml파일이 없어도

 

@mapper 어노테이션을 이용해 메서드명과 xml 파일의 id를 매핑시켜 편리하게 사용 할 수 있습니다.

 

초기 세팅 방법입니다.

 

 

1. application.property

spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.username=sa

# model 프로퍼티 camel case 설정
mybatis.configuration.map-underscore-to-camel-case=true

# xml파일 result type에 패키지명을 생략할 수 있도록 alias 설정
mybatis.type-aliases-package=com.example.mappertut.model

# Mybatis mapper 위치 설정
mybatis.mapper-locations= mybatis-mapper/*.xml

 

 

2. Member.java(com/example/mappertut/model)

package com.example.mappertut.model;

import lombok.Data;

@Data
public class Member {
    private int id;

    private String name;
}

 

# 패키지 result tpye에 명을 생략할 수 있도록 alias 설정
mybatis.type-aliases-package=com.example.mappertut.model

 

application.properties에서 지정했던 aliases-package 위치에 vo를 만들어 줍니다.

 

 

3. MemberMapper.java

package com.example.mappertut.repository;

import com.example.mappertut.model.Member;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface MemberMapper {
    Member getMember(int id);

    List<Member> getMemberList();

    int createMember(Member member);

    int updateMember(Member member);

    int deleteMember(int id);
}

@Mapper 어노테이션을 사용하면 빈으로 등록되며 Service단에서 Autowired하여 사용할 수 있습니다.

메서드명은 추후 Mapper.xml 파일의 id와 동일하게 맞춰줘야 합니다.

 

 

4. MemberService.java

package com.example.mappertut.service;

import com.example.mappertut.model.Member;
import com.example.mappertut.repository.MemberMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class MemberService {

    MemberMapper memberMapper;

    public MemberService(MemberMapper memberMapper) {
        this.memberMapper = memberMapper;
    }

    public List<Member> getMemberList() {
        return memberMapper.getMemberList();
    }

    public Member getMember(int id) {
        return memberMapper.getMember(id);
    }

    public int createMember(Member member) {
        return memberMapper.createMember(member);
    }

    public int updateMember(Member member) {
        return memberMapper.updateMember(member);
    }

    public int deleteMember(int id) {
        return memberMapper.deleteMember(id);
    }
}

MemberMapper를 DI 받아 사용할 수 있습니다.

 

5. MemberMapper.xml(resources/mybatis-mapper/MemberMapper.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">

<mapper namespace="com.example.mappertut.repository.MemberMapper">

    <select id="getMemberList" resultType="Member">
        select * from member
    </select>

    <select id="getMember" resultType="Member">
        select * from member where id = #{id}
    </select>

    <insert id="createMember">
        insert into member(name, id) values(#{name}, #{id})
    </insert>

    <delete id="deleteMember">
        delete from member
        where id = #{id}
    </delete>

    <update id="updateMember">
        update member set name = #{name}
        where id = #{id}
    </update>

</mapper>

# Mybatis mapper 위치 설정
mybatis.mapper-locations= mybatis-mapper/*.xml

 

# 패키지 result tpye에 명을 생략할 수 있도록 alias 설정
mybatis.type-aliases-package=com.example.mappertut.model

 

application.properties 에 설정했던 경로에 xml파일을 생성해주며

resultType은 alias에 패키지명을 생략할 수 있도록 설정하였으므로 vo 클래스명만 입력해줍니다.

 

id는 @Mapper 어노테이션 클래스(인터페이스)에서 선언한 메서드의 이름과 동일하게 맞춰줍니다.

 

Mapper 인터페이스의 구현체는 xml 파일이 되며 서비스단에서 mapper를 호출하면 mybatis를 편하게 사용할 수 있습니다.

 

6. 테스트코드

package com.example.mappertut.service;

import com.example.mappertut.model.Member;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Commit;

import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest
class MemberServiceTest {

    @Autowired
    MemberService memberService;

    @Test
    @DisplayName("전체 조회")
    void test1() {
        List<Member> memberList = memberService.getMemberList();
        for (Member member : memberList) {
            System.out.println("member = " + member.toString());
        }
    }

    @Test
    @DisplayName("단건 조회")
    void test2() {
        Member member = memberService.getMember(1);
        System.out.println("member = " + member.toString());
    }

    @Test
    @Commit
    @DisplayName("생성")
    void test3() {
        Member member = new Member();
        member.setName("Tom");
        member.setId(1);

        int insertCnt = memberService.createMember(member);
        assertThat(insertCnt).isEqualTo(1);
    }

    @Test
    @Commit
    @DisplayName("삭제")
    void test4() {
        int deleteCnt = memberService.deleteMember(1);
        assertThat(deleteCnt).isEqualTo(1);
    }

    @Test
    @Commit
    @DisplayName("업데이트")
    void test5() {
        Member member = new Member();
        member.setId(1);
        member.setName("John");
        int updateCnt = memberService.updateMember(member);
        assertThat(updateCnt).isEqualTo(1);
    }
}

 

7. 결과

생성테스트이후 table 조회

 

업데이트테스트이후 table 조회

 

 

@Mapper 어노테이션과 SpringBoot를 이용하여 mybatis 세팅 예제였습니다.

 

 

반응형

댓글