객체지향으로 접근하는 데이터베이스 - JPA
익히 알고 있듯 데이터베이스는 데이터를 생성하거나 조회를 하기 위해선 insert
, select
와 같은 SQL 문법을 사용해야한다. 데이터베이스에 대해 공부해본 사람들이라면 익숙하게 사용할 수 있을 것이다. 하지만 이를 프로그래밍 언어를 기반으로 하는 서버 개발에서 사용하게 된다면 여러가지 문제에 맞닥뜨리게 된다.
SQL을 이용한 개발의 문제점
- SQL을 직접 작성 & 결과값을 매핑
- SQL 형식으로 코드를 작성하는 수고스러움, 받은 결과값을 일일이 객체로 매핑하는 작업을 직접 진행함에 따라 개발 생산성이 떨어진다.
- SQL에 의존적인 개발
- SQL에 맞게 코드를 작성하다보면 이후 테이블 수정과 같은 상황이 발생했을때 대응하기 쉽지 않다. 이는 명백히 유지보수성을 저하시킨다.
- 연관객체 객체 조회
- 테이블간의 연관관계를 쉽게 파악하기 힘들어 이를 확인하기 위해 많은 비용이 발생한다. 즉, 개발생산성 및 가독성의 문제가 있다.
JPA의 등장
SQL을 이용하여 직접 데이터베이스에 접근하고 결과값을 다시 프로그래밍 언어의 패러다임(객체지향)에 맞게 변환하는 방식은 개발 생상성은 물론 가독성, 유지보수성이 현저하게 떨어진다. 이러한 문제를 해결하기 위해 객체의 관점으로 데이터베이스에 접근하는 방식으로 진화하게 되었고 ORM(Object Relational Mapping)이 등장하게 되었다.
ORM이란 객체지향 프로그래밍에서 관계형 데이터베이스와의 상호작용을 추상화한 기술이다. 개발자는 데이터베이스 스키마를 직접 다루지 않고 데이터베이스 모델과 매핑된 객체 모델을 이용하여 생성, 수정, 삭제 연산을 진행한다. ORM 프레임워크는 이러한 연산을 자동으로 SQL를 쿼리로 바꾸어 데이터베이스와 상호작용을 하게된다. 덕분에 데이터베이스 모델을 직접 다루는데 필요한 코드들을 줄일 수 있었고, 객체지향 방식으로 코드의 일관성까지 갖출 수 있게 되었다. 정리하자면, ORM은 데이터 접근 방식을 객체 방식의 접근으로 추상화하여 개발 생산성과 유지보수성을 높인 프레임워크인 것이다.
자바 진영에서의 ORM 기술 표준은 JPA(Java Persistence Api)이다. JPA는 표준 명세로 추상화된 인터페이스이다. 이를 통해 JPA 표준 명세를 구현한 여러 구현체들을 이용할 수 있다. Hibernate, EclipseLink, OpenJPA 등이 있으며 이 중 가장 많이 사용하는 것이 Hibernate이다.(Hibernate의 개발자가 JPA 표준 명세를 만들었다고 들었다)
JPA는 내부적으로 JDBC API를 사용하여 데이터베이스와 상호작용을 맺는다. 즉, 객체관점으로 작성된 코드를 JPA를 구현한 프레임워크들이 JDBC API로 변환하여 동작한다는 뜻이다.
객체지향과 RDB 간의 불일치
객체지향과 관계형 데이터베이스는 설계의 중심이 다르다. 객체지향은 객체를 중심으로 관계를 맺으며 데이터베이스는 데이터를 중심으로 관계를 가진다. 이러한 문제는 ORM이 해결해야할 가장 큰 이슈이다. 정확히 어떤 문제가 있으며 JPA가 어떤 방식으로 해결하는지 가볍게 알아보자.
상속
부모의 속성을 자식이 물려받는 상속은 객체지향에만 존재하는 개념이다. 데이터베이스에는 상속이란 개념이 존재하지 않는다. 대신 데이터베이스에는 슈퍼타입-서브타입 모델링 기법이 존재하는데 JPA는 상속을 이 개념과 연관짓는다. 따라서, 상속관계의 엔티티 객체는 JPA가 지정한 모델링 기법으로 매핑해준다.
객체,테이블간 연관관계
객체지향에서 다른 객체와 연관관계가 있다하면 해당 객체의 참조값을 가지고 있는다. 뿐만 아니라 참조값을 가지고 있는 객체에서 참조객체로 단방향 관계이다. 이에 반해 데이터베이스는 두 테이블간의 연관관계는 하나의 데이터인 외래키로 이루어진다. 또한 해당 외래키 하나로 두 테이블이 양방향으로 관계를 맺을 수 있다. 뿐만 아니라 객체는 연관된 객체를 연쇄적으로 참조할 수 있다. 이러한 객체참조를 JPA가 자동으로 외래키 참조로 변환해준다.
동일결과 객체 비교
객체지향의 경우 컬렉션내에서 동일한 위치의 객체는 당연히 동일성을 보장한다. 하지만 데이터베이스에서 가져온 데이터는 동일한 결과일지라도 같은 객체가 아니다.(다른 인스턴스이므로) 이러한 부분을 JPA는 영속성 컨텍스트라고 부르는 임시공간을 이용하여 이전 조희를 캐시해 동일성을 보장한다. 영속성 컨텍스트는 이보다 더 복잡한 매커니즘을 가지지만 일단은 캐시 저장소의 역할을 한다는 것만 기억하자.
JPA의 장점
JPA를 사용함으로써 얻는 이점을 정리해보자.
첫 번째로 개발 생산성이다. 객체의 관점으로 개발을 할 수 있으며 결과값도 객체로 매핑되어 보일러 플레이트 코드들을 줄일 수 있다. 두 번째로 유지보수성이다. 여러가지 보일러 플레이트 코드를 줄일 수 있을 뿐더러 컬럼 추가와 같은 일이 일어나도 쉽게 대응할 수 있다. 세번째로 외부 기술과의 낮은 결합성이다. JPA 인터페이스에 맞는 코드를 작성하므로 데이터베이스가 바뀌어도 문제없이 잘 동작한다.
아래 강의 및 도서를 학습 후 작성하였습니다.
댓글남기기