JPA는 자바 ORM(Object-Relational Mapping) 표준 인터페이스입니다.
즉, 자바 객체와 데이터베이스 테이블을 자동으로 매핑해주는 역할을 합니다.
특징
- SQL을 직접 작성하지 않고, 객체 중심으로 데이터 처리
- @Entity, @Id, @OneToMany 같은 어노테이션으로 매핑
- 대표 구현체: Hibernate, EclipseLink
- 쿼리 언어(JPQL, Native Query) (SELECT u FROM User u WHERE u.name = :name)
- CRUD 자동화: JpaRepository 등을 통해 기본 CRUD 메서드 자동 제공
- 1차 캐시(영속성 컨텍스트)로 트랜잭션 범위 내 같은 객체는 중복 쿼리 안 함
@Entity
public class User {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
}
public interface UserRepository extends JpaRepository<User, Long> {
// 기본 제공 메서드 외에 커스텀 메서드도 선언 가능
List<User> findByName(String name);
}
@Service
@RequiredArgsConstructor
public class UserService {
private final UserRepository userRepository;
// 등록
public User saveUser(String name, String email) {
User user = new User();
user.setName(name);
user.setEmail(email);
return userRepository.save(user); // INSERT
}
// 단건 조회
public User getUser(Long id) {
return userRepository.findById(id)
.orElseThrow(() -> new RuntimeException("사용자 없음"));
}
// 전체 조회
public List<User> getAllUsers() {
return userRepository.findAll(); // SELECT * FROM user
}
// 이름으로 조회
public List<User> findByName(String name) {
return userRepository.findByName(name);
}
// 삭제
public void deleteUser(Long id) {
userRepository.deleteById(id);
}
}
// JpaRepository<T, ID> 기본 메서드
save(T entity); // 등록 & 수정
findById(ID id); // 단건 조회
findAll(); // 전체 조회
deleteById(ID id); // 삭제
existsById(ID id); // 존재 여부 확인
count(); // 개수 조회
@Transactional
public void example() {
User user1 = em.find(User.class, 1L);
User user2 = em.find(User.class, 1L);
}
MyBatis는 SQL Mapper 프레임워크입니다.
즉, 직접 SQL을 작성하고 그 결과를 객체에 매핑합니다.
특징
- SQL을 명시적으로 작성 → 복잡한 쿼리 제어에 유리
- XML 또는 어노테이션 기반 매핑
- JDBC보다 생산성 높지만 JPA보다는 수동 작업 많음
<select id="findUserById" resultType="User">
SELECT * FROM users WHERE id = #{id}
</select>
| 항목 | JPA (Hibernate) | MyBatis |
| 방식 | ORM(Object-Relational Mapping) | SQL 매핑 기반 (SQL Mapper) |
| 쿼리 | 직접 SQL 거의 없음 (JPQL 또는 메서드 기반) | SQL을 XML이나 어노테이션에 직접 작성 |
| 추상화 수준 | 엔티티 중심 (객체 중심) | SQL 중심 (쿼리 중심) |
| 학습 곡선 | 비교적 높음 (설정 많고 자동화가 많음) | 비교적 쉬움 (SQL 직접 작성 가능) |
| 코드 유지보수 | 엔티티 중심으로 유지보수 편리 | SQL이 많아질수록 관리 어려움 |
| 복잡한 JOIN | 어렵고 장황함 | 자유롭고 명시적으로 작성 가능 |
| 트랜잭션 | 스프링의 @Transactional으로 일괄 관리 | 마찬가지지만 SQL 중심으로 개별 관리 쉬움 |
둘을 동시에 사용할 수 있을까?
JPA와 MyBatis를 동시에 사용하는 것이 가능하며, 실제 실무에서도 특정 상황에 따라 병행 사용합니다.
- JPA는 CRUD + 단순 쿼리에 편리
- MyBatis는 복잡한 JOIN + 커스텀 SQL 튜닝에 유리
그래서 기본은 JPA, 복잡한 조회는 MyBatis를 쓰는 하이브리드 구조가 자주 사용됩니다.
상황에 맞게 선택하여 사용하면 사용자에게 많은 도움이 될 것 입니다.
'JPA' 카테고리의 다른 글
| 영속성과 영속성 컨텍스트에 대하여 (0) | 2025.07.14 |
|---|