Develop

[Persistence] JDBC / MyBatis / JPA 개념 정리 본문

웹 개발/Spring

[Persistence] JDBC / MyBatis / JPA 개념 정리

개발 기록 2024. 1. 24. 07:33

 

Persistence Framework 개념


JDBC 프로그래밍의 복잡함이나 번거로움 없이 간단한 작업만으로

데이터베이스와 연동되는 시스템을 빠르게 개발 할 수 있으며 안정적인 구동을 보장한다.

 

Persistence Framework에는 JPA, Hibernate, Mybatis 등이 있으며

크게 SQL Mapper와 ORM으로 나눌 수 있다.

 

SQL Mapper


SQL <—매핑—> Object 필드


SQL Mapper는 SQL 문장으로 직접 데이터베이스 데이터를 다룬다.
즉, SQL Mapper는 SQL을 명시해줘야 한다.
Ex) Mybatis 등


ORM(Object-Relational Mapping), 객체-관계 매핑


데이터베이스 데이터 <—매핑—> Object 필드


객체를 통해 간접적으로 데이터베이스 데이터를 다룬다.
객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것을 말한다.


ORM을 이용하면 SQL Query가 아닌 직관적인 코드(메서드)로 데이터를 조작할 수 있다.
객체 간의 관계를 바탕으로 SQL을 자동으로 생성한다.
Persistant API라고도 할 수 있다.
Ex) JPA, Hibernate 등

 

 

+)

객체 - DB 매핑해주는 기술로

즉 객체가 테이블이 되도록 매핑 시켜주는 것이다

ORM을 이용하면 SQL Query가 아닌 직관적인 코드(메서드)로 데이터 조작이 가능하다.

Query를 직접 작성하지 않고 메서드 호출만으로도 Query가 수행되기 때문에 생산성이 매우 높다

 

그러나 복잡한 Query를 호출할 때엔 ORM으로는 한계가 있고 Raw Query보다 성능이 좋지않아 느리다는 단점이 존재한다. (JPQL, QueryDSL 등을 사용하거나 한 프로젝트에 MyBatis와 JPA를 같이 사용하기도 한다.)

 

ex) User 테이블의 데이터를 출력할 때 원래 select * from user; 라는 쿼리문을 작성하고 실행해야 하지만

ORM을 사용하면 User테이블과 매핑된 객체를 user라고 할 때 user.findAll() 이라는 메서드를 호출하여 데이터를 조회할 수 있다.

SQL Mapper와 ORM 차이점


ORM은 데이터베이스 객체를 자바 객체로 매핑함으로써 객체 간의 관계를 바탕으로 SQL을 자동으로 생성해주지만

SQL Mapper는 SQL을 명시해줘야 한다.


ORM은 관계형 데이터베이스의 ‘관계’를 Object에 반영하자는 것이 목적이라면

SQL Mapper는 단순히 필드를 매핑시키는 것이 목적이라는 점에서 지향점의 차이가 있다.

 


 

JDBC 개념

 

JDBC는 DB에 접근할 수 있도록 Java에서 제공하는 API로 모든 Java의 Data Access 기술의 근간이다.
즉, 모든 Persistence Framework는 내부적으로 JDBC API를 이용한다.
JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다.

 

자바에서 DB프로그래밍을 하기 위해서 JDBC를 제공하며 기본 JDBC를 사용하는 경우에는 직접 DB Connection 생성, Statement 생성 및 쿼리 수행, 결과값(ResultSet) 처리를 구현해야 한다. 

그러므로 기존 JDBC만을 이용한 코드는 매우 길어지고 같은 코드가 반복된다

또한 SQL의 변경이 필요한 경우에도 자바 프로그램을 수정해야하므로 유연성이 떨어진다.

 

=> 단점을 보완하기 위해서 Persistence Framework를 사용한다

 

 

 

 

 


 

MyBatis란?

객체지향 언어인 JAVA의 관계형 데이터베이스로

프로그래밍을 좀 더 쉽게 할 수 있도록 도와주는 Persistence Framework이다.

 

