[JPA-01] JPA를 왜 사용해야 할까?

이가희·2024년 11월 16일
3

JPA

목록 보기
1/16
post-thumbnail

국비 지원, 부트 캠프에서 거의 필수적으로 포함되어 있는 JPA.

신입 개발자 면접에도, JPA 사용 경험과 n+1 문제 해결 방법을 묻는 것도 흔하다.

Java 공화국 한국에서 왜 여기저기서 JPA,, JPA,, 를 외치는걸까?
JPA 등장 배경, JPA를 사용하는 이유들을 간단히 살펴보며 이제 우리도 JPA 이야기가 나올 때마다 슬쩍 아는 척을 해 보기로 하자.

이 포스팅을 잘 읽는다면, 면접 단골 질문인 JPA 정의, SQL mapper와 ORM 의 차이, JPA의 이점을 알 수 있게 될 것이다.


chapter
1. JPA 란
2. JPA 이점 (feat. 관계형 데이터베이스와 객체 지향과의 패러다임 불일치)

1. JPA 란

JPA는 Java Persistence API 의 약자로,** 객체를 관계형 데이터베이스에 매핑하기 위한 표준 인터페이스를 제공**하는 역할을 한다.
더 구체적으로 의미를 살펴보도록 하자.
Java 어플리케이션에서 데이터베이스에 접근하려면 JDBC를 이용해야 한다.
순수 JDBC만으로도 프로그래밍을 할 순 있지만, 대게는 Mybatis와 같은 SQL Mapper Framework를 이용한다.
SQL Mapper Framework는 단어 그대로, 백엔드 개발자가 직접 작성한 SQL 문을 통해 어플리케이션과 데이터베이스가 상호작용 하도록 매핑 해주는 기능을 한다.

그런데 JPA는 SQL 문을 통해서가 아닌, 객체 그 자체를 데이터베이스에 매핑을 하여, 어플리케이션과 데이베이스가 상호작용 하도록 도와준다.
물론 JPQL을 통해 SQL 문을 이용할 때도 있지만, 이는 기본 JPA 를 더 이해한 다음 개념을 익혀보고, 여기서는 논외로 하겠다.

여기까지만 알아도 myBatis와 같은 SQL Mapper Framework와 JPA와 같은 ORM 의 차이를 묻는 면접관의 질문에 어느 정도 대답을 할 수 있다.
그런데 ORM과 SQL Mapper의 차이와, JPA의 이점이 더 구체적으로 궁금하지 않은가? 바로 아래에서 확인 해 보도록 하자.

2. JPA 이점 (feat. 관계형 데이터베이스와 객체 지향과의 패러다임 불일치)

mySql, Oracle 등 관계형 데이터베이스는 객체 지향 프로그래밍인 Java와 잘 맞지 않는 부분이 있다.
SQL Mapper Framework를 이용한다면, 이 둘의 패러다임 불일치를 개발자가 직접 해결해야 해서 많은 시간과 코드라인을 소모하게 된다.
그런데 JPA를 이용한다면, 이 패러다임 불일치 문제를 일임할 수 있다.
어떻게 해결하는지 차근 차근 상황들을 살펴보자.

1. 상속 문제

객체는 상속이라는 기능을 가지고 있지만 관계형 데이터베이스는 상속 기능이 없다.
만약 사람을 상속받는 학생 클래스가 다음과 같이 있다고 해 보자.

abstract class Person{
 String name;
 int age;
}

class Student extends Person {
 int studentNumber;
}

여기서 Student 객체를 DB에 저장하려면, Person table에 한 번, Student table에 한 번, 총 두 번을 저장해야 한다.
만약 순수 JDBC 나 SQL Mapper를 사용한다면, Person table에 저장할 SQL을 작성하고, Student table에 저장할 SQL을 작성해야 한다.
그리고 조회할 때에는 join을 이용하여 객체를 불러와야 한다. 이는 여간 수고스러운 것이 아니다.

그런데 JPA를 이용한다면 이 상속과 관련된 패러다임 불일치 문제를 개발자가 직접 해결하지 않아도 된다.
JPA는 SQL이 아닌, 객체를 데이터베이스와 매핑한다고 했듯이,

