![](https://velog.velcdn.com/images/mpfo0106/post/0dd31c39-80b6-43f9-8c4c-3eb17f308bd1/image.png)
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)
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
public class Book {
@Id
private Long id;
private String title;
private String author;
}
- 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. 가독성 및 유지보수성 향상
- 쿼리 로직을 명확하고 간결한 방식으로 캡슐화하여 코드의 가독성과 유지보수성을 높인다!