코드짜는 노인네

[Spring] ORM(Object Relational Mapping)와 JPA(Java Persistent API) 본문

spring/JPA

[Spring] ORM(Object Relational Mapping)와 JPA(Java Persistent API)

ikohong 2022. 8. 22. 03:39
728x90
반응형

[Spring] ORM(Object Relational Mapping)와 JPA(Java Persistent API)


ORM(Object Relational Mapping)
Object: "객체"지향 언어 (자바, 파이썬)
Relational: "관계형" 데이터베이스 (H2, MySQL)
  • 객체와 테이블을 매핑해서 패러다임의 불일치를 개발자 대신 해결해주는 것
  • 객체는 객체대로 설계하고 RDB는 RDB에 맞게 설계하는 것을 추구함 ⇒ 객체와 RDB를 중간에서 서로 매핑
  • 데이터베이스와 객체 지향 프로그래밍 언어 간의 호환되지 않는 데이터를 변환하는 프로그래밍 기법

ORM이란 객체가 테이블이 되도록 매핑을 시켜주는 역할을 합니다. ORM을 이용하면 SQL Query가 아닌 메서드로 데이터를 조작할 수 있습니다.

// SQL문
SELECT * FROM user;

// ORM
user.findAll()

위의 코드를 보면, SQL 쿼리문과 똑같은 기능으로 ORM을 사용하면, User 테이블과 매핑된 객체를 user라 할때 user.findAll() 메서드를 호출하면 데이터베이스에서 해당 데이터를 조회할 수 있습니다.

ORM을 만든 이유
  • ORM 이 없는 환경에서는 백엔드 개발자가 비즈니스 로직 개발보다 SQL 작성에 더 많은 노력을 들여야 함
  • SQL 작성이 단순하고 반복적인데, 실수하기는 쉬움
  • 생산성이 매우 높아집니다.
ORM의 단점
  • query가 복잡해주면 ORM으로 표현하는데 한계가 있음
  • 성능이 raw query에 비해 느림
반응형
JPA(Java Persistent API)

 

  • 자바 진영의 ORM 기술 표준으로 SQL을 쓰지 않고 데이터를 생성, 조회, 수정, 삭제할 수 있도록 해주는 번역기
  • Java 플랫폼 SE와 자바 플랫폼 EE를 사용하는 응용 프로그램에서 관계형 데이터베이스의 관리를 표현하는 자바 API
  • 실제로 구현된 것이 아니라 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크
  • JPA 인터페이스를 구현한 대표적인 오픈소스 : Hibernate
  • 어플리케이션과 JDBC 사이에서 동작

JPA는 데이터를 객체지향적으로 관리할 수 있기에 개발자는 비즈니스 로직에 집중할 수 있고, 객체지향 개발이 가능한 특징을 가지고 있습니다.

 JPA 사용 이유
  1. 생산성
    • 자바 컬렉션에 객체를 저장하듯 JPA에 저장할 객체를 전달
    • JDBC API 사용하는 지루하고 반복적인 일을 JPA가 대신 처리
    • DDL문 자동 생성
    • 데이터베이스 설계 중심의 패러다임을 객체 설계 중심으로 역전
  2. 유지보수
    • 개발자가 작성해야 할 SQL과 JDBC API 코드를 JPA가 대신 처리해줌으로 유지보수해야 하는 코드 수가 줄어듦
    • ex) 엔티티에 필드 추가 시 등록, 수정, 조회 관련 코드를 모두 변경해야하지만 JPA를 사용하면 이런 과정을 JPA가 대신 처리함
  3. 패러다임 불일치 해결
    • 상속, 연관관계, 객체 그래프 탐색, 비교하기 같은 패러다임 불일치 해결
  4. 성능
    • 다양한 성능 최적화 기회 제공
    • 어플리케이션과 데이터베이스 사이에 존재함으로 여러 최적화 시도 가능
  5. 데이터 접근 추상화와 벤더 독립성
    • 데이터베이스 기술에 종속되지 않도록 함
    • 데이터베이스를 변경하면 JPA에 다른 데이터베이스를 사용한다고 알려주면 됨
JPA의 장점
  1. 특정 데이터베이스에 종속되지 않음
    • Oracle과 MariaDB 등과 같이 쿼리문은 데이터베이스마다 다름 ⇒ 데이터베이스 변경이 어려움
    • but) JPA의 경우 데이터 접근 계층을 제공해주기 때문에 설정 파일에 어떤 데이터베이스를 사용하는지만 알려주면 데이터베이스 변경이 가능
  2. 객체지향적 프로그래밍
    • JPA를 사용하면 데이터베이스 설계 중심의 패러다임에서 객체지향적 설계가 가능 ⇒ 더 직관적이고 비즈니스 로직에 집중할 수 있음
  3. 생산성 향상
    • 데이터베이스 테이블에 새로운 컬럼이 추가되면 해당 테이블의 컬럼을 사용하는 DTO 클래스의 필드 역시 모두 변경해주어야 함
    • but) JPA를 사용하면 테이블과 매핑된 클래스에 필드만 추가하면 쉽게 관리가 가능
      SQL을 직접 작성하지 않고 객체를 사용하여 동작 ⇒ 유지보수 측면 및 재사용성도 증가
JPA의 단점
  1. 복잡한 쿼리 처리
    • 통계 처리 같은 복잡한 쿼리를 사용할 경우는 SQL문을 사용하는 게 나을 수도 있음
    • JPA에서는 Native SQL을 통해 기존의 SQL문을 사용할 수 있지만 그러면 특정 데이터베이스에 종속된다는 단점이 발생 ⇒ 이를 보완하기 위해 SQL과 유사한 기술인 JPQL을 지원
  2. 성능 저하 위험
    • 객체 간의 매핑 설계가 좋지 않을 때 성능 저하가 발생할 수 있으며, 자동으로 생성되는 쿼리가 많기 때문에 개발자가 의도하지 않는 쿼리로 인해 성능이 저하되기도 함
  3. 학습 시간
    • JPA를 제대로 사용하려면 학습하는데 시간이 오래 걸린다.
728x90
반응형

'spring > JPA' 카테고리의 다른 글

[Spring] JPA 개념과 JPA 사용예시  (0) 2022.08.22
Comments