JPA - Java Persistence API

상윤·2024년 5월 8일
0

BackEnd

목록 보기
4/11

JPA란?


JPA(Java Persistence API)는 자바 진영에서 ORM(object-Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다. 그 말은 즉, 실제적으로 구현되는 것이 아닌 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크이다. JPA 를 구현한 대표 오픈소스로 Hibernate가 있다.

ORM -(Object-Relational Mapping)

Class와 RDB(Relational DataBase)의 테이블을 매핑한다는 뜻이며, 기술적으로 어플리케이션의 객체를 RDB테이블에 자동으로 영속화 해주는 것.

장점
-SQL문을 사용하지 않고 Method를 통해 DB를 조작할 수 있어, 개발자는 객체 모델을 이요한 비지니스 로직 구성에만 집중 가능.
(내부적으로 쿼리를 생성하여 DB를 조작)

-Query와 같이 필요한 선언문, 할당 등의 부수적인 코드를 줄이고, 각종 객체에 대한 코드를 별도로 작성하여 가독성을 높임

-객체지향적인 코드 작성이 가능. 객체지향적인 접근만 고려하면 되어 생상성 증가

-매핑하는 정보가 Class로 명시되어 있어 ERD의 의존성을 낮출 수 있고, 유지보수 및 리팩토링에 유리하다.

-디비 변경 시에도 ORM을 사용한 쿼리는 수정할 필요가 없음

단점
-프로젝트의 규모가 크고 복잡하여 설계가 잘못된 경우, 속도 저하 및 일관성을 무너뜨리는 문제점이 생길 수 있음
-복잡하고 무거운 Query는 속도를 위해 별도의 튜닝 필요(SQL문 작성 필요)
-러닝커브가 높음

JPA를 사용하는 이유

java 진영에서 ORM 기술 표준으로 사용하는 인터페이스 모음
자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
Hibernate, Open JPA 등이 JPA를 구현함

JPA는 반복적인 CRUD SQL을 처리해준다. JPA 는 매핑된 관계를 이용해서 SQL을 생성하고 실행하는데, 개발자는 어떤 SQL이 실행될지 생각만 하면되고, 예측도 쉽게 할 수 있다. 추가적으로 JPA 는 네이티브 SQL이란 기능을 제공하여 관계 매핑이 어렵거나 성능 이슈가 우려되는 SQL문은 직접 작성하여 사용할 수 있다.

JPA 를 사용하는 가장 큰 이유는 SQL이 아닌 객체 중심으로 개발할 수 있다는 것이다. 이는 자연스레 생산성과 유지보수도 수월해진다. 떠힌 JPA는 패러다임의 불일치도 해결하였다. 예시로 JAVA에서 부모 클래스와 자식 클래스의 관계(상속 관계)가 존재하지만 DB에는 이러한 상속관계를 지원하지 않는다(상속을 지원하는 디비는 있지만 객체의 상속과는 다름).

JPA 에선 위와 같이 문제를 해결하였다.

위의 구조에서 Album class 저장 시

jpa.persist(album); //Album 객체저장

JPA는 위의 코드를 아래의 쿼리로 변환하여 실행한다.

INSERT INTO ITEM (ID,NAME,PRICE) VALUES ....
INSERT INTO ALBUM (ARTST) ...

이 후 조회시 두테이블을 엮어서 갖고온다.

//java code
Album album = findByAlbumID(Long albumId);

//변화된 쿼리
SELECT I.*, A.*
	FROM ITEM I
    JOIN ALBUM A ON I.ITEM_ID = A.ITEM_ID;

위와 같이 상속관계에 대한 접근도 제공해주는데 객체지향에는 연관관계라는 것도 있다. 코드로 따지자면 Class에서 또다른 Class Type을 변수로 갖고 있는 것이다.

Member class 가 Team type의 team 필드 변수를 갖고 있는 형태로 아래의 예시와 같다.

class Member{
	Long id;
    Team team
    String username;
}
class Team{
	Long id;
    String name;
}

Team 객체를 참조하는 필드를 갖고 있는 Member 객체 저장 시 상속구조와 같이 저장된다.

Team team = Team.createTeam("backEnd_team);
//Member Entity에 객체를 return 하는 method createMember가 있는 상황
Member member = Member.createMember(100,"jsy",team);

jpa.persist(member);

//query로 변환된 문구
INSERT INTO MEMBER (ID, TEAM_ID, USERNAME) ....
INSERT INTO TEAM (ID, NAME) ....

이렇게 저장 후엔 Member 객체 조회시 Team 객체의 정보도 갖고와 Member 객체의 team 필드에 주입해주기 때문에 사용할 수 있다

Member member = jpa.find(Member.class, memberId);
Team team = member.getTEam();

//변화된 query
SELECT M.*, T.*
	FROM MEMBER M 
    JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID;

저장

조회

JPA 내에서 수정 메소드를 제공하지 않지만, 객체 데이터 수정 시 매팽된 테이블 데이터를 조회하고 비교하여 변경을 감지하고 내부적으로 UPDATE를 실행한다.

0개의 댓글