2022. 11. 6. 13:22ㆍ자바 & Spring
이번 포스팅에서는 JPA의 정의에 대해 알아보자.
JPA의 필요성에 대한 내용은 다음 포스팅을 참고하길 바랍니다.
https://matt1235.tistory.com/62
JPA(Java Persistence API) 란?
- 자바 진영의 ORM 기술 표준으로, 어플리케이션과 JDBC 사이에서 동작한다.
- 자바 ORM 기술에 대한 API 표준 명세이다.
JPA 는 인터페이스의 집합이기 때문에, 사용하려면 JPA를 구현한 ORM 프레임워크를 선책해야 한다.
현재 자바 진영에서는 Hibernate 프레임워크가 가장 많이 사용된다.
ORM
ㅇ Object-relational mapping의 줄임말.(객체 관리 매핑)
객체는 객체대로 설계하고, 관계형 데이터베이스는 그것대로 설계하면 된다.
ORM 프레임워크가 중간에서 객체와 테이블을 매핑해준다.
ORM 프레임워크는 단순히 SQL을 생성해주는 것뿐만이 아니라, 객체와 관계형 DB 테이블 간의 패러다임 불일치 문제도 해결해준다.
이렇게 되면 객체 측면에서는 데이터베이스 테이블 구조에 신경쓰지 않고 정교한 객체 모델링이 가능하고,
관계형 데이터베이스에서는 그에 맞게 모델링을 하면 된다.
- 자바의 JPA 뿐만이 아니라, 성숙한 언어는 대부분 언어만의 고유 ORM 기술이 존재한다.
패러다임 불일치 문제
- 지속 가능한 어플리케이션을 개발하는 것은 끊임없이 증가하는 복잡성과의 싸움이다.
- 복잡성을 제어하는 것이 유지보수 성능과 직결된다.
- 현대의 복잡한 어플리케이션은 대부분 객체지향 언어로 개발된다.
객체지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 복잡성을 제어할 수 있는 다양한 기법이 마련되어 있다.
따라서 현재의 대부분의 어플리케이션 개발은 객체 지향적인 방법으로 개발된다.
관계형 데이터베이스와 객체는 둘의 구조와 기능이 다르다. 따라서 객체 구조를 테이블에 구조에 저장하는데 한계가 발생하게 되는데, 이를 패러다임 불일치 문제라고 한다.
패러다임의 불일치에는 어떤 것들이 있는지 알아보고, JPA는 이를 어떻게 해결해주는지 알아보자.
1. 상속 문제
객체는 상속을 지원하지만, 테이블에는 상속이라는 개념이 없다.
[객체 상속 관계]
Vehicle 객체를 상속한 Car, Bike 객체다.
둘 다 부모 객체의 필드(Id, Vtype)를 공통적으로 가지고 있고, 추가적으로 자신만이 가지는 필드가 있다.
[테이블 - 슈퍼타입, 서브타입 관계]
테이블에는 상속이라는 개념이 없어 슈퍼타입, 서브타입 관계로 상속을 나타낸다.
부모 테이블인 VEHICLE의 주요키를 CAR, BIKE 테이블이 주요키, 외래키로 갖는다.
다음 로직을 JPA 를 사용하지 않고, JDBC API를 사용해 처리한다고 하자.
JDBC를 사용할 때
새로운 Car 객체를 데이터베이스에 저장할 때
- VEHICLE, CAR 테이블에 각각 INSERT 문을 통해 삽입
- 개발자가 직접 2개의 INSERT SQL을 작성해주어야 한다.
Car 객체를 조회할 때
- VEHICLE, CAR 테이블을 조인해서 조회한 다음 그 결과로 CAR 객체를 생성해야 한다.
이처럼 객체와 테이블의 구조는 다르기 때문에 개발자가 중간에서 소모하는 비용이 너무 크다. (패러다임의 불일치 문제)
어플리케이션이 커질수록 개발자가 패러다임의 불일치 문제를 직접 조율하는 것은 불가능하다.
위와 같은 문제를 JPA 가 해결해준다.
JPA를 사용할 때
- CAR 객체의 저장과 조회를 JPA를 사용해 처리한다고 하자.
- 자바 컬렉션에 객체를 저장하듯이 JPA에 객체를 저장하면 된다.
Car 객체 저장
jpa.persist(car);
- JPA 가 알아서 두 개의 테이블(VEHICLE, ALBUM)에 INSERT SQL을 보내준다.
- 개발자가 일일이 SQL문을 작성할 필요가 없다.
Car 객체 조회
jpa.find(Car.class, carId);
- 객체의 id값으로 조회할 수 있다.
- JPA가 알아서 ITEM, ALBUM 테이블을 조인하고 필요한 데이터를 조회해 그 결과를 반환해준다.
이처럼 JPA가 객체와 데이터 테이블의 패러다임 불일치 문제를 해결해준다.
개발자는 객체 지향 프로그래밍을 하듯이 구현을 하면 되고, 로직에만 집중하면 된다.
2. 연관관계 문제
이번에 살펴볼 것은 연관관계 사이의 패러다임 불일치 문제이다.
객체는 참조를 통해 연관된 객체를 조회하지만, 테이블은 외래키를 통해 다른 테이블과 조인하여 연관된 테이블을 조회한다.
[객체 연관관계]
- 객체는 참조를 사용 : member.getTeam()
- team 필드로 다른 객체를 참조한다.
- 반대로 Team 객체에서 Member객체를 참조할 수는 없다.
[테이블 연관관계]
- 테이블은 외래키를 사용: JOIN ON M.TEAM_ID = T.TEAM_ID
- 테이블은 참조라는 개념이 없어 외래키로 테이블을 조인한 뒤에 정보를 가져온다.
객체를 테이블에 맞게 모델링하는 것은 객체 지향의 장점을 버리는 일이기 때문에, 옳지 않다.
따라서 개발자의 관점에서는 객체지향 모델링을 해야 한다. 객체 끼리 참조로 연관 관계를 맺도록 설계한다.
JPA를 사용해 객체에서 연관관계 매핑을 통해 이 문제를 해결할 수 있다.
'자바 & Spring' 카테고리의 다른 글
웹 서버 & WAS (0) | 2024.01.30 |
---|---|
JDBC(Java Database Connectivity) (0) | 2022.11.02 |
빈 생명주기 콜백 (0) | 2022.10.26 |
컴포넌트 스캔, 의존관계 자동 주입 (2) | 2022.09.25 |
싱글톤(singleton) 패턴 (0) | 2022.09.24 |