개발자가 지정한 SQL, 저장 프로시저 그리고 몇 가지 고급 매핑을 지원하는 SQL Mapper로

JDBC로 처리하는 상당 부분의 코드와 파라미터 설정 및 결과 매핑을 대신해준다.

 

MyBatis는 JDBC의 단점들을 개선해주므로 개발자가 작성한 SQL 명령어와 자바 객체를 매핑해주는 기능을 제공하고

기존에 사용하던 SQL 명령어를 재사용하여 코드의 중복과 무의미한 코드 작성을 생략할 수 있다.

또한 SQL문을 xml 파일에 작성하여 변환이 자유롭고 가독성이 좋다

 

기존에 JDBC를 사용할 때는 DB와 관련된 여러 복잡한 설정(Connection)들을 다루어야 했지만

SQL Mapper는 자바 객체를 실제 SQL문에 연결함으로써, 빠른 개발과 편리한 테스트 환경을 제공한다.

 

데이터베이스 record에 원시 타입과 Map 인터페이스 그리고 자바 POJO를 설정해서 매핑하기 위해

xml과 Annotation을 사용할 수 있다.

 

MyBatis는 원래 Apache Foundation의 iBatis였으나, 생산성, 개발 프로세스, 커뮤니티 등의 이유로

Google Code로 이전되면서 이름이 바뀌었다.

 

iBatis와 바뀐 차이점은 아래와 같다.
JDK 1.5, Annotation
Dynatic SQL, XML Element

 

 

 

 

 

 

Mybatis의 특징

장점

  • 간단하며 배우기 쉽다
  • 코드가 줄어들고 간단한 설정으로도 사용 가능하다
  • 데이터 접근 속도를 높여주는 Join매핑(구조적 강점)으로 성능이 향상된다
  • 여러 방식의 데이터 가져오기 전략(가져오기 미루기, SQL 줄이기 기법)이 있다
  • 관심사의 분리 : 설계를 향상(유지보수성) 리소스를 관리하여 계층화를 지원(Connection, PreparedStatement, ResultSet)
  • 작업의 분배 : 팀을 세분화하는 것을 돕는다
  • SQL문이 어플리케이션 소스 코드로부터 완전 분리된다
  • 어떤 프로그래밍 언어로도 구현 가능(이식성 ↑)
  • 오픈소스이며 무료이다
  • SQL 쿼리를 직접 작성하므로 최적화된 쿼리를 구현할 수 있다.
  • 복잡한 쿼리도 SQL 쿼리만 작성할 수 있다면 손쉽게 작성할 수 있다.
  • 엔티티에 종속받지 않고 다양한 테이블을 조합할 수 있다.
  • SQL에 대한 모든 컨트롤을 하고자 할때 매우 적합하다.
  • SQL쿼리들이 매우 잘 최적화되어 있을 때에 유용하다.


단점

  • 애플리케이션과 데이터베이스 간의 설계에 대한 모든 조작을 하고자 할 때는 적합하지 않다.
    애플리케이션과 데이터베이스 간에 서로 잘 구조화되도록 많은 설정이 바뀌어야 하기 때문이다.
  • 스키마 변경시 SQL 쿼리를 직접 수정해주어야 한다.런타임시에 오류를 확인할 수 있다.
  • 데이터베이스 변경시 로직도 함께 수정해주어야 한다.
  • 쿼리를 직접 작성하기 때문에 데이터베이스에 종속된 쿼리문이 발생할 수 있다.
  • 반복된 쿼리가 발생하여 반복 작업이 있다.

 

MyBatis 사용 방식

MyBatis를 이용할 때 SQL문을 사용하는 방식은 크게 3가지로 나뉜다

 

1. xml만을 이용한 SQL문을 설정, DAO에서는 XML을 찾아서 실행하는 코드로 작성하기

- 장점 : SQL문은 별도로 xml로 작성되어 SQL문의 수정이나 유지보수에 적합하다.

- 단점 : 개발 시 코드의 양이 많아지고, 복잡성이 증가한다.

 

