Spring/jpa

[JPA] 왜 JPA를 사용해야 하나?

라임온조 2023. 2. 7. 12:22

1. 자바와 데이터베이스를 연결시키는 방법들

자바로 애플리케이션을 개발하고 관계형 데이터베이스를 데이터 저장소로 사용할 경우에 자바에서 사용되는 객체를 어떻게 잘 처리해서 관계형 데이터베이스에 집어넣어야 한다. 이 과정을 가능하게 하는 방법에는 다음과 같은 것들이 있다.

 

1) JDBC(Java Database Connectivity)

개념

자바에서(아래의 응용프로그램) 데이터베이스(아래의 DBMS)에 접속할 수 있도록 하는 자바 API(아래의 JDBC Interface)

특징

  • 자바 애플리케이션에서 DBMS의 종류에 상관없이, 하나의 JDBC API를 이용해 DB 작업을 처리
  • 각각의 DBMS는 이를 구현한 JDBC 드라이버를 제공한다

단점

  • 간단한 SQL을 실행하는 데도 중복된 코드를 반복적으로 사용
  • Connection과 같은 공유 자원을 제대로 릴리즈(반환) 해주지 않으면 시스템의 자원이 바닥나는 버그 발생
  •  쿼리 실행 이전과 이후에 많은 코드를 작성해야 함(jdbcUrl 연결, 아이디 연결, try catch  코드 등)

2) Persistence Framework

  • JDBC 프로그래밍의 복잡함이나 번거로움 없이, 간단한 작업만으로 데이터베이스와 연동되는 시스템을 빠르게 개발할 수 있게 해 주는 프레임워크.
  • 종류
SQL Mapper ORM(Object-Relation Mapping)
- 객체와 관계형 데이터베이스의 데이터를 개발자가 직접 작성한 SQL을 통해 매핑시키는 프레임워크.
- 객체와 SQL을 매핑하여 JDBC API사용과 응답 결과를 객체로 매핑하는 일을 대신 해줌.
- 개발자가 직접 SQL을 작성해야 함
- 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑시켜주는 프레임워크. 
- 객체 간 관계를 바탕으로 SQL이 자동으로 실행된다.
종류 : 마이바티스, JDBC Template 종류: Hibernate, EclipseLink, DataNucleus
장점
- 세부적인 sql 수정이 쉬움
- 복잡한 sql이 필요한 경우 그 sql을 그냥 작성해주면 됨
장점
- 객체와 테이블을 매핑해서 패러다임의 불일치 문제를 개발자 대신 해결해준다.(데이터 중심인 관계형 데이터베이스를 사용해도 객체지향 개발에 집중할 수 있음)
- DMBS 종속적이지 않음
- 쿼리 종속적이지 않음(객체를 데이터베이스에 저장할 때 sql을 직접 작성하는 것이 아니라 객체를 마치 자바 컬렉션에 저장하듯이 ORM 프레임 워크에 저장하면 ORM 프레임 워크가 적절한 sql을 생성해서 데이터베이스에 객체를 저장함)
- 재사용과 유지보수가 쉬움
단점
- 직접 sql을 작성해야 해서 sql중심적이게 될 수 있음
- 비슷한 sql을 반복적으로 작성해야 함
- sql은 DMBS에 따라 달라지기에, DMBS 종속적임
단점
- 잘못 적용하면 효율성 안 좋아짐
- 복잡한 서비스일수록 난이도가 올라감

2. JPA란?

자바 ORM 기술에 대한 API 표준 명세. 즉, 인터페이스를 모아둔 것.

ORM프레임워크를 이용해서 JPA를 구현했는데, 하이버네이트를 통해 구현한 JPA, EclipseLink를 이용해 구현한 JPA, DataNucleus를 이용해 구현한 JPA가 존재하고, 가장 많이 사용 되는 것은 하이버네이트를 통해 구현한 JPA이다.

3. JPA가 해결해주는 문제점들

1) SQL을 직접 다룰 때의 문제점을 없앨 수 있다

sql을 직접 사용하면 다음과 같은 문제가 발생한다.

  • 엔티티를 신뢰할 수 없다
    • 엔티티에 어떤 필드가 추가되었더라도 DAO나 repository를 확인해서 제대로 sql이 수정되었는지 확인해야 하고, 필요한 경우 모든 sql을 수정해야 한다. 따라서, 엔티티만 보고 제대로 동작하겠다는 확신을 가질 수 없다
  • 진정한 의미의 계층 분할이 어렵다
    • 물리적으로는 SQL과 JDBC API를 DAO나 repository에 숨겨 엔티티와 계층 분할이 된 것 같지만, 엔티티가 변경되면 DAO와 repository를 살펴보고 변경해야 하는 등의 문제가 발생한다

하지만 jpa를 사용하면 다음과 같은 장점이 생긴다

  • 엔티티를 신뢰할 수 있다
    • 엔티티에 어떤 필드가 추가되었더라도 추가적으로 sql을 수정할 필요가 없다. 따라서, 엔티티를 보고 이 엔티티가 올바르게 작동한다고 믿을 수 있다.
  • 진정한 의미의 계층 분할이 가능하다
    • 엔티티가 변경되어도 추가적으로 sql을 변경할 필요가 없어서 DAO 혹은 repository와 엔티티 사이 진정한 계층 분할이 가능해진다.

 2) 패러다임 불일치 문제를 해결할 수 있다

