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을 요구하지 않는다
- 여기서 HQL이란?
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
- https://dreaming-soohyun.tistory.com/entry/JPA%EC%99%80-MyBatis%EC%9D%98-%EC%B0%A8%EC%9D%B4-ORM%EA%B3%BC-SQL-Mapper
- https://jar100.tistory.com/25
- https://jaehoney.tistory.com/29
- https://aonee.tistory.com/59
- https://gmlwjd9405.github.io/2018/05/15/setting-for-db-programming.html
- https://gmlwjd9405.github.io/2018/12/25/difference-jdbc-jpa-mybatis.html
'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 |