프로그래밍 일기 — 포기하지마(Persist!)!

배우는 자(Learner Of Life)
7 min readOct 11, 2023

--

데이터를 영속(persist)하기 위한 방법

Persistence는 “끈기"를 의미하기도한다(1).

데이터의 영속성(persistence)이란 “프로그램이 종료되더라도 사라지지 않는 데이터의 성질"을 의미한다. 일정 시간이나 전원의 차단 시 사라지는 데이터의 휘발성(Volability)과는 반대되는 개념이다.

Persistence는 실제 영단어로 “끈기”를 의미하기도한다. 이렇게 이름을 붙인 이유는 결코 포기하지말고 계속 프로그래밍을 배우라는 깊은 의미가 있는 것은 아닐까하는 생각이든다. 그 말에 감명을 받아, 오늘도 새로운 배움을 멈추지 않기로했다. 이 데이터의 영속성을 실현하기 위해 가장 널리 활용되는 기술이 JPA(Java Persistence API)다. 말 그대로 Java에서 데이터를 영속하게끔 해주는 API다. 과연 이 기술은 무엇이며, 어떠한 장/단점을 가지고 있을까?

데이터를 영속하기 위한 다양한 기술(2)

Java에서 데이터를 영속하기 위한 방법에는 여러가지가 있다.

  • JPA(Java Persistence API)
  • Serialization(직렬화)
  • JDBC(Java Database Connectivity API)
  • ORM(Object-Relational-Mapping)
  • ODB(Object Databases)
  • EJB(Enterprise Java Beans) 2 Entity Beans
  • JDO(Java Data Objects)

JPA이외에도 많은 솔루션이 존재하지만, JDO를 제외하면 모두 상당한 제한이 있다. JPA가 널리쓰일 수 밖에 없는 이유를 다른 방법들을 탐구하면서 알아보자.

Serialization

Java내에서 객체 그래프를 직렬(series)의 바이트로 변환할 수 있는 기법이다. 이러한 바이트 값은 네트워크 상에서 전송되거나 파일로 저장될 수 있다. 직렬화는 사용이 쉽지만 매우 큰 한계를 가지고 있다. 객체 그래프를 한번에 저장하고 불러와야하기 때문에 대용량의 데이터를 처리하는데 있어 한계가 있을 수 밖에 없다. 정보를 업데이트할 때 발생한 에러가 있더라도 변경을 취소할 수 없으며, 따라서 데이터 무결성(data integrity)를 준수하는데 있어 치명적인 결점을 가진다. 멀티쓰레드나 여러 개의 프로그램이 충돌없이 한꺼번에 직렬화된 데이터를 동시에 읽거나 쓰는 것이 불가능하다. 또한 쿼리를 지원하지 않는다. 따라서 데이터 영속성을 실현하는데 있어 매우 제한적인 규모의 데이터에만 유효하다는 한계가 있다.

JDBC

관계형데이터베이스에서 가장 많이 활용되는 방법 중 하나로써, 직렬화의 단점을 상당부분 보완한 솔루션이다. 대용량을 처리할 수 있고, 데이터 무결성을 보장할 수 있으며, 정보에 대한 동시적접근(concurrent access)이 가능하고, SQL이라는 세련된 쿼리 언어를 지원한다. 다만 직렬화처럼 사용이 쉽지는 않다는 단점이 있다. 가장 치명적으로는 객체의 저장이 용이하지 않기때문에, 데이터 영속성을 실현하는데 있어 일부 코드에서 객체지향성을 사용하지 못할 수도 있다. 따라서 이러한 단점을 극복하기 위해서는 개발자가 직접 관개형데이터베이스에 상속과 같은 객체지향성을 맵핑하는 방법을 찾아내야만 한다.

ORM

객체와 관계형데이터베이스 테이블을 맵핑해주는 솔루션으로써, 보통 별도의 소프트웨어로써 존재하는 경우가 많다. 이 도구는 개발자로하여금 객체지향성과 관계형데이터베이스사이의 맵핑 문제를 걱정하지 않게해준다. 이 것만으로는 개발자에게 상당한 매력을 지닌 기술처럼 보인다. 하지만 결정적으로 각 ORM마다 사용하는 API가 다르기 때문에 특정 ORM을 사용한다면 그 솔루션의 체계에 묶여버릴 수 있다는 단점이 있다. 이 것은 기술적으로 큰 문제는 되지 않을 수 있지만, 특정 회사의 솔루션에 종속되어버리면 나중에 라이센스 비용이 오르거나 더 나은 솔루션이 나오더라도 쉽게 바꿀 수 없는 경제적 한계를 만들 수 있다. 그렇게 하려면 지금까지 해당 ORM을 활용해 데이터 영속성을 구현한 코드를 처음부터 다 다시써야할 것이다.

