JPA

JPA와 MyBatis

euicheol0910 2025. 6. 30. 03:10

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