Object Relational Mapping 이란
ORM이란
- Object-Relational-Mapping 즉, 객체와 관계형 데이터베이스 매핑의 줄임말입니다.
- OOP (Object Oriented Programming)에서 쓰는 객체라는 개념을 구현한 클래스와
RDB (Relational DataBase)에서 쓰이는 데이터인 테이블을 매핑(연결)하는 것을 의미합니다. - ORM을 이용하면 SQL Query가 아닌 직관적인 코드(메서드)로서 데이터를 조작할 수 있습니다.
- 예를 들어, Member 테이블의 데이터를 출력하기 위해 MySQL에서는 SELECT * FROM Member; 라는 Query를 실행해야 하지만,
- ORM을 사용하면 Member 테이블과 매핑된 객체를 member라 할 때, member.findAll(); 라는 메서드 호출로 데이터 죄회가 가능합니다.
객체-관계 간의 불일치
- 그러나 클래스와 테이블은 서로가 기존부터 호환가능성을 두고 만들어진 것은 아니기 때문에 아래와 같은 불일치가 발생합니다.
- 이를 ORM을 통해 객체 간의 관계를 바탕으로 SQL문을 자동으로 생성하여 불일치를 해결합니다.
- 따라서 ORM을 이용하면 따로 SQL문을 작성할 필요 없이 객체를 통해 간접적으로 데이터베이스를 조작할 수 있게 됩니다.
ORM 장단점
- 장점
- 객체지향적인 코드로 인해 더 직관적이고 로직에 집중할 수 있도록 도와줍니다.
- SQL문이 아닌 클래스의 메서드를 통해 DB를 조작할 수 있으므로 개발자가 객체 모델만 이용해서 개발을 하는데 집중할 수 있습니다.
- 선언문, 할당, 종료 같은 부수적인 코드가 없거나 줄어듭니다.
- 객체마다 코드를 별도로 작성하기 때문에 코드의 가독성이 높아집니다.
- SQL의 절차적이고 순차적인 접근이 아닌 객체지향적인 접근으로 인해 생산성을 높여줍니다.
- 재사용 및 유지보수의 편리성이 증가합니다.
- ORM은 독립적으로 작성되어 있고, 해당 객체들을 재활용할 수 있습니다.
- 매핑 정보가 명확하여, ERD를 보는 것에 대한 의존도를 낮출 수 있습니다.
- DBMS (Database Management System)에 대한 종속성이 줄어듭니다.
- 대부분 ORM 솔루션은 DB에 종속적이지 않기 때문에 구현 방법 뿐만 아니라 많은 솔루션에서 자료형 타입까지 유효합니다.
- 개발자는 Object에 집중함으로 극단적으로 DBMS를 교체하는 큰 작업에도 적은 리스크와 시간이 소요됩니다.
- 또한 자바에서 가공할 경우 equals, hashcode의 오버라이드 같은 자바의 기능을 이용할 수 있고, 간결하고 빠른 가공이 가능하빈다.
- 객체지향적인 코드로 인해 더 직관적이고 로직에 집중할 수 있도록 도와줍니다.
- 단점
- 완벽한 ORM으로만 서비스를 구현하기 어렵습니다.
- 사용하기는 편하지만 설계는 매우 신중하게 해야합니다.
- 프로젝트의 복잡성이 커질 경우 난이도 또한 올라갈 수 있습니다.
- 잘못 구현된 경우 속도 저하 및 심각할 경우 일관성이 무너지는 문제점이 생길 수 있습니다.
- 일부 자주 사용되는 대형 쿼리는 속도를 위해 SP를 쓰는 등 별도의 튜닝이 필요한 경우가 있습니다.
- 프로시저가 많은 시스템에선 ORM의 객체 지향적인 장점을 활용하기 어렵습니다.
- 이미 프로시져가 많은 시스템에선 다시 객체로 바꿔야 하며, 그 과정에서 생산성 저하나 리스크가 발생할 수 있습니다
- 완벽한 ORM으로만 서비스를 구현하기 어렵습니다.
ORM 프레임워크
- JPA / Hibernate
- JPA (Java Persistence API)는 자바의 ORM 기술 표준으로 인터페이스의 모음입니다.
- 이러한 JPA 표준 명세를 구현한 구현체가 Hibernate입니다.
- Sequelize
- Sequelize는 PostgreSQL, MySQL, MariaDB, SQLite 등을 지원하는 Promise에 기반한 비동기로 동작하는 Node.js ORM입니다.
- Django ORM
- Python 기반 프레임워크인 Django에서 자체적으로 지원하는 ORM입니다.
'Database' 카테고리의 다른 글
[Database / Redis] - Redis 비밀번호 설정 (0) | 2024.04.06 |
---|---|
[Database] - 동시성 제어란? (2) | 2024.03.13 |
[DataBase / SQL] 클러스터드 인덱스 (Clustered Index), 넌 클러스터드 인덱스 (Non Clustered Index)란 (0) | 2024.02.14 |
[Database] - 레디스(Redis)란? (1) | 2024.02.05 |
[Database / SQL] - WHERE절 / LIKE절 / 집계함수 (0) | 2023.12.13 |