코드프레소 백엔드 개발자 양성 과정

영속성과 JPA

영속성과 관련 개념 및 도구에 대해 알아본다.

H Lee
6 min readApr 18, 2020
Image by Anna Ryzhkova from Pexels

그동안의 개발 프로젝트에서는 데이터베이스에 접근하기 위해 마이바티스를 사용해 왔다. 요새는 스프링 부트에 접어들어 기존 프로젝트를 JPA(Java Persistence API)와 하이버네이트 등의 ORM(Object-Relational Mapping)을 이용하여 동작하도록 재구현하는 중이다. 실습에 관한 글을 작성하기 전, 관련 개념에 대해 살펴본다.

영속성이란?

우선 영속성이 무엇인지 짚고 넘어가도록 한다. 컴퓨터 공학에서 영속성이란, 한 객체가 자신을 생성한 작업이 종료되었음에도 불구하고 지속적으로 존재하는 상태를 말한다.

하드웨어 측면에서 바라본다면, 데이터가 별도의 기억 장치에 저장되어, 컴퓨터의 전원이 꺼져도 상태가 지속되는 것이다. 간단히 말해, 영속성은 소멸되지 않고 저장될 수 있는 데이터의 성질이다. 이런 특징을 이용해 개발자는 데이터를 전송하고 저장하고 갱신하는 등의 작업을 수행한다.

영속성 프레임워크와 마이바티스

여태까지 내 개발 프로젝트에서는 마이바티스라는 것을 이용했다고 하였다. 그렇다면 마이바티스는 무엇이고 어떤 장단점을 지녔기에 하이버네이트나 JPA 등의 대안 기술이 출시되었으며, 각각을 선호하는 개발자나 조직이 있는 것인지 알아보자.

마이바티스란 영속성 프레임워크의 일종이다. 영속성 프레임워크(persistence framework)란, 자료를 데이터베이스에 저장하는 과정을 도와주고 자동화하는 매개 소프트웨어이다. 이는 응용 프로그램과 데이터베이스 사이에서 벌어질 수 있는 개념적 간극을 추상화해 준다. 한마디로, 데이터를 가공하는 자바 객체 층과 데이터를 저장하는 데이터베이스 층 사이를 매끄럽게 연결하는 이음매이다.

그중 마이바티스는 스프링 프레임워크와 호환이 가능하고 기존의 JDBC보다 사용하기 간단한 영속성 프레임워크이다. 마이바티스는 아래에서 살펴 볼 ORM 프레임워크처럼 자바 객체와 데이터베이스 테이블을 대응시키기보단 자바 메서드와 SQL문을 대응시킨다. 그래서 객체 관계형 매퍼가 아닌 SQL 매퍼라고도 불린다. 이 과정을 XML 서술자나 애너테이션을 통해 구현한다는 점도 특징이다. 무슨 뜻인지 예시를 보자.

다음은 직접 실습한 쇼핑몰 프로젝트에서 최신 배너 다섯 개를 불러오는 자바 메서드와 그에 맞는 SQL 명령문을 대응해 둔 XML 파일이다.

이름이 selectFiveLatestBanners인 메서드가 실행되어 데이터베이스에 접근할 때, 적절한 SQL 조회문이 실행되도록 조회문을 XML 문법에 따라 CDATA 태그로 감싸주면 대응이 완성된다.

이렇기에 마이바티스의 장점으로는 아래와 같은 점들을 꼽을 수 있다.

  1. SQL을 이미 구사할 줄 아는 사람이라면 간편하게 사용할 수 있다.
  2. SQL 문법을 통해 조인이나 정렬 등 복잡하거나 세부적인 명령문도 실행할 수 있다.
  3. SQL 조회문이 이미 최적화되어 있는 프로젝트에 대하여는 큰 변환 없이 곧바로 데이터베이스 연동을 구현할 수 있다.

다만 단점으로는 코드 유지 보수 과정에서 각종 설정 파일, VO 객체, 매퍼 속성값 등을 손수 바꿔가며 작업해야 한다는 점이 있다. 이는 거시적으로 애플리케이션과 데이터베이스 간의 구조적 문제로 불거질 수도 있다.

