본문 바로가기

Homo Faber/Concepts

객체지향 어플리케이션에서의 Persistence

Persistence에 대해서 Java Persistence with Hibernate를 쓴 Christian Bauer는 다음과 같이 설명하고 있다.

객체지향 어플리케이션에서 persistence는 객체를 생성한 프로세스보다 객체를 오래 남게한다(outlive). 객체의 상태는 디스크에 저장될 수 있으며, 동일한 상태를 가지는 객체는 미래 시점에 동일한 지점에서 다시 생성될 수 있다.
이는 단일 객체에 국한되지 않으며 서로 연결된 객체의 전체 네트워크는 저장상태로 될 수 있으며 이후에 새로운 프로세스에서 다시 생성될 수 있다. 대부분의 객체들은 저장상태(persistent)가 아니며, 임시적인(transient) 객체는 이를 초기화했던 프로세스의 생명에 따라서 좌우되는 한정된 생명기간을 가진다. 대부분의 모든 자바 어플리케이션은 영구적인(persistent)와 임시적인(transient) 객체를 같이 가지고 있으며, 따라서 영구적인(persistent) 데이터를 관리하는 시스템이 필요하다.

현대의 관계형 DB는 데이터에 대해서 다루고, 소팅하고, 검색하고, 수집하는 것이 가능한 형태로 영구적인 데이터의 구조화된 표현을 제공한다. DBMS는 동시성과 데이터 무결성에 대해 담당하고 있으며, 다중 사용자와 다중 어플리케이션 간의 데이터 공유도 담당한다. 제약사항(constraint)와 같이 구현되었던 무결성 규칙을 통해 데이터 무결성을 보장한다. DBMS는 데이터 수준에서의 보안을 제공한다. 이 책에서 persistence를 이야기할 때 다음과 같은 모든 것들을 고려한다.

■ 구조화된 데이터에 대한 저장, 구성, 조회
■ 동시성과 데이터 무결성
■ 데이터 공유

그리고, 특히 도메인 모델을 사용하는 객체지향 어플리케이션 여역에서 이러한 문제들을 고려한다.
도메인 모델을 가지는 어플리케이션은 비즈니스 엔티티들을 2차원적인 표로 표현을 직접적으로 하지 못한다. 어플리케이션은 비즈니스 엔티티들의 자체적인 객체지향 모델을 가진다. 만일 온라인 경매 시스템의 DB가 ITEM과 BID 테이블을 가지고 있다면 자바 어플리케이션은 Item 과 Bid 클래스를 정의한다.
그 다음에 SQL result set의 행과 컬럼을 가지고 직접 사용하는 대신에 비즈니스 로직은 객체지향 도메인 모델과 서로 연결된 객체의 네트워크로 실시간 구현과 상호작용한다. 비즈니스 로직은 DB에서 (SQL 스토어드 프로시져로) 실행되지 않는다. 어플리케이션 티어에서 자바에서 구현된다. 이는 비즈니스 로직이 상속과 다형성(polymorphism)과 같은 복잡한 객체지향 개념을 사용할 수 있게 한다. 예를 들어, Strategy나 Mediator, Composite와 같은 잘 알려진 설계 패턴을 사용할 수도 있으며, 이들은 모두 다형성인 메소드 호출과 관련이 있다.
모든 자바 어플리케이션은 이와 같은 방법을 설계되지 않으며 그렇게할 필요도 없다. 단순한 어플리케이션들은 도메인 모델 없이 훨씬 잘 구성될 수도 있다. 복잡한 어플리케이션은 기존의 스토어드 프로시저를 재사용해야 하는 경우도 있다. SQL과 JDBC API는 순수한 테이블 데이터를 처리하는 데에 완전한 서비스 형태이며, JDBC의 RowSet은 훨씬 쉽게 CRUD 오퍼레이션을 만들어낸다. 저장 데이터에 대한 테이블 형태를 사용한 작업은 직관적이며 이해가 잘 된다.

하지만, 중대한 비즈니스 로직을 가진 어플리케이션의 경우, 도메인 모델 접근방법은 코드 재사용성과 유지보수성을 매우 향상시키는데 도움이 된다. 실제로, 두가지 전략 모두는 일반적이며 필요하다. 많은 어플리케이션들은 데이터에 근접하여 많은 양의 데이터를 변경하는 프로시저를 실행하는 것이 필요하다. 동시에 다른 어플리케이션 모듈들은 어플리케이션 티어에서 일반적인 온라인 트랜잭션 프로세싱 로직을 실행하는 객체지향 도메인 모델로부터 이점을 얻을 수 있다. 저장 데이터를 어플리케이션 코드에 더 가깝게 하는 효과적인 방법이 필요하다.
만일 SQL과 관계형 DB에 대해 다시 생각해보면, 두개의 패러다임 간의 불일치를 결국 발견하게 된다. projection과 join과 같은 SQL 오퍼레이션은 항상 결과 데이터에 대한 2차원적인 테이블 형태를 양산한다. (이는 transitive closure라고 하는데, 관계에 대한 오퍼레이션 결과는 항상 관계이다.) 이는 자바 어플리케이션에서 비즈니스 로직을 실행하는데 사용되는 서로 연결된 객체들의 네트워크와는 매우 다르다. 이는 근본적으로 서로 다른 모델이며, 동일한 모델을 보여주는 서로 다른 방법만이 아니다.
이러한 구현 때문에 양쪽의 데이터 표현, 객체지향 도메인 모델과 저장 관계형 모델, 모두를 조합하는 어플리케이션에 의해서 해결되어야만 하는 문제 - 어떤 것은 잘 이해가 되거나 어떤 것은 덜 이해가 되는 - 를 살펴보아야 한다.
반응형