2. Annotation과 인터페이스만을 이용하여 SQL문을 설정

- 장점 : 별도의 DAO 없이도 개발가능하여 생산성이 크게 증가한다.

- 단점 : SQL문을 Annotation으로 작성하므로, 수정이 필요할 경우 매번 다시 컴파일 해야한다.

 

3. 인터페이스와 xml로 작성된 SQL문 활용

- 장점 : 간단한 SQL문은 Annotation으로 / 복잡한 SQL문은 xml로 처리하여 유연성이 좋다.

- 단점 : 개발자에 따라 개발 방식 차이로 인해 유지보수가 중요한 프로젝트에서는 부적합하다.

 

 

MyBatis와 JPA 비교

사실 MyBatis와 JPA는 서로 비교 대상이 되지 않는다.
왜냐하면 JPA는 ORM 기술로 분류되고, MyBatis는 SQL Mapper의 한 종류이기 때문이다.
MyBatis는 xml과 Annotation을 사용하여 primitive타입과 Map 인터페이스, 자바 POJO 객체를 설정하여
DB record에 사용할 수 있다.

 

 


JPA( Java Persistence API )

 

Java Persistence API의 약자로 Java ORM 기술에 대한 API 표준 명세를 말한다.

스프링에서 제공하는 것이 아닌 Java에서 제공하는 API이다.

 

JPA는 단순한 명세이기 때문에 JPA만 가지고는 어떤 구현 기술을 사용할 수 없다.

=> 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스로

특정 기능을 하는 라이브러리가 아니다.

 

Spring의 PSA에 의해서(POJO를 사용하면서 특정기술을 사용하기 위해서) 표준 인터페이스를 정해두었는데

그중 ORM을 사용하기 위해 만든 인터페이스가 바로 JPA이다.

 

기존 EJB에서 제공되던 엔티티 빈을 대체하는 기술로

ORM이기 때문에 자바 클래스와 DB테이블을 매핑한다.(SQL을 매핑하지 않음)

 

ORM을 사용하기 위한 인터페이스를 모아둔 것이며 JPA를 사용하기 위해서는

JPA를 구현한 Hibernate, EclipseLink, DataNucleus같은 ORM 프레임워크를 사용해야 한다.

 

실제로 우리가 사용하는 Repository는 Spring Data JPA로 부터 제공되는 기술이다.

Spring Data JPA는 JPA를 간편하게 사용하도록 만들어놓은 오픈 소스일 뿐이다.

이와 비슷한 기술로 다양한 라이브러리가 존재한다.

 

그리고 JPA를 사용하다 보면 Hibernate를 많이 사용하게 되는데 Hibernate는 JPA의 구현체라고 할 수 있다.

Hibernate 이외에도 EclipseLink, DataNucleus 등 다양한 JPA 구현체가 존재한다.

그래도 우리가 Hibernate를 사용하는 이유는 가장 범용적으로 다양한 기능을 제공해주기 때문이다.

 

JPA 구성 요소 (세 가지)


1. javax.persistance 패키지로 정의된 API 그 자체
2. JPQL(Java Persistence Query Language)
3. 객체/관계 메타데이터


사용자가 원하는 JPA 구현체를 선택해서 사용할 수 있다.
JPA의 대표적인 구현체로는 Hibernate, EclipseLink, DataNucleus, OpenJPA, TopLink Essentials 등이 있다.
이 구현체들을 ORM Framework라고 부른다.

 

 

 

JPA의 특징

