ORM JPA1

유요한·2023년 12월 1일
0

JPA

목록 보기
1/10
post-thumbnail

해당 정리는 인프런의 김영한 강사님의 수업과 책에서 공부한것, 구글에서 공부한것을 정리한 것입니다.

ORM

  • Object-relational mapping(객체관계매핑)
  • 객체는 객체대로 설계
  • 관계형 데이터베이스는 관계형 데이터베이스대로 설계
  • ORM 프레임워크가 중간에서 매핑
  • 대중적인 언어에는 대부분 ORM 기술이 존재

JPA란?

JPA(Java Persistence API)은 자바 진영의 ORM 기술 표준입니다.

SQL을 반복적으로 사용하면 단순 반복 작업을 많이 해야하는데 그것 외에도 패러다임 불일치 문제가 있습니다. 관계형 데이터베이스는 어떻게 데이터를 저장할지에 초점이 맞춰진 기술입니다.

반대로 객체지향 프로그래밍 언어는 메시지를 기반으로 기능과 속성을 한 곳에서 관리하는 기술입니다.

관계형 데이터베이스와 객체지향 프로그래밍 언어의 패러다임이 서로 다른데, 객체를 데이터베이스에 저장하려고 하니 여러 문제가 발생합니다. 이를 패러다임 불일치라고 합니다.

JPA는 서로 지향하는 바가 다른 2개의 영역을 중간에서 패러다임 일치를 시켜주기 위한 기술입니다. 즉, 개발자는 객체지향적으로 프로그래밍을 하고, JPA가 이를 관계형 데이터베이스에 맞게 SQL을 대신 생성해서 실행합니다. 개발자는 항상 객체지향적으로 코드를 표현할 수 있으니 더는 SQL에 종속적인 개발을 하지 않아도 됩니다.

상품 데이터를 관리하는 Item 클래스가 있고, 상품 데이터를 관계형 데이터베이스에서 관리하기 위해서 SQL문을 사용합니다. SQL 중심 개발의 문제점은 개발자가 CRUD라고 불리는 Insert, Update, Select, Delete 문을 작성해서 객체를 관계형 데이터베이스에 넣어주고 가져오는 작업을 하는것입니다. 즉, 자바 객체를 SQL을 통해 데이터베이스에 관리하게 하고 데이터베이스에 저장된 데이터를 자바 애플리케이션에서 사용하려면 SQL을 통해 다시 자바 객체로 변환하는 반복적인 작업을 해야합니다. 이말은 개발자가 SQL을 매핑하는 역할을 반복해야 한다는 것입니다.

또한 객체와 관계형 데이터베이스의 패러다임의 불일치가 가장 큰 문제입니다. 자바는 객체 지향 패러다임으로 만들어졌고, 관계형 데이터베이스는 데이터를 정규화해서 잘 보관하는 것을 목표로 합니다. 객체를 데이터베이스에 넣기 위해서는 SQL문을 통해 변환해서 넣어야하고, 데이터베이스에서 가져오려면 복잡한 SQL문을 작성해야 합니다. 결국 객체를 단순히 데이터 전달 목적으로 사용할 뿐 객체지향적으로 프로그래밍을 할 수 없습니다. 이는 객체지향과 관계형 데이터베이스 간의 패러다임 불일치 때문입니다. 이를 위해서 나온 것이 ORM입니다.

객체는 객체지향적으로, 데이터베이스는 데이터베이스 대로 설계합니다. 그리고 ORM은 중간에서 2개를 매핑하는 역할을 합니다. 이를 통해 개발자는 소스를 더 객체지향적으로 설계하고 비즈니스 로직에 집중할 수 있습니다.

JPA는 ORM 기술의 표준 명세로 자바에서 제공하는 API입니다. 즉, JPA는 인터페이스고 이를 구현한 대표적인 예로 Hibernate, EclipseLink, DataNucleus, OpenJpa, TopLink 등이 있습니다.

JPA 동작 - 저장

JPA 동작 - 조회

JPA를 왜 사용해야 하는가?

  • SQL 중심적인 개발에서 객체 중심으로 개발
  • 생산성
  • 유지보수
  • 패러다임의 불일치 해결
  • 성능
  • 데이터 접근 추상화와 벤더 독립성
  • 표준

JPA 장점

1. 특정 데이터베이스에 종속되지 않음

애플리케이션 개발을 위해 데이터베이스로 오라클을 사용해서 개발을 했다고 가정해보겠습니다. 여기서 만약 MongoDB같은 걸로 변경한다면 데이터베이스마다 쿼리문이 다르기 때문에 전체를 일일이 수정해줘야 합니다. 왜냐하면 각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다르기 때문이다. 그렇기 때문에 처음 선택한 데이터베이스를 바꿔주는 것은 어렵습니다. 하지만 JPA는 추상화한 데이터 접근 계층을 제공합니다. 설정 파일에 어떤 데이터베이스를 사용하는지 알려주면 얼마든지 데이터베이스를 변경할 수 있습니다.

JPA는 특정 데이터베이스에 종속되지 않기 때문입니다.

2. 객체지향적인 프로그래밍

JPA를 사용하면 데이터베이스 설계 중심의 패러다임에서 객체지향적으로 설계가 가능합니다. 이를 통해 좀 더 직관적이고 비즈니스 로직에 집중할 수 있습니다.

3. 생산성 향상

데이터베이스 테이블에 새로운 컬럼이 추가되었을 경우, 해당 테이블의 컬럼을 사용하는 DTO 클래스의 필드도 모두 변경해야 합니다. JPA에서는 테이블과 매핑된 클래스에 필드만 추가한다면 쉽게 관리가 가능합니다. 또한 SQL문을 직접 작성하지 않고 객체를 사용하여 동작하기 때문에 유지보수 측면에서 좋고 재사용성도 증가합니다.

4. 지연 로딩과 즉시 로딩

  • 지연 로딩 : 객체가 실제 사용될 때 로딩
  • 즉시 로딩 : JOIN SQL로 한번에 연관된 객체까지 미리 조회

JPA는 이 두 개를 모두 지원하는데 이게 장점이 될 수 있는 이유는 상황에 따라 사용할 수 있기 때문입니다.

JPA 단점

1. 복잡한 쿼리 처리

통계 처리 같은 복잡한 쿼리를 사용할 경우는 SQL문을 사용하는게 나을 수 있습니다. JPA에서는 Native SQL을 통해 기존의 SQL문을 사용할 수 있지만 그러면 특정 데이터베이스에 종속된다는 단점이 생깁니다. 이를 보완하기 위해서 SQL과 유사한 기술인 JPQL을 지원합니다.

2. 성능 저하 위험

객체 간의 매핑 설계를 잘못했을 때 성능 저하가 발생할 수 있으며, 자동으로 생성되는 쿼리가 많기 때문에 개발자가 의도하지 않는 쿼리로 인해 성능이 저하되기도 합니다.

3. 학습 시간

JPA를 제대로 사용하려면 알아야 할 것이 많아서 학습하는데 시간이 오래 걸립니다.

JPA와 상속

저장

조회

profile
발전하기 위한 공부

0개의 댓글