모르지 않다는 것은 아는것과 다르다.

Jdbc

JPA vs MyBatis

채마스 2022. 2. 27. 01:55

SQL Mapper vs ORM

  • Persistence Framework 는 SQL Mapper 와 ORM 으로 나눌 수 있다.

SQL Mapper

  • RDBMS 쿼리문의 실행 결과를 자바 코드에 매핑하는 프레임워크이다.
  • SQL Mapper 메소드를 SQL 실행결과와 매핑한다.
    • Object와 SQL의 필드를 매핑하여 데이터를 객체화한다.
  • SQL문을 이용하여 RDB에 접근, 데이터를 오브젝트(객체)화 시켜준다.
    • 개발자가 작성한 SQL문으로 해당되는 ROW를 읽어 온 후 결과 값을 오브젝트화 시켜 사용가능하게 만들어준다.
    • RDB에 따라 SQL 문법이 다르기 때문에 특정 RDB에 종속적이다.
  • 대표적인 기술로 Mybatis 가 있다.

ORM

  • ORM 은 Object와 DB테이블을 매핑하여 데이터를 객체화하는 기술이다.
  • 객체 관계 매핑, 객체와 RDB를 별개로 설계하고 ORM이 중간에서 매핑해주는 역할을 수행한다.
    • ORM은 SQL문이 아닌 RDB에 데이터 그 자체와 매핑하기 때문에 SQL을 직접 작성할 필요가 없다.
    • 해당 객체와의 매핑에 필요한 SQL문을 알아서 만들어준다.
    • 이로인해 어떤 RDB를 사용하던 상관 없다.
    • SQL문이 아닌 ORM에서 제공하는 메소드, 코드 등을 이용하기에 직관적이다.
  • Hibernate가 SQL을 직접 사용하지 않는다고 해서 JDBC API를 사용하지 않는다는 것은 아니다.
  • 대표적인 기술로 JPA 가 있다.






JPA (Jakarta Persistence API) 란?

  • 자바 진영의 ORM의 기술 표준, 대표적인 오픈 소스가 Hibernate이다.
  • Hibernate가 지원하는 메서드 내부에서는 JDBC API가 동작하고 있으며, 단지 개발자가 SQL을 직접 작성하지 않을 뿐이다.
  • HQL(Hibernate Query Language)이라 불리는 매우 강력한 쿼리 언어를 포함하고 있다.
    • 여기서 HQL이란?
      • SQL과 매우 비슷하며 추가적인 컨벤션을 정의할 수도 있다.
      • 완전히 객체 지향적이며 이로써 상속, 다형성, 관계등의 객체지향의 강점을 누릴 수 있다.
      • HQL쿼리는 자바 클래스와 프로퍼티의 이름을 제외하고는 대소문자를 구분한다.
      • 쿼리 결과로 객체를 반환하며 프로그래머에 의해 생성되고 직접적으로 접근할 수 있다.
      • SQL에서는 지원하지 않는 페이지네이션이나 동적 프로파일링과 같은 향상된 기능을 제공한다.
      • HQL은 여러 테이블을 작업할 때 명시적인 join을 요구하지 않는다





MyBatis 란?

  • 마이바티스는 개발자가 지정한 SQL이나 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다.
  • 마이바티스는 JDBC로 처리하는 상당부분의 코드와 파라미터 설정및 결과 매핑을 대신해준다.
  • 마이바티스는 데이터베이스 레코드에 원시타입과 Map 인터페이스 그리고 자바 POJO 를 설정해서 매핑하기 위해 XML과 애노테이션을 사용할 수 있다.
  • 다시말해, MyBatis는 자바에서 SQL Mapper를 지원해주는 Framework이다.
    • 즉, SQL 작성을 직접 하여 객체와 매핑시켜준다.






JPA 장점

  • 생산성 CRUD 같은 간단한 쿼리는 자동으로 된다.
  • RDB에 종류와 관계없이 사용 가능하다. 추후 DB 변경이나 코드 재활용에 용이하다.
  • 기본적인 CRUD 제공과 페이징 처리 등 상당 부분 구현되어 있어 비지니스 로직에 집중할 수 있다.
  • 테이블 생성, 변경 등 엔티티 관리가 간편하다.
    • entity 에 추가 속성이 생기면 Mybatis 의 경우 쿼리에 각각 다 추가해줘야하지만 JPA는 Entity에 속성만 추가 시켜주면 된다.
  • 쿼리에 집중할 필요 없어 빠른 개발이 가능하다.
    • SQL을 몰라도 된다는 뜻은 아니다.
    • JPA는 SQL을 잘할수록 훨씬 더 잘 사용할 수 있다.
  • SQL 중심적인 개발에서 객체 중심으로 개발 가능하다.
  • 객체의 이점을 활용: 객체간 참조, type-safety
  • DB의 추상화: 특정 DB에 종속된 표현(ex: SQL)이나 구현이 사라지고, DB 변경에 좀 더 유연해진다.





JPA 단점

  • 어렵다.
    • 단방향, 양방향, 임베디드 관계 등 이해해야할 내용이 많으며, 연관관계 이해 없이 잘못 코딩 했을 시 성능상의 문제와 동작이 원하는대로 되지 않는 일이 발생한다.
  • 복잡한 쿼리작성의 어려움이 있다.
    • JPQL을 통해 해결 가능하다.
    • Native SQL로 직접 작성 가능하다.
    • mybatis 와 혼용 가능하다.





MyBatis 장점

  • JPA에 비해 쉽다.
    • SQL 쿼리를 그대로 사용하기에 복잡한 Join, 튜닝 등을 좀더 수월하게 작성 가능하다.
  • SQL의 세부적인 내용 변경 시 좀 더 간편하다.
  • 동적 쿼리 사용 시 JPA보다 간편하게 구현 가능하다.





MyBatis 단점

  • 반복적인 코드와 CRUD SQL 작업이 필요하다.
  • 데이터 베이스 설정 변경 시 수정할 부분이 너무 많다. (Oracle의 페이징 쿼리를 MySQL에서 사용 불가능!)
  • Mapper작성부터 인터페이스 설계까지 JPA보다 많은 설계와 파일, 로직이 필요하다.
  • 특정 DB에 종속적이다.




References

'Jdbc' 카테고리의 다른 글

HikariCP 코드 분석하기 1편 (HikariCP란?)  (0) 2023.01.21
JOOQ (Java Object Oriented Querying)  (0) 2022.03.24
Spring JDBC  (0) 2022.02.27
JDBC  (0) 2022.02.27
Hikari  (0) 2022.02.27