객체 관계형 매핑 (Object-Relational Mapping)

객체 관계형 매핑(Object-Relational Mapping, ORM)이란 프로그래밍 언어와 데이터베이스 간에 호환되지 않는 데이터를 변환하는 기법이다. 변환 과정 중, ORM 기술은 프로그래밍 언어 내에서 사용될 수 있는 가상 객체 데이터베이스를 생성한다. 그 결과, ORM에서는 VO 객체가 가지고 있는 정보가 개별적인 데이터베이스가 아닌 java.util.Map과 흡사한 컬렉션에 담겨 관리된다고 볼 수 있다. 따라서 관계형 데이터베이스에 접속할 때 쓰이는 SQL을 따로 작성할 필요가 없음은 물론, 아래와 같은 특징을 보인다.

  1. SQL을 개발자가 직접 작성할 수고를 덜어주며, SQL처럼 절차적인 코드 대신 객체 지향적인 코드로 작동해 비즈니스 로직에 집중할 수 있게 해 준다.
  2. ORM은 독립적으로 구현되며 해당 객체를 재활용할 수 있어 재사용성이 높고 유지 보수가 편리하다.
  3. DBMS에 대한 종속성이 줄어든다.

자바 ORM의 대표적인 예로는 오픈 소스 프레임워크인 하이버네이트가 있다.

자바 영속성 API (Java Persistence API)

자바 영속성 API(Java Persistence API, JPA)는 하이버네이트 개발자들이 만든 자바 표준 ORM이다. 인터페이스로 구현체를 생성해 이용하게 되는데 스프링 부트에서는 JPA 구현체로 하이버네이트를 사용한다.

JPA는 마이바티스와 마찬가지로 자바 애플리케이션과 JDBC 사이에서 복잡한 데이터베이스 연결을 처리해 준다. 하지만 한 발 더 나아가, 데이터베이스 연동에 사용되는 코드와 SQL까지 생성해 준다. 마이바티스를 능가하는, 이 기술에 대한 수요와 인기는 전 세계 구글 검색 기반 관심도 분석에서도 확연히 드러난다.

Google Trends

그럼에도 불구하고 마이바티스에 더 익숙하다면, 국내에선 오히려 당연한 것이다. 유독 한국과 중국 두 나라의 경우에만 총 검색량의 과반이 JPA보다 마이바티스 프레임워크에 더 관심을 보이는 것으로 나타났기 때문이다.

Google Trends

JPA가 절대적으로 우수한 기술이라고 단정지을 수는 없으나, 버전, 언어, 기술, 사양 등의 호환이 관건인 웹 개발에서 전 세계 동향을 무시할 수도 없는 노릇이다.

게다가 JPA는 마이바티스와 차별화된, 다음과 같은 특징을 지녔다. JPA의 구현체는 사실상 하이버네이트이므로 하이버네이트 ORM의 이점과 흡사하다.

  1. 데이터 생성, 조회, 갱신, 삭제(CRUD)에 관한 SQL 명령문을 개발자가 반복적으로 작성할 필요가 없어 생산성이 증대된다.
  2. 마이바티스처럼 XML 파일을 따로 관리하지 않고 간편하게 스프링 인터페이스를 선언하여 이용하기 때문에 프로젝트가 구조적으로 간소화된다.
  3. 데이터베이스에 변경을 주고자 할 때 SQL 명령문, VO 등을 일일이 수정하지 않고 해당 JPA 객체만 바꾸면 되어 유지 보수가 쉽다.
  4. 특정 데이터베이스 관리 체계에 얽매이지 않고 영속성을 구현할 수 있다. 마이바티스에선 DBMS마다 다를 수 있는 자료 형태나 SQL 방언을 손수 반영해 주어야 한다.
  5. 상속, 연관 관계 등을 잘 활용하며, 객체가 중심이 되어야 하는 자바 프로그래밍의 철학에 더 알맞다고 볼 수 있다.

그러므로 익혀두면 유용한 기술이 될 것 같다. 다음 글에서는 내 프로젝트에 직접 적용해 보겠다.

--

--