-
스프링 부트 Mybatis 설정하고 간단하게 사용해보기SPRING/Mybatis 2022. 10. 20. 22:16반응형
우선 간단하게 Mybatis가 뭔지 알아보고 설정하는 법을 보여드리겠습니다.
마이바티스(Mybatis)는 JdbcTemplate보다 더 많은 기능, 편리성을 가지고 있고,
개발자가 지정한 SQL, 저장프로시저 그리고 몇 가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크입니다.
마이바티스는 JDBC로 처리하는 상당 부분의 코드와 파라미터 설정 및 결과 매핑을 대신해준다.
참고 : https://mybatis.org/mybatis-3/ko/index.htmlbuild.gradle
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0'
(스프링이 공식적으로 지원하는 라이브러리가 아닌 경우는 버전 정보를 적어주셔야 합니다.)
우선, 위와 같이 build.gradle에 mybatis-spring-boot-starter를 추가해줍니다.
라이브러리가 추가된것을 확인했으면
application.properties에 설정을 추가해주셔야 합니다.application.properties
#DB정보 spring.datasource.url=jdbc:h2:tcp://localhost/~/testcase spring.datasource.username=sa spring.datasource.password= # Mybatis 설정 #마이바티스에서 타입정보를 사용할때 패키지명을 생략할수 있도록 alis 설정 (현재 본인 패키지명 입력) mybatis.type-aliases-package=hello.itemservice.domain #관계형 데이터베이스는 주로 언더스코어, 자바 객체는 카멜 표기법을 사용한다. #이 기능을 사용하면 언터스코어 표기법을 카멜 표기법으로 자동 변환해준다.(기본값 : false) mybatis.configuration.map-underscore-to-camel-case=true #MyBatis에서 실행되는 쿼리 로그를 확인할 수 있다. logging.level.hello.itemservice.repository.mybatis=trace
모든 설정은 끝이 났고, 마이바티스를 사용해보겠습니다.
먼저 마이바티스 Mapper XML 파일을 만들기 전에 이 Mapper 파일을 호출해주는
인터페이스를 만들어보겠습니다.(패키지 위치를 눈여겨봐주세요)package hello.itemservice.repository.mybatis; import hello.itemservice.domain.Item; import org.apache.ibatis.annotations.Mapper; import java.util.Optional; @Mapper //Mybatis에서 인식 할수 있게 붙여주는 어노테이션 public interface ItemMapper { void save(Item item); Optional<Item> findById(Long id); }
이제 실행할 SQL이 있는 Mapper XML 파일을 만들겠습니다.
(자바 코드가 아니므로 src/main/resources 아래에 만들어줍니다.)
중요한 점은, 위 Mapper Interface의 패키지 위치, 파일명을 맞춰줘야 합니다.더보기만약, XML 파일을 원하는 위치에 작성하고 싶다면,
application.properties에 mybatis.mapper-locations=classpath:mapper/**/*.xml 으로 작성하면 된다.
이렇게 하면 resources/mapper를 포함한 그 하위 폴더에 있는 XML을 XML 매핑 파일로 인식한다.
이경우 파일 이름은 자유롭게 설정해도 된다.
Mapper Interface의 save,findById를 XML에 작성해보겠습니다.(src/main/resources/hello/itemservice/repository/mybatis/ItemMapper.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="hello.itemservice.repository.mybatis.ItemMapper"> <insert id="save" useGeneratedKeys="true" keyProperty="id"> insert into item (item_name, price, quantity) values (#{itemName}, #{price}, #{quantity}) </insert> <select id="findById" resultType="Item"> select id, item_name, price, quantity from item where id=#{id} </select> </mapper>
● id에는 Mapper Interface에 설정한 메서드 이름을 지정하면 된다.
● 파라미터는 #{} 문법을 사용하고, 매퍼에서 넘긴 객체의 프로퍼티 이름을 적어준다.
● useGeneratedkeys는 데이터베이스가 키를 생성해 주는 IDENTITY 전략일 때 사용한다.
● keyProperty는 생성되는 키의 속성 이름을 지정한다.
● resultType은 반환 타입을 명시하면 되는데, 이때 아까 application.properties에 설정한
mybatis.type-aliasespackage 덕분에 패키지명은 생략할 수 있다.
또한 마찬가지로 mybatis.configuration.map-underscore-to-camel-case=true 설정 덕분에
언더스코어를 카멜 표기법으로 자동으로 처리해준다. (item_name -> itemName)참고 정보
Item.class, ItemServiceV1.class,
MyBatisItemRepository.class, db스키마@Data @NoArgsConstructor public class Item { private Long id; private String itemName; private Integer price; private Integer quantity; public Item(String itemName, Integer price, Integer quantity) { this.itemName = itemName; this.price = price; this.quantity = quantity; } }
@Service @RequiredArgsConstructor public class ItemServiceV1 implements ItemService { private final ItemRepository itemRepository; @Override public Item save(Item item) { return itemRepository.save(item); } @Override public Optional<Item> findById(Long id) { return itemRepository.findById(id); } }
@RequiredArgsConstructor @Repository public class MyBatisItemRepository implements ItemRepository { private final ItemMapper itemMapper; @Override public Item save(Item item) { itemMapper.save(item); return item; } @Override public Optional<Item> findById(Long id) { return itemMapper.findById(id); } }
이제 마지막으로 Bean설정만 해주고 테스트를 해보겠습니다.
@Configuration @RequiredArgsConstructor public class MyBatisConfig { private final ItemMapper itemMapper; @Bean public ItemService itemService(){ return new ItemServiceV1(itemRepository()); } @Bean public ItemRepository itemRepository(){ return new MyBatisItemRepository(itemMapper); } }
테스트해보기
@Transactional @SpringBootTest class ItemRepositoryTest { @Autowired ItemRepository itemRepository; TransactionStatus status; @Test @Rollback(value = false) void saveAndFindById() { //given Item item = new Item("itemA", 10000, 10); //when Item savedItem = itemRepository.save(item); //then Item findItem = itemRepository.findById(item.getId()).get(); assertThat(findItem).isEqualTo(savedItem); } }
지금까지 Mybatis를 설정해보고 간단하게 사용해보았습니다.
감사합니다.참고 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-2/dashboard
반응형