JPA 기본 개념과 사용 이유 ( Feat. JDBC )

김민건·2022년 4월 2일
3

JAVA

목록 보기
2/2

Spring에서 데이터베이스에 접근하려고 할 때, 흔히들 MyBatis, Hibernate, Spring Data 프레임워크 등의 다양한 선택지들을 검색하고 결정한다. 하지만 이 키워드들에 대해서 찾아보면 가장 많이 보이는 단어는 JPA일 것이다. 평소에 단순히 "JAVA 표준 ORM이니까~"라고 넘어갔었는데, 대체 이 JPA라는 놈은 가 무엇인지 이번 기회에 확실하게 이해해보고자 한다

JPA 기본 개념

JPA는 JAVA 진영에서 사용되는 ORM 표준 인터페이스다.
즉, JPA를 풀어서 얘기하자면 "JAVA 어플리케이션에서 ORM은 요런 공통된 형태로 만드시면 됩니다!" 라고 정의해놓은 것이다.

그리고 이 JPA라는 약자를 풀어서 보면 Java Persistence API인데, 우리가 JPA를 명확히 이해하기 위해서 먼저 이 Persistence(영속성) 이라는 것부터 간략하게 살펴보고 넘어가보자.

Persistence(영속성)

사실 영속성이라는 개념은 별 것 없다. 우리가 데이터베이스를 사용하는 이유가 무엇일까? 파일 시스템과 연결지어 얘기하면 여러가지가 있겠지만, 결국에는 데이터를 영구적으로 저장하기 위해서다

회원가입하여 계정을 생성했는데, 서버가 꺼지거나, 페이지에서 벗어났더니 초기화되면 어떻게 되겠는가? 때문에 우리는 흔히 데이터베이스를 통해 이 영속성을 가지는 것이다.

이 당연한 얘기를 왜 꺼냈는가하면, JPA 명칭 자체에도 Persistence라는 이름이 붙어있을 뿐더러, 이를 통해 개발된 구현체는 Persistence Framework에 속하기 때문이다.

Persistence Framework

위처럼 자료에 영속성을 부여하기 위한 작업에서 우리는 일반적으로 데이터베이스를 사용한다. 하지만 데이터베이스에 접근해서 데이터를 관리하는 것에는 SQL이나 그 데이터베이스에 적합한 명령어를 사용해야한다. 근데 우리는 이 DB에 접근을 백엔드를 개발하면서 밥 먹듯이 해야한다. API 설계, 데이터 가공, 권한 설정 등등 해야할 게 너무 많고 그때마다 DB 접근은 기본이다. 이 때, 이 데이터베이스에 접근하여 조작하는 과정을 도와주는 프레임워크를 바로 Persistence Framework라고 한다.

하지만 여기에도 크게 ORM과 SQL Mapper, 이 두 가지 종류로 나뉘는데, 우리가 오늘 중점적으로 다룰 녀석은 ORM이다. 하지만 SQL Mapper도 간략하게 짚고 넘어가보자

SQL Mapper

SQL Mapper는 말 그대로 SQL구문을 매핑시켜서 데이터베이스에 질의하는 것이다. 즉, 우리는 직접 SQL 구문을 작성해야 한다. 대신, 이렇게 받아온 질의 결과를 바로 객체 형태로 받아올 수 있다는 장점을 지닌다.

ORM

반면, ORM은 우리가 직접 SQL 구문을 사용하지 않고, 객체와 데이터베이스의 스키마를 매핑시킨다. 이를 통해 우리는 어플리케이션 개발 언어로 ORM에서 제공하는 메소드를 적절히 조합하여 데이터베이스를 조작할 수 있다.

SQL Mapper vs ORM

이제 정리해보자.

SQL Mapper는 SQL구문을 직접 작성하기 때문에, 기존의 쿼리문처럼 복잡한 쿼리문 작성도 용이하고 내가 설계한대로 동작한다는 신뢰를 가질 수 있다. 게다가 일반 쿼리문에 비해 질의 결과를 객체로 매핑시켜주기 때문에 불필요한 작업을 최소화시킬 수 있다.
하지만 역시 이러한 특성으로 인해 특정 데이터베이스에 종속적으로 구현될 수 밖에 없다는 점과, 스키마 수정 시 어플리케이션에서 수정해야할 부분이 많다는 단점을 지니고 있다.

ORM의 경우에는 객체와 데이터베이스의 스키마를 직접적으로 매핑시키므로, SQL을 직접 사용하지 않고 메서드를 통해 구현이 가능해서 간편하며, DB에 종속적이지 않고 ORM에서 지원하는 DB들 중에 자유자재로 전환할 수 있다는 장점과 스키마 수정 시 건드려야할 부분이 많지 않다는 장점을 가진다.
하지만 SQL을 직접 작성하는 것에 비해 성능과 유연성, 세밀함이 떨어지고, ORM마다 별도의 메서드를 사용할 수 있기 때문에 익숙해지는 데 시간이 필요하다는 단점을 지닌다.