장점

  • SQL중심적인 개발에서 객체 중심적인 개발이 가능하다                                                                                           (SQL 코드의 반복이 줄어들고 객체지향과 관계지향 데이터베이스의 패러다임 불일치로 인해 SQL 작업에 너무 많은 시간을 할애하지 않아도 된다.)
  • 간단한 매서드를 사용하여 CRUD가 가능하므로 생산성이 향상된다.                                                                              ( ex. jpa.persist(), jpa.find(), member.setName() 등등)
  • 기존에는 필드 변경시 모든 SQL을 수정해야 하지만 JPA는 필드 변경시 SQL은 알아서 처리하기 때문에 유지보수가 쉽다.
  • Object와 RDB간의 패러다임 불일치를 해결할 수 있다.
  • 1차캐시, 쓰기지연, 변경감지, 지연로딩을 제공하여 성능상 이점을 얻을 수 있다.
  • 코드 레벨로 관리 되므로 사용하기 용이하고 생산성이 높다.
  • 컴파일 타임에 오류를 확인할 수 있다.
  • 데이터베이스에 종속적이지 않으므로 특정 쿼리를 사용하지 않아 추상적으로 기술 구현이 가능하다.
  • 엔티티로 관리되므로 스키마 변경시 엔티티만 수정하게 되면 엔티티를 사용하는 관련 쿼리는 자동으로 변경된 내역이 반영된다.
  • 개발 초기에는 쿼리에 대한 이해가 부족해도 코드 레벨로 어느 정도 커버가 가능하다.
  • 객체지향적으로 데이터를 관리할 수 있다.
  • 부족한 부분은 다양한 쿼리 빌더와 호환하여 보안할 수 있다.

 

단점

  • JPA만 사용하여 복잡한 연산을 수행하기에는 다소 무리가 있다.                                                                                 (로직이 복잡하거나 불필요한 쿼리가 발생할 수 있다.)
  • 초기에는 생산성이 높을 수 있으나 점차 사용하다 보면 성능상 이슈가 발생할 수 있다.                                          (N+1, FetchType, Proxy, 연관관계 등)
  • 고도화 될수록 학습 곡선이 높아질 수 있다.                                                                                                                  (성능 이슈의 연장선으로 해결 방안에 따라 복잡한 내부 로직을 이해해야 할 필요가 있다)
  • 처음 접하는 사람에게는 어렵고 장점을 극대화하기 위해서는 알아야할 것이 많다
  • 제대로 이해하지않고 사용하면 데이터 손실이 있을 수 있다(Persistence context)

 


참고한 글

 

[JDBC] JDBC, JPA/Hibernate, Mybatis의 차이 (tistory.com)

 

[JDBC] JDBC, JPA/Hibernate, Mybatis의 차이

JDBC, JPA/Hibernate, Mybatis의 차이를 이해하다. Goal 영속성(Persistence)의 개념을 이해한다. SQL Mapper와 ORM의 차이에 대해 이해한다. JDBC(Data Transfer Object)란 무엇인지 이해한다. JPA/Hibernate란 무엇인지 이해

sugerent.tistory.com

JPA vs MyBatis - Incheol's TECH BLOG (gitbook.io)

 

JPA vs MyBatis - Incheol's TECH BLOG

사실상 MyBatis와 JPA는 비교 대상이 되지 않을 수 있다. 왜냐하면 JPA는 ORM 기술로 분류되고, MyBatis는 SQL Builder 또는 SQL Mapper의 한 종류이기 때문이다. MyBatis는 원래 Apache Foundation의 iBatis였으나, 생산

incheol-jung.gitbook.io

MyBatis란? 기본설정 및 사용방법 (tistory.com)

 

MyBatis란? 기본설정 및 사용방법

개요 JAVA에서 DB 프로그래밍을 하기 위해서 JDBC가 제공되었다. JDBC는 RDB 사용을 위한 다양한 API를 제공하지만, DB가 방대해지고 각 data간 관계가 복잡해짐에 따라 다수의 메소드를 호출하고 관련

oingdaddy.tistory.com

[Spring] JPA란? : 네이버 블로그 (naver.com)

 

[Spring] JPA란?

1. JPA란? JPA란 자바의 ORM 기술 표준 명세로 Java에서 제공하는 API이다 (스프링에서 제공...

blog.naver.com

JPA란? : 네이버 블로그 (naver.com)

 

JPA란?

SQL 중심적인 개발의 문제점 무한반복, 지루한 코드 - CRUD의 반복(INSERT INTO... , U...

blog.naver.com