본문 바로가기
IT 개인 공부/JPA

JDBC vs SQL Mapper vs ORM

by Libi 2021. 8. 29.
반응형

데이터를 단순히 메모리에 저장한다면 애플리케이션이 종료될 경우 모든 데이터가 사라지게 된다.

왜냐하면 메모리는 휘발성이기 때문에 데이터의 영속성을 보장해주지 않기 때문이다.

영속성(Persistence)이란 데이터를 생성한 프로그램이 종료되더라도 사라지지 않는 데이터의 특성을 의미한다.

 

따라서 애플리케이션이 종료되어도 데이터를 유지하기 위해서는 영속성을 보장해주는 데이터베이스 같은 저장소에 따로 저장 및 관리해야 한다.

Layered Architecture의 Persistence Layer가 바로 데이터에게 영속성을 부여해주는 계층이다.

 

Java는 Persistenc Layer를 JDBC(Java Database Connectivity)로 구현한다. JDBC를 통해 우리는 영속성이 보장되는 데이터베이스에 접근할 수 있게 된다.

JDBC는 데이터베이스에 접근하기 위한 자바 표준 인터페이스이다.

인터페이스이기 때문에 JDBC API를 이용하면 특정 DBMS에 종속되지 않고, 사용하고자 하는 DBMS를 구현한 JDBC 드라이버만 갈아 끼운다면 MySQL, Oracle 등 다양한 DBMS를 사용할 수 있다.

 

하지만 JDBC를 사용해봤다면 코드가 굉장히 복잡하다는 것을 느낄 수 있다. 실제로 사용되는 SQL 문을 몇 줄 안되지만 DB 연결, 예외 처리 등의 부가적인 요소를 모두 작성해야 하기 때문이다.

또한, 복잡하기 때문에 개발자가 실수할 가능성이 높다.

예외 처리나 Connection 같은 비싼 자원은 더 이상 사용하지 않는다면 반환해줘야 하는데 이러한 부분들을 모두 개발자가 직접 처리해야 하기 때문에 깜빡하고 놓칠 수 있다.

 

이러한 문제점과 불편함을 개선하기 위해 Persistence Framework라는 것이 등장하였다.

그리고 이를 추상화시켜 제공하는 방식에 따라 SQL MapperORM으로 나눌 수 있다.

물론 개발자 입장에서 좀 더 비즈니스 로직에 집중하도록 JDBC를 한 단계 추상화시켜 불필요한 과정을 숨긴 것이기 때문에 우리가 직접 JDBC를 사용하지 않을 뿐이지 내부적으로는 JDBC를 통해 DB에 접근한다.

 

 

SQL Mapper

  • 객체와 SQL 문을 매핑하여 데이터를 객체화
  • SQL 문의 질의 결과와 객체를 매핑해주기 때문에 객체와 관계를 매핑해주는 ORM과 다름
  • SQL 문을 직접 작성하여 데이터베이스의 데이터를 다룸
  • MySQL 같은 SQL 문법을 그대로 사용하기 때문에 새로운 문법을 배울 필요 없음

 

ORM

  • Object-Relational Mapping(객체 관계 매핑)
  • 객체와 데이터베이스의 데이터를 매핑하여 데이터를 객체화
  • 객체는 객체대로 설계하고, 관계형 데이터베이스는 관계형 데이터베이스대로 설계
  • ORM 프레임워크가 이 둘을 중간에서 매핑해줌
  • 객체 간의 관계를 코드로 작성하면 이를 바탕으로 SQL 문을 자동으로 생성해줌

 

SQL Mapper를 사용하는 대표적인 친구로 MyBatis, ORM을 사용하는 대표적인 친구로 JPA가 있다. 이들을 비교해가면서 두 방식의 장단점을 알아보도록 하자.

 

MyBatis

  • SQL Mapper로써 반복적인 JDBC 프로그래밍을 단순화 시킴
  • JDBC만 사용한다면 쿼리를 통해 조회된 결과를 객체에 매핑해야 하는 별도의 코드가 필요
  • MyBatis는 자동으로 해주기 때문에 작성할 필요 없음
  • SQL 쿼리들을 XML 파일에 작성하여 코드와 SQL을 분리하여 관리
  • 코드의 간결성 및 유지보수가 쉬워짐
  • 복잡한 동적 쿼리 작성이 쉬움

 

SQL Mapper를 사용함으로써 JDBC만 사용하는 단점들을 개선하였다. 하지만 SQL Mapper 역시 SQL을 개발자가 결국 다뤄야 하기 때문에 문제점이 존재한다.

  • 사용하는 쿼리 문법이나 데이터 타입에 따라 특정 DBMS에 종속될 수 있음
  • ex) MySQL의 Limit vs Oracle Rownum
  • CRUD 쿼리들은 거의 비슷한데 테이블마다 작성해야 하기 때문에 결국 반복적인 작업임
  • 테이블 필드가 변경되면 관련된 코드들을 수정해야 함
  • 즉, 코드상으로 SQL과 JDBC API를 분리했지만, 논리적으로는 아직 강한 의존성을 가지고 있음
  • 결국 SQL 의존적인 개발을 피할 수 없게 됨
  • 또한, 관계형 DB는 관계를 지향, 객체지향 프로그래밍은 객체를 지향하기 때문에 패러다임 불일치 문제가 발생

 

 

JPA

  • Java Persistence API로써 자바 진영의 ORM 기술 표준
  • SQL 중심적인 개발이 아닌 객체 중심적인 개발
  • JPA는 인터페이스의 모음이며, 이를 구현하는 3가지 구현체가 존재, Hibernate, EclipseLink, DataNucleus

  • Java 애플리케이션과 JDBC API 사이에서 동작

  • 생산성, 유지보수 향상 : Java 코드만 작성해도 자동으로 CRUD를 생성해줌, 변경 시에도 JPA가 처리
  • 상속, 연관관계, 객체 그래프 탐색, 비교하기 등 패러다임의 불일치 문제 해결
  • 1차 캐시와 동일성 보장, 트랜잭션을 지원하는 쓰기 지연, 지연 로딩 등을 통해 성능 최적화 가능
  • JPA는 인터페이스이기 때문에 다형성을 활용하여 관련 부분의 코드들을 변경할 필요 없이 특정 DBMS를 사용한다고 알려주는 코드만 수정하면 되기 때문에 특정 DBMS에 종속적이지 않게 됨
  • 덕분에 객체지향적으로 비즈니스 로직에 더욱 집중할 수 있음

 

ORM을 사용하면 SQL Mapper의 단점들을 개선할 수 있다. 하지만 ORM 역시 단점이 존재한다.

  • 러닝 커브가 존재한다.
  • JPQL 같은 문법이 기존의 SQL 문법과 비슷하지만 조금 다르기 때문에 이를 배워야 함
  • 또한, 동작원리 등을 제대로 이해하지 못한 채로 사용한다면 성능 문제가 발생할 수 있음 (N + 1 문제)
  • 프로젝트가 복잡해지고 커질수록 난이도가 어려워짐
  • 복잡한 쿼리를 사용하기 어렵다. 하지만 Native SQL, JPQL, Query Dsl 등을 활용하면 해결할 수 있음

 

 

 

[ Reference ]

· https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

· https://herbertograca.com/2017/08/03/layered-architecture/

반응형

'IT 개인 공부 > JPA' 카테고리의 다른 글

[JPA] 영속성 컨텍스트  (0) 2021.08.31

댓글