여기서 JPA는 JAVA 진영에서 ORM의 표준 규약에 해당된다. 그렇다면 이 JPA라는 놈은 기존에 어떤 문제가 있었길래 사용하게 된걸까?

JPA 사용 이유

JPA 전에는 순수 JDBC를 통해 자바 어플리케이션에서 데이터베이스에 접근했다. 그리고 현재 Persistence Framework를 통한 DB 접근에도 내부적으로 JDBC가 사용되고 있다.
따라서 JPA의 사용 이유 뿐만 아니라, 기본 개념을 다지기 위해서라도 먼저 JDBC라는 놈에 대해서 알아둘 필요가 있다.
( 등장배경으로 보면 JDBC -> iBatis -> JPA 순으로 등장하였다 )

JDBC와 JPA

우리는 데이터베이스에 SQL을 통해 접근한다고 보통 알고 있다. 물론 틀린말은 아니다. 하지만 SQL은 DBMS에 접근한 후, 조작을 하기 위한 언어라는 것을 명확히 해두어야 한다.

어플리케이션에서 데이터베이스에 접근해서 SQL문을 전달하기 위해서는, 각 DBMS에서 제공하는 API로 통신한다. 하지만 JDBC는 통일된 인터페이스로 자바 어플리케이션에서 DB에 접근할 수 있도록 하는 규약이자 API다. 다시 말하자면, 위에서 SQL Mapper를 말했던 것처럼 동일한 SQL구문으로 다른 DBMS에서도 똑같이 동작하도록 통일시켜준다는 것이 아니다. 각기 다른 DBMS에 접근하는 메소드를 통일시킨 것이다.

JDBC를 통해 통일된 인터페이스로 우리는 자바 어플리케이션으로 DBMS에 접근할 수 있고, DBMS가 달라지면, JDBC와 DB 중간에 있는 JDBC Driver만 변경해주면 우리는 사용하는 데이터베이스를 변경할 수 있는 것이다.

여기서 JPA는 한 발자국 더 나아가, 어플리케이션과 JDBC 중간 다리에서 기능하여 DB 작업을 보조해주도록 공통된 설계 형태를 제공해주는 인터페이스라고 생각하면 된다.

그렇다면 왜 이런 구조가 필요했던 것일까?

JDBC의 한계

개발자의 입장에서 JDBC는 기본 SQL문, JPA는 메서드로 DB를 조작한다. 이 부분으로 인한 차이점은 SQL Mapper를 얘기하면서도 나온 부분인데, 스키마 수정이나 특정 DBMS에 종속적이라 유지보수성이 떨어진다는 문제가 발생한다. 심지어 객체로 반환되는 것이 아니라 일반 자료형 형태로 반환받아서 객체로 변환하는 과정도 필요하기 때문에 단순하고 중복된 작업을 반복해야한다.

하지만 JPA가 등장하게 된 가장 핵심적인 이유는 바로 객체 지향 프로그래밍을 추구하기 위해서다.

JAVA의 핵심은 누가 뭐래도 객체 지향일 것이다. 하지만 이는 관계형 데이터베이스의 성질과 상이한 부분이 많다. 어플리케이션이 커지고 복잡해질수록 그만큼 데이터베이스 스키마도 확장된다. 여기서 발생하는 괴리감이 커지면서 점차 객체 지향과 데이터 지향 간의 혼동이 발생해서 설계 방식이 뒤틀리는 현상이 발생했던 것이다. 이런 패러다임의 불일치를 해결하기 위해 객체와 데이터베이스 스키마를 매핑시켜주는 자바 진영의 ORM 표준인 JPA가 등장하게 되었고, 오늘날 Hibernate와 같은 구현체를 통해 자바 어플리케이션이 개발되고 있다.

마치며

JPA는 Spring Data JPA, Hibernate, QueryDSL, Jooq 등 다양한 개념에서 등장하는 필수 지식인만큼 몇 단계에 거쳐서 이들 모두 포괄하는 내용으로 정리해보려한다.
뭔가 파면 팔수록 자꾸 새로운 내용이 등장하는 것 같아 당혹스럽지만, JPA, JDBC 등과 같은 기본적인 개념들을 기반으로 확장해서 생각해보니 옛날에는 그렇게 어렵게 느껴졌던 Hibernate가 왜 그랬는지 이해가 안될 지경이다 ㅋㅋㅋ

한국은 Spring의 왕국인만큼 그 근간이 되는 기술들에 대한 개념은 필수적으로 알아두도록 하자!

References

profile
백엔드 꿈나무

0개의 댓글