Tag Archives: JPA

ORM Frameworks, Transactions and Concurrency

객체 영속성(Object Persistency)은 생성된 각 객체가 애플리케이션 프로세스의 생애주기보다 긴 시간 동안 보존될 수 있음을 의미한다. 즉, 한 번 생성된 객체는 데이터 저장소(데이터베이스)에 저장돼 이후의 어느 시점에선가 이전의 상태로 다시 복원될 수 있다.

그런데, 이 때 객체의 영속화를 위해 관계형 DBMS(SQL 기반의)를 사용한다면 객체-관계 간 불일치(Object/Relational Mismatch, Impedence Mismatch)가 발생한다. 이는 애플리케이션이 객체지향적인 관점에서 작성되며 객체를 기반으로 데이터를 관리하는 반면, 데이터베이스는 관계형 표현을 바탕으로 데이터를 저장하기 때문이다. 객체 지향의 패러다임에선 특정 데이터 유형을 표현하기 위해 타입(클래스)을 사용하는데, 이 타입은 다른 여러 타입을 자신의 내부에 포함(예, 클래스 내부에 private으로 선언된 배열)하는 형태로 정의된다. 반면에 관계형으로 관리되는 정보는 독립적인 타입들에 기본적인 데이터가 저장되고, 각 타입들 간에 연관 관계(예, 1:n 외래키 설정) 설정해 관리함으로써 최종적인 데이터가 완성된다.

이런 객체 지향과 관계형 사이의 불일치 때문에, 애플리케이션 개발자는 객체를 바로 데이터베이스에 저장하지 못하고, 반드시 객체에 담긴 정보를 관계형 표현에 맞게 변환하는 과정을 거쳐야만 데이터베이스에 새로운 행을 추가할 수 있다. 프로그램의 실행을 위해 관계형 데이터베이스에서 정보를 가져와 객체로 만드는 과정도 마찬가지다. 더군다나 대부분의 애플리케이션에서 데이터 영속성을 보장하기 위해 관계형 데이터베이스를 사용하고 있기 때문에, 새로운 애플리케이션을 개발할 때 마다 이런 객체-관계 간 불일치를 해결하기 위해 상당한 노력을 낭비할 수 밖에 없다.

그 결과, 객체-관계 간 불일치로 인한 낭비 문제에 관한 해결책으로 ORM 프레임워크가 등장했다. JBoss의 하이버네이트와 같은 ORM 프레임워크는 애플리케이션의 비즈니스 계층(Business Layer)에서 비즈니스 로직(Business Logic)을 수행하기 위한 도메인 모델(Domain Model)을, 관계형 데이터베이스에 종속적인 영속성 계층(Persistence Layer)과 유연하게 결합해주는 역할을 한다. ORM 프레임워크의 도입을 통해 객체 정보와 관계형 정보 간의 매핑 과정 중 상당 부분을 자동화 할 수 있으며, 이는 영속성을 구현하는 과정에서 발생해 온 낭비를 줄여 애플리케이션 구현이 달성하고자 하는 궁극적 목표(비즈니스 도메인)에 집중할 수 있도록 해준다.


ORM이 도메인 모델을 바탕으로 객체 지향적인 영속성의 달성을 도와주긴 하지만, 데이터베이스 관리의 일반적 특징인 트랜젝션 및 동시성의 문제로부터 프로그래머를 완전히 자유롭게 해주진 못한다. ORM이 제공하는 방식에 따라 좀 더 편리하게 이런 부분을 관리할 순 있지만, 이를 위해선 그 이면에 숨어있는 관계형 데이터베이스의 기본 개념을 잘 이해하고 있어야 한다.

멀티스레딩 환경의 애플리케이션 프로그래밍과 마찬가지로, 데이터베이스 관련 작업 역시 원자성(Atomicity)을 어떻게 보장할지 고려해야 한다. 영속성을 보장하기 위해선 데이터베이스에 요청을 보내는 여러 주체(애플리케이션) 간에 일관성(Consistency)과 데이터 무결성(Integrity)를 보장해야하고, 이를 위해선 요청을 원자적으로 관리할 범위를 명시적으로 한정해야 한다. 즉 작업의 단위(Unit of Work)를 정의하여 커밋/롤백이 가능한 원자적 범위를 지정해야하며, 이는 트랜젝션(Transaction) 구간으로 표현된다. 트랜젝션을 통해 하나 이상의 데이터베이스 사용자를 지원하기 위해 필요한 동시성(Concurreny)을 보장할 수 있으며, 여기서 동시성이란 어떤 사용자의 행위가 다른 사용자로부터 독립성(Isolateion)을 가짐을 의미한다.

트랜젝션은 이러한 특징 이외에도 몇가지 중요한 속성을 갖춰야 한다. 우선 앞서 언급했던 일관성(Consistency)의 측면에서 한 트랜젝션 구간 안에서 데이터의 집합이 일관됨을 보장해야 하며, 이는 데이터베이스의 무결성을 바탕으로 실현할 수 있다. 또한 정확성(Correctness)의 측면 역시 보장되어야 하는데, 데이터베이스 테이블의 제약조건으로는 사용자의 요청에 따른 정확성을 완전히 처리할 수 없기 때문에 이는 애플리케이션이 구현해야 할 책임이 된다. 지속성(Durability) 역시 트랜젝션에서 보장되어야 할 속성이며, 이는 트랜젝션이 종료됨과 함께 트랜젝션 안에서 발생한 모든 변경의 결과가 데이터베이스를 비롯한 영속성 계층에 반영되어, 이후에 어느 시점에선가 시스템 실패가 발생하더라도 해당 데이터가 소실되지 않음을 의미한다. 이러한 트랜젝션 속성은 ACID 조건(ACID Criteria)로도 알려져 있다.