스프링/6. 스프링 DB-2

21. 마이바티스 적용2

sdafdq 2023. 10. 10. 02:36
@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);
    }
}

ItemMapper가

@Mapper 이거 붙여서

xml이랑 연동되서 뭔가 구현체로 하나 만들어 진 후 빈으로 등록된다.

그래서 주입받을 수 있다.

근데 인텔리제이 문제인지 빨간 줄 뜨기는 하는데, 실행하는 건 문제없다.

 

리포지토리 바꾸고,

 

 

@Repository
@RequiredArgsConstructor
public class MyBatisItemRepository implements ItemRepository {
    private final ItemMapper itemMapper;

    @Override
    public Item save(Item item) {
        itemMapper.save(item);
        return item;
    }

    @Override
    public void update(Long id, ItemUpdateDto updateParam) {
        itemMapper.update(id, updateParam);
    }

    @Override
    public Optional<Item> findById(Long id) {
        return itemMapper.findById(id);
    }

    @Override
    public List<Item> findAll(ItemSearchCond itemSearch) {
        return itemMapper.findAll(itemSearch);
    }
}

여기서 이제 ItemRepository 구현해서 쓰면 됨.

ItemMapper에 우리가

@Mapper
public interface ItemMapper {
    void save(Item item);
    void update(@Param("id") Long id, @Param("updateParam") ItemUpdateDto updateParam);
    Optional<Item> findById(Long id);
    List<Item> findAll(ItemSearchCond itemSearch);
}

save의 반환값은 없지만,

우리가 xml에서

<insert id="save" useGeneratedKeys="true" keyProperty="id">

이렇게 useGeneratedKeys 사용한다고 해줬고 keyProperty는 id라고 하면 item.id에 알아서 들어감.

그리고 객체는 주소를 직접 참조하는 거라 반영이 됨.

 

대충 이런 그림임

 

ItemMapper는 프록시로 생성되어 빈으로 등록됨.

 

 

 

 

@Import(MyBatisConfig.class)
@SpringBootApplication(scanBasePackages = "hello.itemservice.web")
public class ItemServiceApplication {

	public static void main(String[] args) {
		SpringApplication.run(ItemServiceApplication.class, args);
	}

	@Bean
	@Profile("local")
	public TestDataInit testDataInit(ItemRepository itemRepository) {
		return new TestDataInit(itemRepository);
	}
}

MyBatisConfig 설정으로 import 해 줌

 

테스트와 실행 둘다 잘 됨.

 

 

 

MyBatis는 예외번역도 다 알아서 해줌. SQLException -> 스프링에서 제공하는DB접근 기술의 공통적인 Runtime예외

이런 거. 

그리고, DB커넥션, 트랜잭션 관련 기능도 자동으로 MyBatis와 연동하고 동기화 해줌.

 

이런 부분은 MybatisAutoConfiguration 클래스가 자동으로 해 주는거임. 마이바티스 쓰면 기본으로 스프링에 등록되는 거 인 듯.

 

 

'스프링 > 6. 스프링 DB-2' 카테고리의 다른 글

23. JPA  (0) 2023.10.10
22. 마이바티스 기능들.  (0) 2023.10.10
20. 마이바티스 적용 1  (0) 2023.10.10
19. MyBatis 설정  (0) 2023.10.09
18. MyBatis  (0) 2023.10.09