Mybatis Mapper 클래스와 Repository 클래스는 동일해도 될까?

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;
}

댓글

개발자  김철준

백엔드 개발자 김철준의 블로그입니다.

주요 프로젝트