본문 바로가기
스프링/JPA

[JPA] JPA란?

by 책 읽는 개발자_테드 2021. 4. 20.
반응형

 

이 글은 JPA의 개념, JPA가 등장한 배경, JPA의 장-단점에 대해서 다룹니다. 추가적으로 가장 많은 자바 개발자가 사용하는 프레임워크인 스프링에서 어떻게 JPA를 사용하는지 알아봅니다.

 

학습목표

 

- JPA의 등장과 개념

- Spring Data JPA


JPA의 등장과 개념

 

기존에 스프링에서는 관계형 데이터베이스(이하 RDBS)를 다룰 때 iBatis, MyBatis와 같이 쿼리를 매핑하는 SQL Mapper를 많이 사용했다. 하지만 이러한 기술은 객체 모델링보다 테이블 모델링에만 집중하게 만들고, 객체를 단순히 테이블에 맞추어 데이터를 전달하는 역할만 할 수 있다는 단점이 있었다.

 

RDBS는 데이터를 어떻게 저장할지에 초점이 맞춰진 기술이다. 반대로 객체지향 프로그래밍 언어는 메시지를 기반으로 기능과 속성을 한 곳에서 관리하는 기술이다. 개발자가 공들여 설계한 자바 클래스도 SQL을 통해서만 RDBS를 저장하고 조회할 수 있다. 

 

RDBS와 객체지향 프로그래밍 언어의 패러다임이 불일치하는 상황에서 객체를 데이터베이스에 저장하려고 하니 여러 문제가 발생하였다.

 

SQL을 직접 다룰 때의 문제점

- 도메인 별로 유사한 CRUD 코드를 반복적으로 작성해야 한다.

- SQL이 변경되면 수정할 사항이 많다. ex) User 테이블에 hobby 컬럼을 추가한다고 가정하자. 1.CRUD 각각에 hobby 컬럼을 추가하고, 2.JDBC 연결에서 각각 파라미터 추가를 위해 setHobby 메소드를 작성하고, 3.DB 결과 매핑에 setHobby 메소드를 작성해야한다.

- 즉, 자바의 객체와 데이터베이스의 테이블이 정확하게 일치하지 않으므로 둘 사이를 매핑하기 위해 많은 SQL 구문과 자바 코드가 필요하다.

 

문제의 해결책으로 JPA라는 자바 표준 ORM(Object Relational Mapping) 기술이 등장했다. JPA는 객체지향 프로그래밍 언어와 RDBMS를 중간에서 패러다임 일치를 시켜주기 위한 기술이다.

 

ORM은 이렇게 정확하게 일치하지 않는 자바 객체와 테이블 사이를 매핑해준다. 즉, 자바 객체에 저장된 데이터를 테이블의 Row 정보로 저장하고, 반대로 테이블에 저장된 Row 정보를 자바 객체로 매핑한다. 이 과정에서 사용되는 SQL 구문과 자바 코드는 ORM 프레임워크가 자동으로 만들어준다.

 

개발자는 객체지향적으로 프로그래밍을 하고, JPA가 이를 관계형 데이터베이스에 맞게 SQL을 대신 생성해서 실행한다. 개발자는 항상 객체지향적으로 코드를 표현할 수 있으니 더는 SQL에 종속적인 개발을 하지 않아도 된다. 

 

물론 JPA도 단점이 있다. 대표적으로 ‘높은 러닝 커브’가 존재한다. JPA를 잘 쓰려면 객체지향 프로그래밍과 관계형 데이터베이스를 둘 다 이해해야한다.

 

하지만 그만큼 JPA를 사용해서 얻는 보상은 크다. CRUD 쿼리를 직접 작성할 필요가 없으며, 부모-자식 관계 표현, 1:N 관계 표현, 상태와 행위를 한 곳에서 관리하는 등 객체지향 프로그래밍을 쉽게 할 수 있다.

 

Spring Data JPA

 

JPA는 인터페이스로서 자바 표준명세서다. 인터페이스인 JPA를 사용하기 위해서는 구현체가 필요하다. 대표적인 구현체로 Hibernate, Eclipse Link 등이 있다.

 

Spring에서 JPA를 사용할 때는 이 구현체들을 직접 다루지 않는다. 구현체들을 좀 더 쉽게 사용하고자 추상화시킨 Spring Data JPA라는 모듈을 이용하여 JPA 기술을 다룬다. 

 

JPA <- Hibernate <- Spring Data JPA

 

이렇게 한 단계 더 감싸놓은 Spring Data JPA가 등장한 이유는 다음과 같다.

 

1. 구현체 교체의 용이성

2. 저장소 교체의 용이성

 

구현체 교체의 용이성이란 Hibernate의 수명이 다했을 때 다른 구현체로 쉽게 교체하기 위함이다. 다음으로 저장소 교체의 용이성이란 관계형 데이터베이스 외에 다른 저장소로 쉽게 교체하기 위함이다.  예를 들어 RDBMS에서 MongoDB로 교체가 필요하다면, 개발자는 Spring Data JPA에서 Spring Data MongoDB로 의존성 교체만하면 된다.

 

 

출처

스프링 퀵 스타트

스프링 부트와 AWS로 혼자 구현하는 웹 서비스

velog.io/@asdfg5415/SQL%EA%B3%BC-JPA

반응형

댓글