보통, 애플리케이션은 자바라는 객체지향 언어로 개발하고 데이터는 관계형 데이터베이스에 저장한다. 그런데, 객체지향은 추상화, 상속, 다형성 같은 개념을 가지고 있지만, 관계형 데이터베이스는 이런 개념이 없고 데이터 중심으로 구조화 되어 있다. 즉, 둘의 기능과 표현 방법이 다르기 때문에 둘 사이를 개발자가 연결하는 코드를 작성해야 한다는 것이다.

 

하지만 JPA는 아래와 같은 패러다임 불일치 문제를 해결 할 수 있다.

  • 상속과 관련된 패러다임 불일치 문제 해결
    • 상속: 객체의 extends
  • 연관관계와 관련된 패러다임 불일치 문제 해결
    • 연관관계: 객체의 참조, 데이터베이스의 join

3) 객체 그래프 탐색 문제를 해결할 수 있다

객체그래프란 하나의 객체를 통해 그 객체가 참조하고 있는 다른 객체를 가지고 올 수 있는 것을 말한다. 예를 들어 Member가 Team과 Order를 속성으로 가지고 있다면 Member를 통해 Team객체와 Order객체를 살펴볼 수 있다. 또한, Order가 OrderItem을 가지고 있다면 Member를 통해 Order를 살펴보고, Order를 통해 OrderItem을 살펴볼 수 있다.

Member m = new Member();
m.getTeam();
m.getOrder().getOrderItem();

하지만, SQL을 직접 다루면 처음 실행하는 SQL에 따라 객체 그래프를 어디까지 탐색할 수 있는지가 정해진다. 따라서, 어디까지 객체 그래프 탐색이 가능한지 알아보려면 DAO나 Repository를 열어서 sql을 직접 확인해야 한다.

JPA는 지연로딩을 통해 객체그래프를 마음껏 탐색할 수 있게 한다. 

지연로딩이란 실제 객체를 사용하는 시점까지 데이터베이스 조회를 미루는 것을 말한다.

4) 비교 문제를 해결할 수 있다

데이터베이스는 기본키를 통해 같은지 다른지 비교를 하고, 객체는 동일성 비교와 동등성 비교를 통해 비교를 한다. 동일성 비교란 ==을 사용하는 것으로, 객체 인스턴스의 주솟값을 비교하는 것이다. 동등성 비교란 equals메소드를 사용하는 것으로, 객체 내부의 값을 비교하는 것이다.

 

이러한 차이 때문에 데이터베이스의 같은 row를 조회해도 인스턴스에 저장을 한 후 == 비교하면 저장된 인스턴스의 주소가 다르기에 같은 row라도 다르다는 결과를 얻게 된다.

 

하지만 JPA는 같은 트랜잭션일 때 같은 객체가 조회되는 것을 보장하기 때문에 같은 row를 조회했을 때에도 동일성 비교가 가능하게 해 준다.

4. 왜 JPA를 사용해야 할까?

1) 생산성이 좋다(생산 효율성이 좋다)

  • 반복적인 코드, CRUD용 SQL, DDL을 개발자가 직접 작성하지 않아도 된다. 따라서, 조금의 코드, 조금의 시간으로 많은 결과물을 얻어낼 수 있다.

2) 유지보수가 쉽다

  • 필드 추가나 삭제시 JPA가 수정을 대신 해주는 부분이 많아져 개발자가 수정해야 할 코드가 줄어든다
  • 또한 패러다임 불일치 문제 해결해주기 때문에 객체지향 언어가 가진 장점을 활용해서 유연하고 유지보수하기 좋은 도메인 모델을 편리하게 설계할 수 있다

3) 패러다임 불일치 문제 해결

4) 성능

  • JPA는 애플리케이션과 데이터베이스 사이에서 다양한 성능 최적화 기회를 제공한다. JPA는 애플리케이션과 데이터베이스 사이에서 동작하기 때문에 애플리케이션과 데이터베이스 사이 계층이 하나 더 생기게 되고, 이 계층에서 최적화 관점에서 시도해볼 수 있는 것들이 많아진다.

5) 데이터 접근 추상화와 벤더 독립성

  • 관계형 데이터베이스는 같은 기능이더라도 벤더(판매사)가 누구인지에 따라 사용법이 달라지는 경우가 있다. 이러한 이유로, 애플리케이션은 처음 선택한 데이터베이스 기술에 종속되게 된다.
  • 하지만 JPA는 애플리케이션과 데이터베이스 사이에 추상화된 데이터 접근 계층을 제공해서 애플리케이션이 특정 데이터베이스 기술에 종속되지 않도록 한다. 만약 데이터베이스를 변경하면 JPA에게 그 사실을 알려주기만 하면 된다.

 

'Spring > jpa' 카테고리의 다른 글

[JPA] 영속성 관리  (0) 2023.02.09
[JPA] 엔티티 매니저 팩토리, 엔티티 매니저, 트랜잭션  (0) 2023.02.09
[JPA] persistence.xml  (0) 2023.02.09
[JPA] 엔티티 설계 어노테이션  (0) 2023.02.08
[JPA] 초기 세팅  (0) 2023.02.08