ORM - (Object Relational Mapping)
관계형 데이터 베이스(이하 RDBMS)과 객체지향 프로그래밍 언어간 데이터를 자동으로 매핑하는기술로 객체지향 프로그래밍은 클래스, RDBMS는 테이블을 사용하기에 객체 모델과 관계형 모델간 불일치가 존재한다.
이를 해결하는것이 ORM으로 객체간 관계를 바탕으로 SQL을 자동으로 생성하여 상호간 불일치를 해결한다.
생성한 객체를 통해 간접적으로 DB데이터를 다룬다 Persistant API라고도 한다. (JPA, Hibernate 등..) -> 쉽게 말해 DB데이터 <ㅡ 매핑 ㅡ> Object필드는 서로 다른 방식을 사용하는데 이를 중간에서 해석해주는 통역사이다
ORM의 특징
- Granularity (세분성) - 경우에 따라 DB에 있는 테이블보다 더 많은 클래스를 가진 객체모델을가질수 있다.
- Ingeritance (상속) - RDBMS는 상속을 지원하지 않는다
- Identity (일치) - RDBMS는 sameness라는 개념을 정의하는데 이것은 java가 객체 식별(a==b)와 객체동일성 (a.equales(b))모두를 정의하는데 반해 RDBMS는 PK만 같으면 동일한 레코드로 인식한다.
- Associations (연관성) - 객체 참조 (reference)를 사용하지만 RDBMS는 연관성을 외래키(FK)로 나타낸다.
- Navigation (탐색 및 순회) - Java는 1개의 열결에서 다른연결로 이동하며 탐색을 진행하지만 RDMBS는 SQL 쿼리의 수를 최소화하고 Join을 통해 여러 엔티티중 원하는 대상만 선택한다 (select user from...)
- Persistence (영속성) - 데이터를 생성한 프로그램이 종료되도 사라지지 않는 데이터의 특성 (비휘발성)
장점
객체 지향적 코드로 인해 비즈니스 로직에 완성도, 가독성이 높아진다.
- ORM을 사용하면 SQL 쿼리(select * from...)를 선언,할당,종료 직관적인 코드(메서드)로 코드의 생략이 가능하다 (Connection.PerpareStatment.close() 등... 생략가능) -> 이것은 SQL의 절차적이며 순차적 접근이 아닌 객체 지향적 접근으로 생산성이 증가
재사용 및 유지보수가 좋아진다.
- ORM은 SQL 쿼리에 종속받지 않고 독립적으로 작성되었으며(내 맘대로 메서드를 만들수 있으며) 해당 객체는 재활용이 가능하다 (import만 찍고 참조해서 사용하면 된다) -> 이를 활용해 각 모델에서 가공된 데이터를 MVC패턴을 적용해 더 나은 디자인 패턴을 만드는데 일조한다.
- 매핑정보가 명확하여 객체 관계모델(ERD)에 대한 의존도를 낮출수 있다.
DBMS에 대한 종속성이 줄어든다.
- 객체간 관계를 기반으로 SQL을 자동으로 생성하기에 RDMBS의 데이터 구조와 객체지향모델 사이의 괴리를 줄일수 있다.
- ORM은 DB에 종속적이지 않다.
단점
ORM만으로 서비스 구현은 어렵다
- 사용은 편하지만 설계가 신중해야하며 복잡할수록 난이도도 올라간다. 잘못 구현될경우 버그 찾기 어렵다
- 자주 사용되는 대형 쿼리는 속도를 위해 저장 프로시저(SP)를 쓰는등 별도의 튜닝이 필요한 경우가 있다.
- DBMS의 고유 기능을 사용하기 어렵다.
프로시저가 많은 시스템에선 ORM의 객체지향적인 장점을 활용하기 어렵다.
- 프로시저(함수)가 많은 시스템에선 객체로 바꿔야하며 이 과정에서 생산성저하, 리스크가 발생할 우려가 있다.
프로시저 - 프로세스를 절차적으로 기술해놓것 (함수)
(SP를 사용할경우 결과가 캐시(메모리)에 저장되기에 추후 SP를 시행할경우 캐시에 있는걸 가져오기만 하면 되기 때문에 속도가 더 빨라진다)
//프로시저 예시
CREATE OR REPLACE PROCEDURE 프로시저 이름
( 매개변수명1 [ IN || OUT || INOUT ] 데이터타입,
매개변수명2 [ IN || OUT || INOUT ] 데이터타입 ... )
IS||AS
변수, 상수 등 선언 ( 선언부 )
BEGIN
실행 문장 ( 실행부 )
EXCEPTION 문장 //필수아님
END ;