jpa.persist(student);

(** 여기서 persist는 JPA에서 제공하는 객체를 저장시켜 주는 메소드이다.) 를 통해, 간단히 저장시킬 수 있다. 이렇게 하면, JPA는 자동으로 해당 객체의 상속 관계를 파악하여, Person table과 Student table에 데이터를 저장하는 SQL를 실행하고, 마찬가지로 조회할때도 find method를 통해 jpa.find(Student.class, studentId); 를 실행시킨다면, 자동으로 두 테이블을 조인해서 필요한 데이터를 조회하고 그 결과를 반환해 준다.

따라서 JPA를 이용한다면 개발자가 직접 SQL 문을 여러개 작성하거나, 조인을 하지 않아도 상속 관계가 있는 객체를 적절히 관계형 데이터베이스에 저장하고, 쉽게 조회할 수 있게 된다.


2. 연관 관계 문제
관계형 데이터 베이스는 외래 키를 이용해 다른 테이블과의 연관 관계를 가지고, 객체는 참조를 통해 다른 객체와 연관 관계를 가진다객.
이러한 연관 관계에서의 패러다임 불일치는 객체지향 모델링을 거의 포기하게 만들 정도로 극복하기 어렵다.

다음의 객체 연관 관계가 있다고 생각해 보자.

이때, 객체 지향 프로그래밍에서 person 객체를 통해 subject를 참조하려면,

person.student.subject;

을 통해 참조 가능하다.

그런데 우리가 순수 JDBC 혹은 SQL Mapper을 이용한다면 개발자가 person 조회 메소드, student 조회 메소드, subject 조회 메소드를 만들어 객체에 대입시킴으로써 직접 이 패러다임 차이를 해결해야 한다.

그런데 JPA를 사용한다면, 이 패러다임 차이를 생각하지 않고 마음껏 객체를 참조할 수 있다.
JPA는 실체 객체를 사용하는 시점까지 데이터베이스 조회를 미루는 지연 로딩을 사용한다. 따라서 다음과 같이 person 만 조회 해도, 참조를 마음껏 할 수가 있게 된다.

// 이때 조회 쿼리를 한 번 날림
Person person = jpa.find(Person.class, personId);

Sutdent student = person.getStudent();
student.getStudentId(); // Student를 사용하는 시점에 조회 쿼리를 날림 (지연로딩)

또한 이러한 패러다임 불일치 문제 뿐만 아니라 JPA를 사용하면 생산성과 유지보수성에 있어서도 큰 이점이 있다.

지루한 CRUD SQL을 개발자는 매번 작성하지 않고, JPA에게 저장할 객체를 넘겨주어 저장시키거나, JPA가 제공해주는 메소드를 이용해 조회하면 된다.

유지보수 측면에서 보자면, 기존 SQL Mapper를 이용하면 엔티티의 필드값이 하나만이라도 추가되어도 기존 INSERT, UPDATE, SELECT 등의 쿼리들을 모두 수정해야 할 수도 있다.

(예를 들어, person table에 name 필드가 추가되면 name 값을 저장시키기 위해 기존 INSERT SQL을 모두 수정해야 할 수도 있다.)

하지만 이런 과정들을 JPA가 대신 처리해주기 때문에, 필드를 추가하거나 삭제해도 수정해야 할 코드가 이전보다 크게 줄어든다.

그리고 JPA는 벤더 독립성이 있다.
JPA는 어플리케이션과 데이터베이스 사이에 추상화된 데이터 접근 계층을 (Dialect) 를 제공하여, 특정 데이터베이스에 종속되지 않도록 한다.
만약 다른 데이터베이스를 사용하고 싶다면, MySQLDialect, OracleDialect 등 자신이 변경하고자 하는 dialect로 변경만 해주면 된다.


이렇게 JPA가 어떤 것이고, 어떤 이점들이 있는지 살펴보았다.
다음 포스팅으로는 JPA 환경 셋팅 및 간단한 사용법을 알아볼 것이다.

참조 : 자바 ORM 표준 JPA 프로그래밍 - 김영한

profile
안녕하세요 개발하는 사람입니다.

0개의 댓글

관련 채용 정보