[Spring] ORM, JPA, Hibernate

세상을 바꾸는 개발자·2023년 3월 21일
0

ORM(Object Relational Mapping)

  • 객체 - 관계 매핑
  • 객체라는 개념을 구현한 클래스와 RDB에서 쓰이는 데이터인 테이블을 자동으로 매핑하는 것
  • 데이터베이스를 사용하려면 SQL 쿼리(query)라는 구조화된 질의를 작성하고 실행하는 등의 복잡한 과정이 필요하다.
  • 이때 ORM(object relational mapping)을 이용하면 자바 문법만으로도 데이터베이스를 다룰 수 있다.
  • 즉, ORM을 이용하면 개발자가 쿼리를 직접 작성하지 않아도 데이터베이스의 데이터를 처리할 수 있다. (패러다임 불일치 해결)

쿼리
insert into question (subject, content) values ('안녕하세요', '가입 인사드립니다 ^^');

ORM
Question q1 = new Question();
q1.setSubject("안녕하세요");
q1.setContent("가입 인사드립니다 ^^");
this.questionRepository.save(q1);



JPA(Java Persistance API)

  • 자바에서 데이터를 영구히 기록할 수 있는(DBMS에) 환경을 제공하는 API
  • JPA는 자바 진영에서 ORM의 기술 표준으로 사용하는 인터페이스의 모음이다.
  • JPA를 사용하기 위해서는 JPA를 구현한 Hibernate, DataNucleus, EclipseLink 같은 ORM 프레임워크를 사용해야 한다.
  • 개발자가 JPA를 사용하면, JPA 내부에서 JDBC API를 사용하여 SQL을 호출하여 DB와 통신한다.

장점

  • 객체지향적으로 관리
    JPA를 통해 데이터를 객체지향적으로 관리할 수 있기 때문에 개발자는 비즈니스 로직에 집중할 수 있고 객체지향 개발이 가능하다. Mybatis에서는 비슷한 CRUD SQL을 계속 반복적으로 사용하고, 객체 모델링보다 데이터 중심의 테이블 설계를 우선시했다. 그러다보니 객체지향의 장점인 추상화, 캡슐화, 상속, 다형성을 제대로 사용하지 못하고 객체를 단순히 데이터 전달 목적(VO, DTO)으로만 사용했다.

    예를 들어, SQL 작성을 도와주는 인터페이스인 JDBC 사용을 위해 ERD로 바꿔줘야 하는데, ERD는 단순한 데이터 테이블들이 어떤 관계를 가지고 있는지 나타내는 다이어그램이라 객체지향의 대표적인 특징인 상속을 표현하지 못한다.
    하지만, JPA는 상속관계에 있는 테이블에 대해 Join을 알아서 처리해주는 등 객체지향적으로 관리할 수 있기 때문에 전체 프로그램 구조를 일관되게 유지할 수 있다.

  • SQL 자동 생성: 유지보수가 쉬움
    자바 객체와 DB 테이블 사이의 매핑 설정을 기준으로 SQL을 맞춤으로 생성한다. 객체를 기준으로 SQL을 생성하여 동작하기 대문에 CRUD용 SQL를 직접 작성하지 않아도 되며, 테이블 변경시 JPA의 Entity만 수정하면된다.

  • DBMS에 대한 코드 종속성이 줄어듬
    DBMS란 데이터베이스를 조작하는 소프트웨어이다. JPA를 사용하면 데이터베이스에 종속적이지 않아서 데이터베이스가 변경되더라도 JPA가 해당 데이터베이스에 맞는 쿼리를 알아서 생성해준다.

단점

  • JPA 학습이 어렵고 학습 비용이 높음
  • 통계 데이터 혹은 복잡한 쿼리 사용시 불리함
  • 잘못 사용시 실제 SQL문을 직접 작성하는 것보다 성능이 떨어질 수 있음


Hibernate

  • JPA의 구현체 중 하나이다.
  • SQL을 직접 사용하지 않고 직관적인 코드(메서드)를 사용해 데이터를 조작할 수 있다.
  • Hibernate가 지원하는 메서드 내부에서는 JDBC API가 동작하고 있다. 단지 개발자가 직접 SQL을 작성하지 않을 뿐이다.


JPA vs Mybatis

  • 무조건 JPA가 좋은 것은 아니므로 상황에 맞게 선택한다.
  • JPA는 통계 쿼리처럼 복잡한 SQL을 수행하기는 힘들다.
  • 비즈니스가 매우 복잡하고, 안정성을 중요시 하는 서비스일 경우에는 JPA보다 MyBatis를 작성하는 것이 더 좋을 수 있다.
profile
초심 잃지 않기

0개의 댓글