Server Programming/SpringBoot

Spring Boot - ORM, JPA, Spring data

Dev.BeryL 2022. 2. 1. 13:15
728x90

ORM - DB에 많은 신경을쓰지 않고, OOP를 가능하게하는 프로그래밍 기법

JPA - Java ORM 기술에 대한 API 표준 명세(인터페이스)

Hibernate - JPA를 사용하는 프레임워크

Spring Data JPA - JPA를 쉽게 사용하기 위해 스프링에서 제공하는 인터페이스

 

추상화 정도

Spring Data JPA -> JPA -> Hibernate -> Datasource(DB)

 

어플리케이션이 발전하면서 내부의 복잡성은 커짐.

 

OOP는 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공.

 

RDBMS는 데이터 중심으로 구조화, 집합적인 사고 필요. (추상화, 상속, 다형성 같은 개념이 없다).

 

Object와 RDB의 패러다임 불일치.

->패러다임 불일치 문제를 해결하는데 시간과 코드 소비.

RDBMS Table 설계와 객체 모델링을 같이 할 경우…

  • DB 설계에 중점을 둘 경우 -> 객체 지향의 장점 X
  • 객체 모델링에 중점을 둘 경우 -> DB CRUD 작업이 어려워짐(복잡한 SQL 작성)> Object와 RDBMS를 연결하는 중간자(Mapper) 필요!

JPA(ORM)

  • 장점
  1. RDB에 종류와 관계없이 사용 가능하다. (추후 DB 변경이나 코드 재활용에 용이)
  2. 기본적인 CRUD 제공과 페이징 처리 등 상당 부분 구현. (비지니스 로직에 집중 가능)
  3. 테이블 생성, 변경 등 엔티티 관리가 간편하다.
  4. Query 작성에 집중할 필요 X, 빠른 개발이 가능하다.
  • 단점

초기 러닝커브단방향, 양방향, 임베디드 관계 등 이해해야할 내용이 많다. (연관관계 이해 없이 잘못 코딩 했을 시 성능상의 문제와 동작이 원하는대로 되지 않는 일이 발생)

 

MyBatis(SQL Mapper)

  • 장점
  1. JPA에 비해 쉽다.
  2. SQL의 세부적인 내용 변경 시 좀 더 간편하다.
  3. 동적 쿼리 사용 시 JPA보다 간편하게 구현 가능.
  • 단점
  1. 데이터 베이스 설정 변경 시 수정할 부분이 너무 많다. (Oracle의 페이징 쿼리를 MySQL에서 사용 불가)
  2. Mapper작성부터 인터페이스 설계까지 JPA보다 많은 설계와 파일, 로직이 필요하다.

ORM을 위한 기술 표준

  • 개발자는 메소드만 호출하면 JPA가 SQL로 변환해서 DB에 전송. 얻은 결과 역시 객체로 자동 매핑
  • 필요할땐 JPA에서 쿼리를 직접 작성하여 사용가능

저장 : jpa.persist(member)

조회 : Member member = jpa.find(Member.class, member id)

수정 : member.setName(“change_name”)

연관객체 조회 : Team team = member.getTeam();

JPA는 크게 2가지 기능을 제공

  1. Entity와 Table의 Mapping
  2. Entity를 실제적으로 사용하는 Entity Manager

Entity Manager는 Entity에 대해 CRUD 작업을 진행   -> Entity를 관리하는 가상의 DB

EntityManager em = emf.createEntityManager();

  • Entity Manager
  • Entity를 DB에 CRUD하는 작업을 담당.
  • Entity를 관리하는 가상의 DB
  • 하나의 Persistence Context 를 보유.

Persistence

  • 프로그램이 종료되어도 생성된 데이터가 사라지지 않는 특성
  • 영속성을 갖지 않을경우… 프로그램이 종료시 생성된 데이터는 모두 사라진다.
  • 데이터를 파일이나 DB에 영구 저장함으로써 데이터에 영속성을 부여한다. => Persistence Contextem.persist(member);

Persistence Context (Entity Manager)

  • Entity를 영구히 저장하는 환경
  • 1차 캐시를 지원, 엔티티의 수정이 잦을 경우 DB 접근없이 CRUD 작업 가능
  • 1차 캐시에 있는 엔티티는 동일성을 보장. (캐싱 기능)
  • 쓰기 지연 저장소를 구현, SQL 저장/삭제를 최적화. (버퍼링 기능, 지연 로딩)
  • 변경된 엔티티가 있을 경우, 변경을 감지하여 Update SQL 실행 (Dirty Checking)

  • New/Transient 영속성 컨텍스트와 전혀 관계가 없는 상태
  • Managed - 영속성 컨텍스트에 저장된 상태
  • Detached - 영속성 컨텍스트에 저장되어 있다가 분리된 상태
  • Removed 삭제된 상태

 

JPA를 실질적으로 사용하는 구현체. (Hibernate가 JPA 보다 먼저 등장)

  • Object/Relational Mapping(ORM)
    • 객체/관계의 매핑을 제공한다.
  • JPA Provider
    • Java Persistance API를 구현하여 제공한다. 이를 통해 JPA를 지원하는 모든 환경에서 쉽게 사용할 수 있다.
  • Idiomatic persistence
    • 객체지향 패러다임에서 자연스럽게 Persistance class를 개발할 수 있게 도와준다.
  • High Performance
    • 개발자 생산성 및 런타임 측면에서 그냥 JDBC 코드를 쓴것보다 우수한 성능을 제공함.
  • Scalability
    • 어플리케이션이 서버 클러스터에서 작동하고 확장성이 뛰어난 아키텍처를 제공하도록 설계됨.
  • Reliable
    • 수많은 Java 개발자들이 사용하여 안전성 및 품질이 입증됨.

 

ORM : Programming technique JPA : Programming Interface

Hibernate : Framework

Spring Data JPA  : Programming Interface

반응형