아티클은 "TypeScript를 활용한 서비스개발"을 읽었는데, ORM이 뭔가 찾아보다가 정리해봤다.
ORM이란
객체 관계 매핑(ORM, Object-relational mapping)
"
데이터베이스와 객체 지향 프로그래밍 언어간의 호환되지 않는 데이터를 변환하는 프로그래밍 기법
객체 지향 언어에서 사용할 수 있는 "가상" 객체 데이터베이스를 구축하는 방법이다.
"
- 위키백과
ORM
객체와 관계형 데이터베이스의 데이터를 자동으로 연결해주는 것을 말한다.
- 객체지향프로그래밍은 클래스, 관계형데이터베이스(RDB, Relational Database)는 테이블을 사용
- 객체모델과 관계형 모델간의 호환 불일치가 발생할 수 있다.
- ORM을 통해 불일치를 해결한다.
- 객체지향프로그래밍 시 데이터베이스와 호환가능성을 염두하고 개발하지 않는 이상 둘 사이에 호환 불일치가 발생하는 경우가 생긴다.
- 이를 ORM을 통해 객체간의 관계를 바탕으로 SQL문을 자동으로 생성하여 불일치를 해결한다.
- 따라서 ORM을 사용하면 따로 SQL문을 작성하지 않아도 객체를 통해 간접적으로 데이터베이스를 조작할 수 있다.
장점
- 객체지향적인 코드
- 클래스의 메서드를 통해 데이터베이스를 조작할 수 있기때문에 비즈니스로직에 집중할 시간을 확보할 수 있다.
- SQL문과 관련된 부수적인 코드가 줄어들거나 필요하지 않아도되는 경우가 있다.
- 객체에 대한 코드를 별도로 작성하기에 코드 가독성이 증가한다.
- 객체지향접근, SQL의 절차/순차적 접근이 혼재되지 않아도되기에 객체지향적 접근만 고려, 생산성 증가한다.
- 재사용, 유지보수, 리팩터링 용이성
- ORM은 독립적으로 작성되어있고 해당 객체를 재활용할 수 있다.
- 모델에서 가공된 데이터를 컨트롤러에 의해 뷰와 합치는 형태로 디자인 패턴을 견고하게 다지는데 유리하다.
- 연결정보가 정확하여 ERD 의존도를 낮출 수 있다.
단점
- 첫 설계를 잘못하면 망할 가능성이 크다.
- 프로젝트 복잡성에 따라 난이도가 높아지고 잘못된설계는 속도 저하 및 일관성의 문제가 생길 수 있다.
- 속도를 위해 별도의 튜닝이 필요한 경우 결국 SQL문을 사용해야하는 경우가 생길 수 있다.
객체-관계간의 불일치
- 세분성
- 데이터베이스 테이블 수보다 더 많은 클래스를 가진 모델이 생기는 경우
- 상속성
- RDBMS는 객체지향언어 특징인 상속 개념이 없다.
- 일치 (이해가 잘안됨???)
- 연관성
- 객체지향언어는 객체의 참조를 사용해 연관성을 나타낸다. 하지만 RDBMS는 방향성이 없는 외래키(foreign key)를 이용해 나타낸다.
- 탐색
- 자바와 RDBMS 객체 접근 방법이 다르다.
- 자바는 그래프형태로 연결 연결하여 탐색한다.
- RDBMS는 JOIN은 통해 여러 엔티티를 로드하고 원하는 엔티티를 선택하는 방식으로 탐색한다.
* 관계형 데이터베이스 (RDB, Relational Database)
관계형 데이터베이스는 키와 값들의 간단한 관계를 테이블화 시킨 매우 간단한 원칙의 전산정보 데이터베이스이다.
모든 데이터를 2차원 테이블 형태로 표현해준다.
데이타의 독립성이 높고, 고수준의 데이타 조작언어(DML-Data Manipulation Language)을 사용하여 결합, 제약, 투영 등의 관계 조작에 의해 비약적으로 표현능력을 높일 수 있다.
- 위키백과
* 관계형 데이터베이스 관리 시스템 (RDBMS, Relational Database Management System)
관계형 데이터베이스 관리 시스템은 IBM 산호세 연구소의 에드거 F. 커드가 도입한 관계형 모델을 기반으로 하는 데이터베이스 관리 시스템이다.
즉 관계형 데이터베이스(RDB)를 생성, 수정 관리 할 수 있는 소프트웨어(Oracle, MySQL 등...)라고 정의할 수 있다.
- 위키백과
ORM이란?
https://geonlee.tistory.com/207
RDB, RDBMS란
https://jwprogramming.tistory.com/52
https://thefif19wlsvy.tistory.com/147
'아티클' 카테고리의 다른 글
[아티클 프로젝트 055] this (0) | 2020.10.28 |
---|---|
[아티클 프로젝트 051] User-Agent Client Hints의 도입, UA 프리징을 대비하라 (0) | 2020.10.14 |
[아티클 프로젝트 049] Chrome is deploying HTTP/3 and IETF QUIC (0) | 2020.10.08 |
[아티클 프로젝트 047] 취준생이 반드시 알아야 할 프론트엔드 지식들 -CSS (0) | 2020.10.06 |
[아티클 프로젝트 042] NAVER FE devtalk: 디자인 시스템에 대한 소개와 효율성 개선 및 구축 경험공유 - 플랫폼 디자이너 없이 디자인 시스템을 구축하는 프로덕트 디자이너의 우당탕탕 고통 연대기 (0) | 2020.09.21 |
[아티클 프로젝트 041] Javascript DOM(Document Object Model)과 BOM(Browser Object Model) (0) | 2020.09.17 |
[아티클 프로젝트 040] 취준생이 반드시 알아야 할 프론트엔드 지식들-프론트엔드 전반 (0) | 2020.09.15 |
[아티클 프로젝트 038] 플래닝 포커(Planning Poker) (0) | 2020.09.11 |