안녕하세요👻
요즘 스프링 부트에 대해 이것저것 공부를 하고 있는데요,
프로젝트를 만드는 과정에서 피할 수 없는 문제가 바로 데이터베이스를 다루는 일이었습니다!
그래서 오늘은 자바 객체를 관계형 데이터베이스로 매핑하는데 필요한 필수 요소인 JPA가 무엇인지에 대해 간단하게 알아보겠습니다!
JPA(Java Persistence API)란, 자바 ORM 기술에 대한 API 표준입니다.
여기서 ORM이란, Object Relational Mapping의 약자로 객체와 관계형 데이터베이스를 매핑해주는 것을 말합니다.
그렇다면 이 ORM이라는 기술은 어떻게 등장하게 되었을까요?🤔
JPA를 공부하기 전, 관계형 데이터베이스의 문제점을 먼저 알아봅시다!

만약 상품 데이터를 관리하는 Item 클래스가 있다고 가정해봅시다.
상품 데이터를 관계형 데이터베이스에서 관리하기 위해서는 SQL문을 주로 사용하죠?
이 SQL 중심 개발의 문제점은 개발자가 CRUD라고 불리는 INSERT, UPDATE, SELECT, DELETE 문을 작성해서 객체를 관계형 데이터베이스에 넣어주고 가져오는 작업을 하는 것입니다.
즉, 자바 객체를 SQL을 통해 데이터베이스에 관리하게 하고 데이터베이스에 저장된 데이터를 자바 애플리케이션에서 사용하려면 SQL을 통해 다시 자바 객체로 변환해야 한다는 번거로운 문제점이 발생하는 것이죠.
개발자가 SQL을 매핑하는 역할을 계속 반복해야 한다는 의미입니다. 이것이 바로 첫 번째 문제점입니다.
이런 단순 반복 작업의 문제 외에도 한 가지 문제가 더 있습니다. 그것은 바로 패러다임 불일치 문제입니다.
관계형 데이터베이스는 어떻게 데이터를 저장할지에 초점이 맞춰진 기술입니다.
반대로 객체지향 프로그래밍 언어는 메시지를 기반으로 기능과 속성을 한 곳에서 관리하는 기술입니다.
쉽게 말해, 객체를 데이터베이스에 넣기 위해서는 SQL문을 통해 변환해서 저장해야하고, 데이터베이스에서 객체를 다시 꺼내오기 위해서는 복잡한 SQL문을 작성해야 합니다.
결국 객체를 단순히 데이터 전달 목적으로 사용할 뿐 객체지향적으로 프로그래밍을 할 수 없다는 것이죠.
이것이 바로 객체지향과 관계형 데이터베이스 간의 패러다임이 불일치하기 때문입니다.
그래서 이러한 문제점들을 해결하기 위해 나온 기술이 바로 ORM이라는 기술이죠..! JPA라는 것은 자바 표준 ORM 기술인 것이고요😲
이 ORM 기술 덕분에, 개발자는 객체지향적으로 프로그래밍을 하고, JPA가 이를 관계형 데이터베이스에 맞게 SQL을 대신 생성해서 실행합니다. 개발자는 항상 객체지향적으로 코드를 표현할 수 있으니 더는 SQL에 종속적인 개발을 하지 않아도 되는 것이죠!
이렇게 객체 중심으로 개발을 할 수 있게 되니 생산성 향상은 물론 유지 보수하기가 정말 편해졌다고 하는데요? 이런 점 때문에 규모가 크고 365일 24시간, 대규모 트래픽과 데이터를 가진 서비스에서 JPA는 점점 표준 기술로 자리 잡고 있다고 합니다!

그렇게 자바 표준 명세서인 JPA는 인터페이스로서 사용하기 위해서는 구현체가 필요한데요, 대표적으로 Hibernate, Eclipse, Link등이 있습니다.
하지만 Spring에서 JPA를 사용할 때는 이 구현체들을 직접 다루지는 않고, 구현체들을 좀 더 쉽게 사용하고자 추상화시킨 Spring Data JPA라는 모듈을 이용하여 JPA 기술을 다룬다고 합니다.
📍특정 데이터베이스에 종속되지 않음
애플리케이션 개발을 위해 데이터베이스로 오라클(Oracle)을 사용하여 개발을 진행했다고 가정해봅시다.
만약 오라클을 오픈소스인 MariaDB로 변경한다면 데이터베이스마다 쿼리문이 다르기 때문에 전체를 수정해야 합니다😣
따라서 처음 선택한 데이터베이스를 변경하기 굉장히 어려운데.. 하지만 JPA는 추상화한 데이터 접근 계층을 제공하기 때문에 설정 파일에 어떤 데이터베이스를 사용하는지 알려주면 얼마든지 데이터베이스를 변경할 수 있다는 장점이 있습니다👍
📍객체지향적 프로그래밍
JPA를 사용하면 데이터베이스 설계 중심의 패러다임에서 객체지향적으로 설계가 가능합니다. 이를 통해 좀 더 직관적이고 비즈니스 로직에 집중할 수 있도록 도와주죠👍
📍생산성 향상
데이터베이스 테이블에 새로운 컬럼이 추가되었을 경우, 해당 테이블의 컬럼을 사용하는 DTO 클래스의 필드도 모두 변경해야 하지만, JPA에서는 테이블과 매핑된 클래스에 필드만 추가한다면 쉽게 관리가 가능합니다. 또한 SQL문을 직접 작성하지 않고 객체를 사용하여 동작하기 때문에 유지보수 측면에서 좋고 재사용성도 증가하죠👍
📍복잡한 쿼리 처리
통계 처리 같은 복잡한 쿼리를 사용할 경우는 SQL문을 사용하는 게 나을 수도 있습니다. JPA에서는 Native SQL을 통해 기존의 SQL문을 사용할 수 있지만, 그러면 특정 데이터베이스에 종속된다는 단점이 생깁니다.
📍성능 저하 위험
객체 간의 매핑 설계를 잘못했을 때 성능 저하가 발생할 수 있으며, 자동으로 생성되는 쿼리가 많기 때문에 개발자가 의도하지 않는 쿼리로 인해 성능이 저하되기도 합니다.
오늘은 이렇게 JPA에 대해서 간단하게 알아보았는데요!
JPA는 이론 뿐 만 아니라 핵심 원리, 성능 최적화 방법 등 갖추어야 할 지식이 너어어무 많기 때문에 공부량이 많이 요구되는 분야입니다😂(견뎌)
그럼 다음 포스트로 찾아뵙겠습니다. 읽어주셔서 감사합니다 :)