JDBC / Persistence Framework / ORM

SangHyun-Park·2022년 2월 27일
0
post-thumbnail

JDBC

실제 서비스를 진행하는 어플리케이션에서 데이터베이스와의 연동을 위해서는 필요한 Query 마다 데이터베이스에 전송하여 변경된 부분을 반영하는 방식을 사용한다.

하지만 데이터베이스 별로 문법이 상이하기 때문에 같은 Query 문을 작성한다고 해서 서로 다른 데이터베이스에 적용이 가능한 것은 아니다.

이러한 전반적인 문제점을 보완하기 위해서 JDBC API 가 사용된다.

JDBC API는 추상화 객체이며 JDBC Driver Manager - JDBC Driver가 이를 구현화 한다.
이를 통해 개발자는 데이터베이스 플랫폼에 독립적인 개발환경을 갖출 수 있게 되었고, 동일한 코드 대비 데이터베이스별 동일한 결과를 기대할 수 있게 되었다.

단, JDBC API 도 여전히 단점(혹은 불편한 점)이 존재하는데, 위 사진의 layer 를 봐도 알 수 있겠지만 데이터베이스와 바로 맞닿아있는 계층이기 때문에 데이터베이스와의 Connection 관리를 해줘야하는 번거로움이 있다. 이는 개발자로 하여금 불필요한 중복 코드를 생성하게 하고, 관리를 복잡하게 만든다.

따라서 위와같은 부분을 보완하고 독립적인 Query 생성 환경을 구축하기 위하여 위하여 Persistence Framework 가 등장하였다.

다만, Connection 관리는 Spring JDBC 가 대부분 수행

Persistence Framework

Persistence는 영속성 을 의미하는데, 여기서 영속성이란 프로그램이 종료되더라도 데이터가 사라지지 않는 속성을 이야기한다.

사라지지 않는다는 것은 메모리와 같은 휘발성 저장소에서 디스크(데이터베이스 저장소) 로 데이터가 이동된다는 것을 이야기하는데, 쉽게 말해 데이터를 영구적으로 저장하는 것을 의미한다.

Persistence Framework 는 영속성을 부여해주는 역할을 하는데 이 때 사용되는 방식이 SQL Mapper 와 ORM 이다

SQL Mapper 와 ORM 은 비슷하지만 사뭇 다른 성향을 띄는데, 이름에서부터 무엇을 중심으로 여기는지 알 수 있다.

SQL Mapper : SQL 의 독립적인 작성 환경을 보장하며, 약속된 형식으로 작성된 Query 문과 이를 다루는 코드를 JDBC 코드로 바꾸어주는 역할을 수행한다.

ORM : Object Relational Mapping 의 약자이며, 자바 객체로 생성된 Entity 또는 Query Method 를 JDBC 코드로 바꾸어주는 역할을 수행한다.

SQL Mapper

위에서 이야기한 코드의 중복성을 제거하고, 쿼리 작성에 독립적인 환경을 구축하기 위해 개발된 SQL Mapper 는 형태에서부터 주안점이 무엇인가 드러난다.

MyBatis 는 xml 파일에 Query 를 작성하고, JDBC 코드로 바꾸어 실행시키는 역할을 한다.

Query 자체를 독립적인 파일에 작성할 수 있기 때문에 가독성이 좋으며, JDBC에서 제공하는 대부분의 기능을 수행할 수 있다는 장점이 있다.

그러나 XML 파일의 특성상, 쿼리문에 오류가 있더라도 빌드과정에서 오류를 발생시키지 않는다는 문제가 발생한다.

빌드과정에서 오류가 발생하지 않기에, 유지보수 또는 QA 테스트를 위해서 모델 객체, 컨트롤러, 서비스 등 어플리케이션을 전체적으로 점검 및 확인해야 한다는 어려움이 있다.

MyBatis는 객체의 모델링 보다 데이터 중심 모델링(테이블 설계)에 조금 더 신경을 써야하는 구조이며, 이는 객체 지향의 장점을 사용하지 않는 것이라고 평을 받았다.

따라서 이를 보안하기 위해서 ORM 개념이 제시되었다.

ORM

객체 지향 프로그래밍에서 주안점 중 하나는 공통속성을 가지는 데이터는 객체로 관리한다는 것 이다.

이 관점에서 데이터베이스 진영의 테이블과 쿼리는 객체와 메소드로 생성(mapping) 되기에 적합한 구조인데 이 때 사용되는 개념이 ORM 이다.

ORM 에서의 핵심개념을 통해 개발자는 따로 Query 문을 작성할 필요가 없어지고, 결과적으로 비즈니스 로직 개발에 더욱 집중이 가능하다.

JPA

Java Persistence API 의 약자인 JPA 는 Java ORM 표준이다.
앞서 말했듯이 ORM 이라는 개념은 객체 지향 프로그래밍 구조에서 사용될 수 있는 구조이고, JPA 가 Java 영역에서의 ORM 의 표준을 제시하는 Interface 이다.

이 외에도 JPA 는 내부적으로 영속성 컨택스트를 생성하여 Entity 를 관리한다.
변경 감지를 통해서 개발자가 Entity 를 수정하기만 해도 알맞은 쿼리가 생성되고, 쓰기 지연 방식을 통해서 Query 저장소에 있는 Query 들을 한번에 flush 시킴으로써 Connection 을 최소화해 서비스 성능을 향상시킬 수 있다.

앞서 Interface 라는 것은 이를 구현할 구현체가 필요하다는 것인데, 대표적인 구현체가 Hibernate 이다.

Hibernate

Java ORM(JPA) 구조에서 개발자가 따로 Query를 작성하지 않아도 되는 이유는 이 Hibernate 가 내부적으로 Query 를 생성하고 JDBC API 를 호출하기 때문이다.

다만 내부적으로 생성되는 Query 는 모든 개발환경에 적합하다고는 볼 수 없으며, 개발자 본인이 능동적으로 쿼리를 수정할 필요가 있는데 이 때 사용되는 것이 Spring Data JPA 이다

Spring Data JPA

JPA 를 한단계 더 추상화 시킨 Repository 라는 개념을 제시하며, 개발자는 Repository Interface 에 JPARepository 를 상속하기만 하면 사용 시점에 Spring 이 알아서 구현화 된 객체를 주입해준다.

또한 Repository Interface 내부에서 작성된 메소드(예약어 사용) 또한 Spring 이 적합한 Query 를 생성하여 전송하도록 생성해준다.

또한 Query annotation 을 통해서 개발자가 생성한 Query 문을 전송할 수 있게 해준다.

profile
https://ppaksang.tistory.com/ 옮겼습니다 !!

0개의 댓글