[DB]ORM(Oject-Relational-Mapping) Framework 란?

강준호·2024년 1월 15일
0

기술면접

목록 보기
4/9

ORM

ORM 이란?

  • 객체 지향 프로그래밍 언어와 관계형 데이터베이스의 호환되지 않는 유형 시스템 간에 데이터를 변환하는 데 사용되는 프로그래밍 기술

  • 비유하면, 객체지향 세계와 RDB 세계를 이어주는 다리!

RDB 와의 관계 및 등장배경

기존 RDB 의 종속성으로 인한 한계

구조적 쿼리 언어(SQL)

  • 데이터 조작 및 검색을 위해 SQL에 크게 의존

=> 복잡한 구문공부🥲

스키마의 빡빡함

  • RDBMS에는 사전 정의된 스키마가 필요함. 데이터를 저장 전 구조를 다 정해놔야한다

=> 이런 경직성으로 유연한 변화가 어려웠다..

명령형 패러다임 & 선언형 패러다임

  • 기존 SQL은 선언적이며 데이터 작업의 '무엇'에 초점을 맞춘다.
    But, 어플리케이션코드는 '어떻게' 에 초점

=> 이 격차때문에 복잡하며 장황해지고 오류 발생 확률 증가...

ORM 의 출현

SQL을 통한 추상화

  • 데이터베이스 레코드를 프로그래밍 언어의 개체인 것처럼 작업!

=> SQL 전문 지식의 필요성이 크게 줄어들고 개발 프로세스가 간소화

스키마 복잡성 처리

  • 애플리케이션의 개체 모델과 데이터베이스의 관계형 모델 간의 변환을 관리하고 복잡한 매핑과 관계를 처리

=> 스키마 경직성을 쉽게 처리할 수 있어 애플리케이션 개발의 유연성이 향상되고 스키마 변경 사항을 더 쉽게 처리하게 되었다!

패러다임 격차 해소

  • ORM 프레임워크는 명령형 프로그래밍 언어와 SQL의 선언적 특성 사이의 격차를 해소!

=> 개발자는 기본 데이터베이스 쿼리에 대해 걱정하지 않고 애플리케이션 논리에 더 쉽게 집중할 수 있어 생산성이 향상되고 오류 가능성이 줄어듭니다.


하지만 여전히 사라지지 않은 DB 종속성

언어 및 프레임워크 특정

  • ORM 솔루션은 프로그래밍 언어 또는 프레임워크에 특정되는 경우가 많습니다.
  • Ex) Java용 Hibernate, .NET용 Entity Framework 또는 Python용 Django ORM이 있습니다.

데이터베이스 호환성

  • 많은 ORM 프레임워크가 다양한 데이터베이스 시스템을 지원하지만 여전히 각 데이터베이스에 대한 특정 드라이버와 구성이 필요합니다.

  • 이는 특히 덜 일반적인 데이터베이스로 작업하거나 데이터베이스를 전환해야 할 때 유연성을 제한하거나 복잡성을 가중시킬 수 있습니다.

  • 일반적으로 여러 RDBMS 시스템을 지원하지만 적절한 구성 및 연결 설정이 필요합니다.

객체 지향 프로그래밍

  • 이름에서 알 수 있듯이 ORM을 사용하려면 객체 지향 프로그래밍 접근 방식이 필요합니다.
  • ORM의 효율성은 애플리케이션의 데이터 구조가 관계형 모델에 얼마나 잘 매핑될 수 있는지와 밀접하게 연관되어 있습니다.

장점

코드의 단순성

  • SQL 구문에 대해 걱정하지 않고 높은 수준의 객체 지향 코드를 작성할 수 있다 => 개발이 더 빠르고 직관적

생산성

  • CRUD(생성, 읽기, 업데이트, 삭제) 작업을 자동화. => 반복적인 SQL 코드 작성 및 유지 관리 필요성을 줄여 개발 속도를 높인다.

유지관리성

  • ORM 계층이 이러한 세부 정보를 추상화함. => 데이터베이스 스키마 변경이나 데이터베이스 전환이 더 쉬울 수 있습니다.

SQL 주입 위험 감소

  • ORM은 매개변수화된 쿼리를 사용하여 SQL 주입 공격의 위험을 줄이는 데 도움이 됩니다.

단점

성능 오버헤드

  • ORM 프레임워크는 추가 추상화 계층으로 인해 특히 복잡한 쿼리에서 성능 오버헤드를 유발할 수 있습니다.

복잡한 쿼리

  • ORM은 기본 쿼리를 잘 처리하지만 복잡한 SQL 쿼리로 인해 어려움을 겪을 수 있으며 종종 기본 SQL로 대체해야 합니다.

JPA

Jakarta Persistence API(JPA)

  • Java의 ORM(객체 관계형 매핑)을 위한 표준 인터페이스

  • Java에 Book 클래스가 있고 이를 데이터베이스의 books 테이블에 매핑하려고 한다고 가정해 보겠습니다

import jakarta.persistence.Entity;
import jakarta.persistence.Id;

@Entity
public class Book {
    @Id
    private Long id;
    
    private String title;
    private String author;

    // Getters and setters...
}
  • Book 클래스를 JPA 엔티티로 표시하여 데이터베이스의 테이블에 매핑되게
  • Id 어노테이션은 id 필드를 테이블의 기본 키로 표시.

JPQL

Jakarta Persistence Query Language (JPQL)

  • JPQL은 데이터베이스에 저장된 엔티티를 쿼리하는 데 사용됩니다. SQL과 유사하지만 데이터베이스 테이블이 아닌 엔티티 객체에서 직접 작동합니다.

특정 저자의 모든 책을 검색하는 JPQL 쿼리

String jpql = "SELECT b FROM Book b WHERE b.author = :author";
Query query = entityManager.createQuery(jpql);
query.setParameter("author", "J.K. Rowling");
List<Book> books = query.getResultList();
  • Book은 테이블 이름이 아닌 엔터티의 이름입니다. b는 쿼리에 사용된 별칭

그렇다면 왜 모든 데이터베이스 쿼리를 JPA 로 처리하지 않고 JPQL을 사용할까??🤔

  • JPA 와 JPQL 을 적절히 사용하는게 좋다!

1. 복잡한 쿼리처리용

  • JPA는 기본적인 CRUD(만들기, 읽기, 업데이트, 삭제) 작업에 탁월하지만,
  • 조인, 서브쿼리 등에는 매우 취약. => 직접 JPQL 을 만들어 처리하자!

2. 가독성 및 유지보수성 향상

  • 쿼리 로직을 명확하고 간결한 방식으로 캡슐화하여 코드의 가독성과 유지보수성을 높인다!

0개의 댓글