JdbcTemplate을 사용하다가 Mybatis를 사용하니 편리하기는 한데, Repository에 사용되는 메서드와 중복되는 것이 많아서, 단순 위임하는 케이스가 많아서 좀 비효율적으로 느껴졌다.
@Repository
@RequiredArgsConstructor
public class MybatisBookRepository implements BookRepository {
private final BookMapper mapper;
@Override
public Book save(Book book) {
mapper.save(book);
return book;
}
@Override
public Optional<Book> findById(Long id) {
return mapper.findById(id);
}
...
기능상 지원한다
기능상, BookRepository 인터페이스에 Mapper, Repository 애노테이션을 붙여서 사용이 가능하기는하다. 하지만, 치명적인 단점이 있다.
@Mapper
@Repository
public interface BookRepository {
...
insert를 해주는 메서드가 요소를 반환하는 경우 문제가 된다. 때문에 Mapper과 Repository는 분리해서 써야 한다고 결론을 냈다.
useGeneratedKeys
그러면 Repository에서도 못 쓰는 거 아니냐고 반문할 수 있다. 하지만, useGeneratedKeys와 keyProperty를 설정해주면, 자동으로 객체에 key값을 set해준다.
<insert id="save" useGeneratedKeys="true" keyProperty="bookId">
insert into books (book_name, isbn)
values (#{bookName}, #{isbn})
</insert>
@Override
public Book save(Book book) {
mapper.save(book);
return book;
}