Project/토이 프로젝트

MyBatis와 JPA의 차이, JPA를 선택한 이유는

Lea Hwang 2023. 3. 28. 00:52

현재 면접 스터디를 진행 중에 있습니다.

개인 프로젝트 관련해서 받았던 질문들 중 대답을 잘하지 못했던 부분들은 따로 정리하고자 합니다.

 

 

 

 

질문

 

 

이력서에 기재된 두 포트폴리오를 통해 JPA와 Mybatis 모두 사용해 봤던데, 기술의 차이점이나 
Mybatis나 JPA를 쓰실 때 어떤 이점을 기대하고 사용하신 건지 말씀해 주세요.

 

 

 

 

 

😅 어떤 생각으로 두 기술을 사용했냐면..

국비 과정에서 팀 프로젝트를 할 땐 배웠던 게 Mybatis여서 다른 선택지를 고려하지 않고 사용했습니다.

그 당시 코드를 작성할 때 느꼈던 점은 여기저기 클래스마다 sql을 작성했기에 정작 중요한 로직을 한 눈에 파악하기 어렵고 복잡했다는 것입니다. 다행히 프로젝트는 성공적으로 끝났지만 유지보수를 어디서부터 해야 할지 막막해서 포기했습니다. UI 퀄리티가 좋아서 살리고 싶었지만 차라리 처음부터 만드는 게 나을 것 같단 생각을 했습니다.

 

본격적으로 백엔드로 진로를 잡은 뒤 한국에서는 스프링부트 + JPA 조합이 가장 많이 사용되기도 하고 유지보수 하기 좋다고 하길래 바로 독학을 시작했습니다. 실습과 개인 프로젝트를 하면서 느낀 점은 엔티티만 잘 설계하면 자동으로 테이블도 만들어주고 직접 쿼리를 쓸 일이 많지 않다는 점 이었습니다. 

 

 

즉, 가독성과 유지보수성 때문에 선택한 것인데 전 세계적으로는 어떤 추세이고구체적으로 어떤 장, 단점이 있는지

그리고 Mybatis보다 왜 JPA를 사용해야 하는지 정리하는 시간을 가져보려합니다. 

 

 

 

 

 

전 세계적 트렌트를 살펴보자

구글 트렌드를 통해 살펴봤을때, 지난 5년 동안 JPA의 압승인 것을 알 수 있습니다. 

 

 

그럼 나라별은 어떨까요?

중국, 대한민국, 일본을 제외하면 이번에도 JPA가 압도적인 것을 알 수 있습니다. 

 

 

 

 

MyBatis와 JPA의 주요한 차이점은 DB와의 상호작용 방식이다.

MyBatis는 데이터베이스와 상호작용할 때 개발자가 SQL 쿼리를 직접 작성해 사용하며, 데이터 매핑을 위해 XML 또는 어노테이션을 사용합니다.

 

반면 JPA객체와 관계형 데이터베이스 간의 매핑을 제공하며, JPQL(Java Persistence Query Language)을 사용하여 데이터베이스와 상호작용합니다.

 

 

그래서 JPA의 장점은?

1. 코드를 줄일 수 있습니다. - 더 간단하고 간결한 API를 제공합니다.

2. 개발자 생산성을 향상하고 오류를 줄일 수 있습니다.

3. 타입 안정성이 더 좋고 지연로딩을 통해 애플리케이션 성능을 개선할 수 있습니다. 

4. 다양한 데이터베이스와 함께 사용하거나 다른 JPA 구현체로 전환하는 것이 더 쉽습니다.

5. JPA는 Java EE 명세이므로 서로 다른 애플리케이션 서버 및 환경에서도 호환성을 보장합니다.

6. 대규모 프로젝트나 유연성과 확장성이 필요한 프로젝트에서 더 나은 선택이 될 수 있습니다.

 

 

 

SQL 쿼리를 직접 작성하는 것을 선호하거나 데이터베이스 상호 작용에 대한 더 많은 제어를 원하는 개발자의 경우 MyBatis를 사용할 수 있지만, 그런 게 아니라면 JPA를 사용하여 개발을 간소화하고 애플리케이션 성능을 개선할 수 있습니다.

 

 

 

코드를 통해 알아보겠습니다.

1. id를 통해 단일 엔티티 조회

MyBatis

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

JPA

public interface UserRepository extends JpaRepository<User, Integer> {
  Optional<User> findById(Integer id);
}

 

2. 엔티티 컬렉션 조회

MyBatis

public interface UserMapper {
  @Select("SELECT * FROM users")
  List<User> findAll();
}

JPA

public interface UserRepository extends JpaRepository<User, Integer> {
  List<User> findAll();
}

 

3. 엔티티 추가

MyBatis

public interface UserMapper {
  @Insert("INSERT INTO users (name, email) VALUES (#{name}, #{email})")
  @Options(useGeneratedKeys = true, keyProperty = "id")
  int insert(User user);
}

JPA

public interface UserRepository extends JpaRepository<User, Integer> {
  User save(User user);
}

 

4. 엔티티 업데이트

MyBatis

public interface UserMapper {
  @Update("UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}")
  int update(User user);
}

JPA

public interface UserRepository extends JpaRepository<User, Integer> {
  User save(User user);
}

 

5. id를 이용해서 엔티티 삭제

MyBatis

public interface UserMapper {
  @Delete("DELETE FROM users WHERE id = #{id}")
  int deleteById(int id);
}

JPA

public interface UserRepository extends JpaRepository<User, Integer> {
  void deleteById(Integer id);
}

 

 

 

 

 

 

정리

MyBatis와 JPA의 주요한 차이점은 DB와의 상호작용 방식입니다.
MyBatis의 경우 개발자가 SQL 쿼리를 직접 작성해 사용하며, 데이터 매핑을 위해 XML 또는 어노테이션을 사용합니다.
반면, JPA는 객체와 관계형 데이터베이스 간의 매핑을 제공하며 JPQL을 사용해서 데이터베이스와 상호작용합니다. 

SQL 쿼리를 직접 작성하는 것을 선호하거나 데이터베이스 상호 작용에 대한 더 많은 제어를 원하지 않는 이상 JPA를 사용하여 개발을 간소화하고 애플리케이션 성능을 개선할 수 있습니다.

MyBatis와 비교했을 때 JPA의 장점으로는 더 간단하고 간결한 API를 제공해서 개발자 생산성을 높일 수 있고 오류를 줄일 수 있습니다.  또한 다른 DB와 함께 사용하거나 다른 JPA 구현체로 전환하는 것도 쉬우며 다른 애플리케이션과 호환성이 좋고 유연성과 확장성이 필요한 프로젝트에 더 알맞습니다.