1. JPA란 ?
1) JPA(Java Persistence API)
- JPA는 Java 진여에서 ORM(Object-Relational Mapping) 기술을 표준으로 사용하는 인터페이스의 모음
- 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
- 인터페이스이기 때문에 JPA를 Hibernate, OpenJPA 등이 구현
ORM (Object Relational Mapping)
1. 객체와 관계형 데이터베이스를 매핑하는 것을 의미한다.
2. ORM 프레임워크 객체와 테이블을 매핑하여 패러다음의 불일치 문제를 해결해준다.
2) JPA의 등장 이유
1) JPA는 반복적인 CRUD SQL을 처리해준다. JPA는 매핑된 관계로 SQL를 생성하고 실행하는데 개발자는 어떤 SQL이 실행될지만을 생각하면 되고 예측도 쉽게 할 수 있다.
2) JPA를 사용하면 SQL이 아닌 객체 중심으로 개발을 할 수 있기 때문에 생산성이 좋아지고 유지보수성이 뛰어나다.
3) JPA는 패러다임의 불일치 문제도 해결 가능하다.
- 예를 들어 부모클래스와 자식 클래스의 관계인 상속관계가 있을 때 데이터베이스의 이러한 관계를 지원하지 않지만 JPA를 이용한다면 쉽게 접근할 수 있다.
위의 구조에서 만약 Album 클래스를 저장할 때는 다음과 같다.
jpa.persist(album);
그러나 JPA는 위의 코드를 아래의 쿼리로 변환하여 실행한다.
INSERT INTO ITEM(ID, NAME, PRICE) ...
INSERT INTO ALBUM (ARTIST) ....
위의 구조에서 저장한 뒤 조회할 때도 두 테이블을 엮어서 가져온다.
String albumId = "id100";
Album album = jpa.find(Album.class, albumId);
// 변환된 쿼리 형태
SELECT I.*, A.* FROM ITEM I
JOIN ALBUM A ON I.ITEM_ID = A.ITEM_ID;
4) JPA는 연관관계에 대한 접근도 제공해 준다.
- 객체지향에서는 연관관계라는 것도 있다. 코드로 보면 Class에서 또 다른 Class Type을 필드 변수로 가지고 있다는 의미이다.
- 위의 그림은 Member 클래스가 Team 타입의 team 필드 변수를 가지고 있는 형태인데 코드로 나타내면 아래와 같다.
class Memeber {
String id;
TEAM team;
String username;
}
class Team {
Long id;
String name;
}
=> Team 객체를 참조하는 필드를 가지고 있는 Member 객체는 위에 있는 상속 구조와 비슷하게 저장되어 있다.
Member member = new Member();
member.setId("100");
member.setUsername("ellen");
Team team = new Team();
team.setName("ABC");
member.setTeam(team);
jpa.persist(member);
/**
위의 Membmer 객체의 team 필드를 Team 객체로 set하며 Member 객체를 DB에 저장하면
jPA는 아래와 같은 SQL문을 실행하게 된다.
INSERT INTO MEMBER(ID, TEAM_ID, USERNAME) ...
INSERT INTO TEAM(ID, NAME) ...
**/
=> 위의 저장 후 Member 객체만 조회하면 Team 객체 정보도 같이 가져와 Member 객체의 team 필드에 주입해주기 때문에 아래와 같이 활용할 수 있다.
Member member = jap.find(Member.class, memberId);
Team team = member.getTeam();
/**
JPA에 의해 변환된 SQL문
SELECT M.*, T.*
FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID;
**/
2. JPA의 저장 및 조회 기능 동작
1) 저장
2) 저장
**
인프런 김영한님의 "자바 ORM 표준 JPA 프로그래밍" 강의를 보고 공부하면서
정리한 내용입니다.
혹시 문제가 있으시다면 당장 삭제하겠습니다.
'프로그래밍공부 > JPA' 카테고리의 다른 글
JPA의 엔티티 매핑 (0) | 2022.07.31 |
---|---|
JPA의 영속성 관리 (0) | 2022.07.20 |
JPA 시작 (0) | 2022.07.20 |