Intro
이번 포스팅의 주제는 ORM이다. 백엔드 애플리케이션을 개발하는 과정에서 ORM을 상당히 많이 사용하게 된다. ORM에 대해 한번 깊게 알아보도록 하자.
Object Relational Mapping
Entity의 특징이 뭘까? 그냥 편하게 생각해보면 그 자체가 하나의 데이터 형태라고 할 수 있다.
게시판 글이라는 Entity가 있다면 아마 이러한 정보들을 가질 수 있을 것이다. 글 번호, 생성 및 수정 시간, 내용, 조회수, 좋아요 수 등등...
해당 테이블에 존재하는 수 많은 데이터들은 백엔드 상에서 하나의 객체로 표현된다.
DAO, DTO, Entity 객체 등 다양한 용어를 가진 객체들로 데이터는 표현되고 전달된다. 각자 용도에 따라 사실 이름을 붙힌건데 짧게 정리하고 넘어가도록 하겠다.
- DAO
- Data Access Object
- 실제 DB에 접근하는 객체
- JPA 를 사용 할 시에는 Repository 인터페이스가 해당 역할을 한다.
- DTO
- Data Transfer Object
- 계층 간 데이터 교환을 위한 객체.
- 데이터를 Service나 Controller, View 등으로 전달 할 때 사용된다.
- Setter가 따로 존재하지 않지만, Request와 Response용 DTO는 상황에 따라 setter를 추가할 수 있다.
- toEntity 메소드를 통해 DTO에서 필요한 부분을 이용해 Entity로 만들 수 있다.
- Entity
- 실제 DB의 테이블과 매칭 될 클래스다.
- 외부에서 최대한 getter를 사용하지 않도록 필요한 로직들을 구현 해 둘 수 있다.
- Service Layer에서 사용 될 메소드들을 미리 개발 해 둘 수 있다.
- 얼핏 보면 DTO와 차이가 없어 보이지만, 다음과 같은 이유로 분리한다.
- View Layer 와 DB Layer의 역할을 분리해야 한다.
- View Layer에서는 DTO 클래스가 변경 될 수 있으나, Entity 클래스는 변경 즉시 많은 클래스에 영향을 끼칠 수 있다.
그래서 ORM이란 무엇인가? ORM은 DBMS 상의 데이터를 객체로 연결 해주는 역할을 한다.
게시글이라는 하나의 튜플 그 자체를 잘 살펴보면 객체와 매우 유사한 특징을 가지고있다. DB에서 데이터를 가져오게 된다면 결국 객체로 변환해야 한다. 이 과정을 조금 더 편리하게 만들어서 프로그램을 좀 더 객체지향적으로 개발 할 수 있도록 하는 데 목적이 있다.
조금 더 쉽게 얘기하면 객체와 DB의 데이터를 매핑 해줌으로써, MVC에서 Model 역할을 하는 게 ORM이라 할 수 있다.
목적
ORM을 통해 DB의 접근을 프로그래밍 언어의 관점으로 맞출 수 있다. 또한 객체관의 관계를 바탕으로 SQL을 자동으로 생성해줄 수 있다. 또한 SQL문을 직접 작성하지 않고 엔티티를 객체로 표현 할 수 있다.
이를 통해 낮은 결합도를 가진 프로그램을 개발 할 수 있다. 결합도가 낮은 프로그램은 테스트에 유리한 이점을 가질 수 있다.
종류
- JAVA
- JPA
- Hibernate 를 통해 구현함.
- JDBC라는 SQL Mapper 가 존재하나, DBMS에 종속되고 페러다임 불일치 문제가 발생 할 수 있다.
- Node.js
- Python
- Flask : SQLAlchemy
- Django : 내장 ORM
- GraphQL
장점
- 객체지향 코드를 사용하기 때문에 직관적으로 비즈니스 로직에 집중할 수 있다.
- 재사용 및 유지보수의 편리성이 증가한다.
- DBMS에 대한 종속성이 증가한다.
- mybatis와 같은 SQL Mapper는 DBMS 종속성이 높다.
단점
- 사용하기는 편리하지만 설계가 신중해야 함.
- 프로젝트의 복잡성이 높아질 경우 구현 난이도가 높아짐.
- 잘못 구현하는 경우 속도 저하가 생길 수 있고 심한 경우엔 일관성이 무너질 수 있다.
- 프로시저가 많은 시스템에서는 ORM의 객체 지향적인 장점을 활용하기 어렵다.
Outro
간단하게 ORM에 대해 알아 보았다. 다음 주제는 정말 중요한 ACID에 대해 포스팅 해 보도록 하겠다.