MyBatis와 JPA는 둘 다 데이터베이스와 연동하는 매퍼 프레임워크이다.
MyBatis
SQL Mapper 프레임워크
개발자가 직접 SQL을 작성하고, 그 결과를 Java 객체와 매핑한다.
- 특징
- 복잡한 쿼리 작성이 쉬움
- DB 성능 최적화에 유리
- 쿼리의 실행 순서와 내용을 명확히 알 수 있음
사용 예)
<mapper namespace="com.example.mapper.UserMapper">
<select id="findById" parameterType="long" resultType="User">
SELECT * FROM users WHERE id = #{id}
</select>
<insert id="insertUser" parameterType="User" useGeneratedKeys="true" keyProperty="id">
INSERT INTO users(name, email) VALUES(#{name}, #{email})
</insert>
<update id="updateUser" parameterType="User">
UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}
</update>
<delete id="deleteUser" parameterType="long">
DELETE FROM users WHERE id = #{id}
</delete>
</mapper>
JPA(Java Persistence API)
Java 진영의 ORM(Object-Relational Mapping) 표준 인터페이스
Hibernate가 가장 널리 쓰이는 JPA 구현체
SQL을 직접 작성하지 않고, 객체를 통해 데이터를 조작
- 특징
- Entity 클래스를 통해 DB 테이블과 1:1 매핑
- SQL 대신 JPQL이라는 객체지향 쿼리 사용
- CRUD 자동화: save, findById, delete 등 기본 메서드 제공
- 변경 감지(Dirty Checking), 지연 로딩, 캐시 등 고급 기능 제공
사용 예)
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// getters, setters
}
User user = userRepository.findById(1L).orElseThrow();
user.setEmail("new@email.com");
userRepository.save(user); // update
userRepository.deleteById(1L); // delete
비교
항목 | MyBatis | JPA |
개발방식 | SQL 중심 (명시적) | 객체 중심 (자동화) |
제어권 | 개발자 | 프레임워크 |
복잡한 쿼리 | 유리함 | 다소 불편 (Native Query 필요) |
러닝커브 | 낮음 | 높음 (ORM 개념 학습 필요) |
성능 튜닝 | 직접 튜닝 용이 | 캐시/지연로딩 등으로 복잡할 수 있음 |
트랜잭션 관리 | 수동 (Spring이 도와줄 수 있음) | Spring Data JPA에서 자동 처리 가능 |
언제쓰면 좋을까?
상황 | 추천 |
복잡하고 성능 중요한 SQL이 많다 | ✅ MyBatis |
빠르게 CRUD 구성하고 자동화 활용하고 싶다 | ✅ JPA |
큰 규모의 도메인 모델, 객체 중심 개발 지향 | ✅ JPA |
데이터 중심의 서비스, SQL 최적화 중요 | ✅ MyBatis |
'IT' 카테고리의 다른 글
[데이터] Kaggle (캐글) (0) | 2025.05.05 |
---|---|
[Spring] @Transactional 트랜잭션 어노테이션 (0) | 2025.04.28 |
Redis란? (1) | 2025.04.28 |