Challenge, and Growth ! Introduce
                                                                                                             

Welcome to my blog 🙌🏻

Total

Today

Yesterday













Library/JPA

JPA란? (CRUD API, 상속)

뽀시라운 2024. 1. 14. 23:53
반응형
SMALL

[목차여기]

 

JPA란?

JPA는 Java Persistence API의 약자로, 자바의 ORM을 위한 표준 기술이다.

ORM은 자바의 객체와 관계형 데이터베이스를 매핑하는 것으로 SQL문을 일일이 작성하지 않고 객체로 구현할 수 있도록 하는 프레임 워크다.

JPA는 지루하고 반복적인 CRUD SQL을 알아서 처리해주고, 객체 모델링과 관계형 데이터베이스 사이의 차이점도 해결해주었다.

 

CRUD SQL이 뭐지?
Create, Read, Update, Delete 하는 쿼리문을 말한다.

 

 

CREATE SQL의 예

CREATE TABLE product {
	name varchar(20), // name의 칼럼명 + 최대 20자리 문자만 작성가능
	num number // num칼럼명 + 숫자만 기입가능
};

 

INSERT SQL의 예

INSERT INTO 테이블명 (칼럼,칼럼,칼럼) VALUES ('값1','값2','값3');

 

JPA를 사용함으로써 얻는 장점은 CRUD SQL을 작성할 필요가 없고, 조회된 결과를 객체로 매핑하는 작업도 대부분 자동으로 처리해주므로 데이터 저장 계층에 작성해야 할 코드가 1/3로 준다.
또한, 애플리케이션을 SQL이 아닌 객체 중심으로 개발하니 생산성과 유지보수가 확연히 좋아졌고 테스트를 작성하기도 편리해졌다. 이러한 이유로 버그도 많이 줄었다.

SQL을 직접 다룰 때 발생하는 문제점

회원(Member) 객체를 아래와 같이 만든다고 한다.

public class Member{
	private String memberId;
    private String name;

 

회원을 조회, 등록, 수정, 삭제하는 기능을 만들기 위해, SQL문을 작성하고 JDBC API를 사용하는 일을 반복해야 한다. 만약 회원 객체를 관리하는 MemberDAO를 완성하고 애플리케이션의 나머지 기능도 개발을 완료했다. 그런데 갑자기 회원의 연락처도 함께 저장해달라는 요구사항이 추가되었다. 그렇다면 코드를 일일히 수정해야 할 것이고 앞으로도 요구사항이 있을때마다 수정해야할 것이다.

JPA를 사용하면 객체를 데이터베이스에 저장하고 관리할 때, 개발자가 직접 SQL을 작성하는 것이 아니라 JPA가 제공하는 API를 사용하면 된다. 그러면 JPA가 개발자 대신에 적절한 SQL을 생성해서 데이터 베이스에 전달한다.

JPA가 제공하는 대표적인 CRUD API

1. 저장기능

jpa.persist(member); // 저장

 

2. 조회기능

String memberId = "helloId";
Member member = jpa.find(Member.class, memberId); // 조회

 

3. 수정기능

Member member = jpa.find(Member.class, memberId);
member.setName("sumin"); // 수정

 참고 : JPA는 객체를 조회해서 값을 변경만 하면 트랜잭션을 커밋할 때 데이터베이스에 적절한 UPDATE SQL이 전달된다.

 

4. 연관된 객체 조회

Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam(); // 연관된 객체 조회

JPA와 상속

객체와 테이블의 차이(패러다임 불일치)

객체는 상속이라는 기능을 가지고 있지만 테이블은 상속이라는 기능이 없다.

그나마 데이터베이스 모델링에서 이야기하는 슈퍼타입 서브타입 관계를 사용하면 객체 상속과 가장 유사한 형태로 테이블을 설계할 수 있다.

객체 모델 코드를 아래와 같이 만든다.

abstract class Item{
	Long id;
    String name;
    int price;
}
class Album extend Item{
	String artist;
}
class Movie extends Item{
	String director;
    String actor;
}
class Book extends Item{
	String author;
    String isbn;
}

 

Album 객체를 저장하려면 이 객체를 분해해서 다음 두 SQL을 만들어야 한다. 작성해야 할 코드량이 늘어나고 자식 타입에 따라서 DTYPE도 저장해야 한다. Movie와 Book도 마찬가지다. 조회하는 것도 쉽지 않다. 예를 들어 Album을 조회한다면 ITEM과 ALBUM 테이블을 join해서 그 결과로 Album 객체를 생성해야 한다. 이런 과정이 모두 패러다임의 불일치를 해결하려고 소모하는 비용이다.

INSERT INTO ITEM ...
INSERT INTO ALBUM ...

 

따라서, JPA는 상속과 관련된 패러다임의 불일치 문제를 개발자 대신 해결해준다.

 

1. JPA를 사용해서 Item을 상속한 Album 객체를 저장

jpa.persist(album)

 

2. JPA는 다음 SQL을 실행해서 객체를 ITEM, ALBUM 두 테이블에 나누어 저장한다.

INSERT INTO ITEM ...
INSERT INTO ALBUM ...

 

3. Album 객체를 조회한다.

String albumId = "id100";
Album album = jpa.find(Album.class, albumId);

 

4. JPA는 ITEM과 ALBUM 두 테이블을 join해서 필요한 데이터를 조회하고 그 결과를 반환한다.

SELECT I.*, A.*
FROM ITEM I JOIN ALBUM A ON I.ITEM_ID = A.ITEM_ID

 

Reference

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

 
반응형
LIST

'Library > JPA' 카테고리의 다른 글

JPA 영속성 컨텍스트란? - 생명주기  (2) 2024.11.12
loading