ODB

ORM처럼 객체를 관계형데이터베이스 테이블에 맵핑하는 솔루션이 아닌, 객체를 저장할 수 있는 데이터베이스를 말한다. ORM보다 사용이 쉽다는 장점이 있다. Object Database Management Group (ODMG)이라는 조직이 만들어져 객체 데이터베이스에 접근하기 위한 표준 API가 수립되었다. 이후 일부 소프트웨어 회사들도 이 표준 API를 반영한 솔루션을 출시하기도 했다. 이러한 소프트웨어를 사용하면 역시 특정 회사의 솔루션에 종속될 수 있다는 단점은 여전히 존재한다. 또한 이러한 ODB솔루션에서 활용가능한 데이터 분석 툴(data analysis tool)의 수가 상대적으로 적고, 이미 기존 ORM 솔루션들이 많은 데이터를 저장하고 있는 상태에서 Migration을 하는 것이 쉽지는 않기도 하다. 이러한 이유들로 많은 회사들이 기존에 정립되고 검증된 ORM 솔루션을 벗어나 상대적으로 잘 알려지지 않은 이러한 ODB 솔루션으로 전환하는 것에 소극적이다.

EJBs

Java Enterprise 플랫폼에서 제공하는 솔루션으로써, 데이터저장소에 있는 영속성 데이터(persistent data)를 표현하는 Entity들을 가진 컴포넌트다. ORM과 같이 영속성 데이터에 대한 객체지향적 관점을 제공한다. ORM과의 큰 차이점은 EJB 2.x Entity들이 관계형데이터베이스에 국한되지 않는다는 것이다. 영속형 데이터는 회사의 내부 저장소나 외부 저장 디바이스에서 가져올 수 있다. 이 솔루션은 매우 엄격한 표준을 만들어 지키기 때문에, 특정 ORM 솔루션처럼 한 솔루션에 국한되지 않는다. 다만 객체지향성을 표현하는데 있어 한계가 있는 솔루션이기 때문에, 상속이나 다형성, 혹은 다른 복잡한 관계를 표현하기 어렵다. 가장 치명적인 단점은 가벼운 솔루션이 아니기에 많은 데이터를 처리할 수 있는 비싼 서버를 필요로하며, 코드를 작성하기 어렵다는 것이다.

JDO

JPA와 가장 비슷한 솔루션으로써, JPA와 매우 비슷한 스펙을 가진 API를 사용한다. 다만, 관계형데이터베이스를 지원하지 않는다는 치명적 단점이 있다.

JPA

위에 언급한 모든 데이터 영속 관련 솔루션의 단점을 대부분 해결한 솔루션으로써 관계형데이터베이스에 적합하다. 직렬화처럼 Entity를 만드는 것이 용이하고, JDO와 같이 코드 작성이 용이하다. 또한 대용량 데이터 처리가 용이하며, 데이터의 일관성(consistency)을 준수하고, 동시적 접근이 가능하다. JDBC처럼 쿼리를 지원하며, ORM/ODB 솔루션처럼 상속과 같은 고차원의 객체지향개념을 구현할 수 있다. JDO나 EJB 처럼 특정한 스펙에 묶이지 않아 특정 회사의 솔루션에 종속되거나 엄격한 표준에 묶이지 않는다. 단점이라면 관계형데이터베이스에 특화되어 있어 No-SQL 데이터베이스에는 최고의 솔루션은 아니라는 것이다. 따라서 관계형데이터베이스를 활용한다면 거의 모든 상황에서 최적의 해결책이 될 수 있다. 다만, No-SQL기반 데이터베이스를 활용한다면, 상황에 따라 더 나은 솔루션이 있을 수 있다.

참조:

(1) https://pixabay.com/illustrations/board-school-task-self-abandonment-2161880/

(2) https://docs.oracle.com/cd/E23943_01/apirefs.1111/e13946/ejb3_overview_why.html

--

--

배우는 자(Learner Of Life)

배움은 죽을 때까지 끝이 없다. 어쩌면 그게 우리가 살아있다는 증거일지도 모른다. 배움을 멈추는 순간, 혹은 배움의 기회가 더 이상 존재하지 않는 순간, 우리의 삶은 어쩌면 거기서 끝나는 것은 아닐까? 나는 배운다 그러므로 나는 존재한다. 배울 수 있음에, 그래서 살아 있음에 감사한다.