영속성(Persistence)
데이터를 생성한 프로그램이 종료되지 않더라도 사라지지 않는 데이터의 특성을 말하며 영속성을 갖지 않는 데이터는 프로그램을 종료하면 모두 사라진다. 메모리 상의 데이터를 파일 시스템, 관계형 데이터베이스 또는 객체 데이터베이스 등을 활용해서 영구적으로 저장하고 영속성을 부여하는데 이 객체를 Object Persistence 즉, 영구적인 객체라 한다.
그렇다면 이렇게 데이터를 데이터베이스에 저장하기 위해서는 어떤 방법을 사용해야 할까?
1. JDBC
2. Spring JDBC (Ex. JdbcTemplate)
3. Persistence Framework (Ex. Hibernate, MyBatis)
JDBC 프로그래밍의 복잡함이나 번거로움없이 간단한 작업만으로 데이터베이스와 연동되는 시스템을 빠르게 개발할 수 있고 안정적으로 구동한다. Persistence Framework는 SQL Mapper와 ORM으로 나눌 수 있다.
ORM(Object Relational Mapping)이란
객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 것을 말한다. 객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용한다. 그래서 객체 모델과 관계형 모델 간에 불일치가 존재하는데 ORM을 통해서 객체 간의 관계를 바탕으로 SQL을 자동 생성해서 불일치를 해결한다. 즉, ORM을 사용하면 따로 SQL문을 생성할 필요 없이 객체를 통해 간접적으로 데이터베이스를 조작할 수 있게 된다.
ORM의 장단점
장점
1. 완벽한 객체지향적 코드
ORM을 사용하면 SQL문이 아닌 클래스의 메소드를 통해 데이터베이스를 조작할 수 있기 때문에 개발자가 객체 모델만 이용해서 프로그래밍을 할 수 있다. 선언문이나, 종료 같은 부수적인 코드가 줄어들고 객체에 대한 코드를 별도로 작성하기 때문에 코드의 가독성을 높일 수 있고 생산성을 늘릴 수 있다.
2. 재사용 및 유지보수의 편리성
독립적으로 작성한 객체들을 재활용할 수 있고 매핑 정보가 명확하여 ERD를 보는 것에 대한 의존도를 낮출 수 있다.
3. DBMS에 대한 종속성 감소
대부분의 ORM 솔루션은 DB에 종속적이지 않다. DBMS를 교체하는 작업에도 비교적 적은 리스크와 시간이 소요된다.
단점
1. ORM이 모든 걸 해결할 수 없다.
사용하기는 편하지만 설계를 신중히 해야 한다. 잘못 구현된 경우에 속도가 저하될 수 있고 일관성을 무너뜨리는 문제가 생길 수 있다. 일부 자주 사용되는 대형 SQL문은 속도를 위해 별도의 튜닝이 필요하기 때문에 결국 SQL문을 써야 한다.
2. 객체-관계 간의 불일치
1) 세분성(Granularity)
경우에 따라 데이터베이스에 있는 테이블 수보다 더 많은 클래스를 가진 모델이 생길 수 있다.
"사용자 세부 사항"을 예로 들어보자면,
ORM -> 코드 재사용과 유지보수를 위해 "Person"과 "Address"라는 두 개의 클래스로 나눌 수 있다.
데이터베이스는 person이라는 하나의 테이블에 "사용자 세부 사항"을 저장할 수 있다.
이렇게 Object 2개와 Table 1개로 두 개의 갯수가 다를 수 있다.
2) 상속성(Inheritance)
RDBMS는 객체지향 프로그래밍 언어의 특징인 상속 개념이 없다.
3) 일치(Identity)
RDBMS는 기본키(PK)를 이용해 동일성을 정의한다. 하지만 자바는 객체 식별(a == b)와 객체 동일성(a.equals(b))을 모두 정의한다.
4) 연관성(Associations)
객체 지향 언어는 객체 참조(reference)를 사용하는 연관성을 나타내는 반면, RDBMS는 외래키로 나타낸다.
5) 탐색/순회(Navigarion)
자바와 RDBMS에서 객체를 접근하는 방법이 근본적으로 다르다. 자바는 그래프 형태로 하나의 연결에서 다른 연결로 이동하며 탐색한다. 하지만 RDBMS는 일반적으로 SQL문을 최소화하고 JOIN을 통해 여러 엔티티를 로드하고 원하는 대상 엔티티를 선택하는 방식으로 탐색한다.
ORM Framework 종류
1. JPA/Hibernate
JPA(Java Persistence API)는 자바의 ORM 기술 표준으로 인터페이스의 모음이다. 이런 JPA 표준 명세를 구현한 구현체가 바로 Hibernate이다.
2. Sequelize
Postgres, MySQL, MariaDB, SQLite 등을 지원하는 Promise에 기반한 비동기로 동작하는 Node.js ORM이다.
3. Django ORM
python 기반 프레임워크인 Django에서 자체적으로 지원하는 ORM이다.
참고
- ORM(Object Relational Mapping)이 뭘까?
'DB' 카테고리의 다른 글
[DB] DBMS의 commit과 rollback은 어떻게 처리되는가 (0) | 2023.01.26 |
---|---|
[MySQL] 실행계획 알아보기 (1) | 2023.01.24 |
[MySQL] MySQL8 기본 캐릭터 셋 'utf8mb4' (0) | 2022.03.10 |
[MariaDB] 계층형 쿼리(Hierarchical Queries) (0) | 2022.03.07 |
[Oracle] 계층형 쿼리(Hierarchical Queries) (0) | 2022.03.04 |