[LG CNS AM Inspire Camp 1기] BE - MyBatis vs JPA (feat. DAO vs Repository)

이슬아·2025년 1월 31일

LG CNS AM Inspire Camp 1기

목록 보기
17/20
post-thumbnail

MyBatis vs JPA

백엔드에서 데이터를 저장하고 조회하려면 데이터베이스를 활용해야 하는데,
백엔드에서 데이터베이스를 사용하는 프레임워크로 가장 많이 쓰이는 기술이 ‘Mybatis’와 ‘JPA’이다.

데이터 베이스 접속을 편하게 사용하기 위해 SQL Mapper 기술과, ORM(Object Relational Mapping) 기술을 제공한다.

둘 다 DB와의 연동, 저장을 위한 기술로
SQL Mapper개발자가 작성한 SQL 실행 결과를 객체에 매핑 시켜주는 프레임워크이며,
ORM객체와 DB의 데이터를 자동으로 매핑 시켜주는 프레임워크를 말한다,

SQL Mapper 기술을 제공하는 것이 ‘MyBatis’이며,
ORM 기술을 제공하는 것이 ‘JPA(Java Persistence Api)’이다.

두 가지 기술은 모두 데이터를 관계형 데이터베이스에 저장, 즉 영속화(Persistence) 시킨다는 측면에서는 동일하지만, 서로 다른 접근 방식을 채택하고 있다.

📍 MyBatis란?

MyBatis는 SQL을 직접 작성하면서도 JDBC API를 직접 다루지 않도록 도와주는 SQL Mapper 프레임워크이다.

= SQL을 쉽게 관리하고 실행할 수 있도록 JDBC의 불편한 점을 개선하여 SQL을 XML 또는 애노테이션으로 분리하여 관리할 수 있도록 도와주는 도구

  • SQL 문을 별도로 Java 코드에서 분리해두어서 관리가 편하게 하였으며, 분리된 SQL 문을 MyBatis가 찾아서 실행해줌

  • JPA와 다르게 SQL을 직접 제어할 수 있어 복잡한 쿼리에 유리하다.

  • JDBC로 처리하는 상당 부분의 코드와 파라미터 설정 및 결과 매핑을 대신해준다.

  • 기존에 JDBC를 사용할 때는 DB와 관련된 여러 복잡한 설정들을 다뤄야 했지만,
    SQL Mapper는 Java 객체를 실제 SQL문에 연결함으로써, 빠른 개발과 편리한 테스트환경을 제공한다

즉, MyBatis는 SQL을 직접 관리하면서도, JDBC보다 훨씬 편리하게 DB를 다룰 수 있도록 도와준다!

1️⃣ XML 방식 (Mapper XML 사용)
① MyBatis Mapper XML

<mapper namespace="com.example.UserMapper">
    <select id="getUserById" parameterType="int" resultType="com.example.User">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>

✔ SQL을 XML로 관리하여 코드와 SQL을 분리할 수 있음

② MyBatis 인터페이스 (Mapper)

@Mapper
public interface UserMapper {
    User getUserById(int id);
}

✔ 인터페이스만 정의하면 MyBatis가 구현을 자동 생성해줌

③ Service 계층에서 호출

@Service
public class UserService {
    private final UserMapper userMapper;

    public UserService(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    public User getUserById(int id) {
        return userMapper.getUserById(id);
    }
}

✔ SQL을 직접 작성하면서도 객체로 자동 매핑 가능

📌 2️⃣ 애노테이션 방식 (XML 없이 간단하게 사용)

@Mapper
public interface UserMapper {
    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(int id);
}

✔ SQL을 애노테이션으로 직접 작성 가능 (XML 필요 없음)
✔ 단, 복잡한 SQL일 경우 XML 방식이 유지보수에 더 유리함

MyBatis vs JDBC Template

둘 다 JDBC를 직접 다루지 않도록 도와주는 도구지만, 접근 방식이 다르다.

1️⃣ JDBC Template: SQL을 직접 작성하지만, SQL과 비즈니스 로직이 분리되지 않아서 유지보수가 어려움
2️⃣ MyBatis: SQL을 XML로 분리하여 유지보수가 쉽고, 객체 매핑이 자동화됨

💡 실무에서는 간단한 쿼리는 JDBC Template을 사용할 수도 있지만, 유지보수를 위해 보통 MyBatis 또는 JPA를 사용

📍 JPA(Java Persistence API)란?

JPA는 JDBC 위에서 동작하는 ORM 프레임워크로 SQL을 직접 쓰지 않고, 자바 객체만으로 DB를 쉽게 다룰 수 있게 해주는 도구이다.

MyBatis와 같이 SQL 문과 Java 코드를 연계하는 접근 방식이 아니라 Java 객체와 DB 엔티티(테이블) 자체를 그대로 매핑해서 처리할 수 있는 접근 방식을 채택한 새로운 기술표준이이다.

  • JPA는 SQL 문까지 자동으로 생성해 주고, DB 데이터와 Java 객체를 매핑 시켜준다.
  • JPA는 ORM(Object-Relational Mapping)을 구현하는 자바 표준 스펙으로, 개발자가 객체지향 프로그래밍 언어에서 사용하는 객체 모델과 관계형 데이터베이스의 테이블 간의 매핑을 자동으로 처리해 준다.

DAO vs Repository 차이

  • DAO는 데이터베이스와 직접 연결하여 데이터를 가져오고 저장하는 객체로, SQL을 직접 다룬다.
    👉 JDBC, MyBatis 같은 기술을 사용하여 SQL을 작성
  • Repository는 JPA를 기반으로 데이터를 자동으로 관리하며, SQL을 직접 작성하지 않아도 된다.
    👉 DAO를 더 발전시킨 개념으로, JPA/Hibernate를 활용하여 DB와 객체를 자동으로 매핑

MyBatis와 JPA 차이 정리

둘 다 JDBC 위에서 동작하지만 아래와 같은 차이점들을 정리해볼 수 있다.

✔️ MyBatis에서는 DTO를 두 가지 역할로 사용함
✅ DB에서 SQL 실행 결과를 DTO로 매핑 (데이터 매핑 용도)
✅ 서비스 ↔ 컨트롤러 간 데이터 전달을 DTO로 수행 (객체 간 데이터 전달 용도)

0개의 댓글