능글맞은 구렁이
Spring-JPA(개념) 본문
JPA가 탄생한 이유
- 기존 SQL의 문제
무한 반복의 CRUD코드, 지루한 코드 (INSERT INTO,,, UPDATE,,)이다.
하지만 SQL에 의존적인 개발을 피하기는 어렵기 때문에 SQL을 계속 사용해야 하는것이다.
- 객체 vs 관계형 데이터베이스의 패러다임의 불일치
1. 상속 : 객체는 상속O BUT 데이터베이스는 상속X 대신 비슷한 JOIN이 있음
2. 연관관계 : 객체는 참조를 사용(예 : member.getTeam()) ,
테이블은 외래키를 사용(JOIN ON M.TEAM_ID=T.TEAM_ID)
객체다운 모델링
class Member {
String id;
Team team;
String username;
Team getTeam(){
return team;
}
}
class team{
Long id;
String name;
}
---------------------------------------------------------------
객체 모델링 저장
class Member{
String id;
Team team; //member.getTaem().getId();를 작성해야 Insert into가 된다.
String username;
}
INSERT INTO MEMBER(MEMBER_ID, TEAM_ID, USERNAME) VALUES....
-----------------------------------------------------------------
객체 모델링을 조회하려면?
SELECT M.*, T.* FROM MEMBER M JOIN TEAM T ON M.TEAM_ID =T.TEAM_ID
public Member find(String memberid){
Member member=new Member();
Team team= new team();
member.setTeam(team);
return member;
}
이처럼 연관관계를 저장하고 조회할때 패러다임의 불일치 때문에 개발자가 SQL을 한땀한땀 작성해야한다
또한, 실제로 엄청난 데이터가 있다고 생각해보자 객체는 자유롭게 객체 그래프를 탐색할 수 있어야 하는데
처음 실행하는 SQL에 따라 탐색 범위 결정되고 그럼 또 SQL문을 수정하고 너무너무 힘든 작업이 될 것이다.
JPA의 동작
JDBC
JPA
- 기본동작
- 저장
개발자 | MemberDAO에서 객체를 저장하고 싶을 때 개발자는 JPA에 Member 객체를 넘긴다. |
JPA | 1. Member 엔티티를 분석한다. 2. INSERT SQL을 생성한다. 3. JDBC API를 사용하여 SQL을 DB에 날린다. |
- 조회
개발자 | member의 pk 값을 JPA에 넘긴다. |
JPA | 1.엔티티의 매핑 정보를 바탕으로 적절한 SELECT SQL을 생성한다. 2. JDBC API를 사용하여 SQL을 DB에 날린다. 3. DB로부터 결과를 받아온다. 4. 결과(ResultSet)를 객체에 모두 매핑한다. 쿼리를 JPA가 만들어 주기 때문에 Object와 RDB 간의 패러다임 불일치를 해결할 수 있다. |
그래서 JPA가 뭔데!!
JPA의 정의
- JPA: Java Persistence API
- 자바 진영의 ORM기술 표준
- 자바 플랫폼 SE와 자바 플랫폼 EE를 사용하는 응용프로그램에서 관계형 데이터베이스의 관리를 표현하는 자바 API이다.
ORM이란?? * ORM은 (Object-Relation Mapping/객체-관계 매핑) * 객체는 객체대로 설계 * 관계형 데이터베이스는 관계형 데이터베이스대로 설계 * ORM 프레임워크가 중간에서 매핑을 해준다. * 대중적인 언어에는 대부분 ORM기술이 존재 |
JPA 발전 단계 (탄생과정?)
EJB:Enterprise Java Beans- 엔티티빈(자바 표준) |
→ → → |
하이버네이트(오픈소스) | → → → |
JPA(자바표준) |
너무너무 어려워서 개발자들이 엄청 힘들했다. |
EJB 너무 어려워 내가 쉽게 만들어보겠어! 하고 개빈 킹과 동료들이 하이버네이트를 만들게됨. | 하이버네이트의 등장에 반성한 자바는 하이버네이트의 개발진을 데려다 거의 똑같은 ORM을 새로 만들었는데 그것이 바로 JPA이다 |
JPA 특징
- 데이터를 객체지향적으로 관리할 수 있기 때문에 개발자는 비즈니스 로직에 집중할 수 있고 객체지향 개발이 가능하다.
- 자바 객체와 DB 테이블 사이의 매핑 설정을 통해 SQL을 생성한다.
- 객체를 통해 쿼리를 작성할 수 있는 JPQL(Java Persistence Query Language)를 지원
- JPA는 성능 향상을 위해 지연 로딩이나 즉시 로딩과 같은 몇가지 기법을 제공하는데 이것을 잘 활용하면 SQL을 직접 사용하는 것과 유사한 성능을 얻을 수 있다.
- JPA는 인터페이스의 모음이다. (그중 하이버네이트가 가장 대중적이고 가장많이 사용되고있다.)
JPA를 왜 사용하는가?
1. SQL 중심적인 개발에서 객체 중심으로 개발
2. 생산성 - 마치 자바 컬렉션에서 데이터를 저장, 조회, 수정, 삭제 하는거 처럼 간단한 CRUD가 가능하다
예 ) 저장 :jpa.persist(member) 조회:Member member=jpa.find(memberId)
수정:member.setName("변경할 이름") 삭제:jpa.remove(member)
3. 유지보수 - 기존 : 필드 변경시 모든 SQL을 수정해주어야 한다.
JPA : 쿼리를 개발자가 작성하는게 아니므로 컬럼을 추가만 해주면 유지보수가 확실히 좋아진다.
4. 패러다임의 불일치해결
1) JPA와 상속 :
저장 : 개발자가 할일 - jap.persist(album); JPA가 할일 - 나머지 쿼리문
조회 : 개발자가 할일 -Album album=jpa.find(Album.class, albumId); JPA가 할일 - 나머지 쿼리문(JOIN문)
2) JPA와 연관관계 :
연관관계 저장 member.setTeam(team);
jpa.persist(member);
3) JPA와 객체 그래프 탐색
객체 그래프 탐색 Member member=jpa.find(Member.class, memberId);
Team team=member.getTeam();
5. 성능 최적화 기능
1) 1차 캐시와 동일성 보장
2) 같은 트랙잭션 안에서는 같은 엔티티를 반환 - 약간의 조회 성능 향상 (크게 도움 x)
String memberId = "100";
Member m1 = jpa.find(Member.class, memberId); // SQL
Member m2 = jpa.find(Member.class, memberId); // 캐시 (SQL 1번만 실행, m1을 가져옴)
println(m1 == m2) // true
3) 트랜잭션을 지원하는 쓰기 지연 - 버퍼링 가능
1. 트랙잭션을 커밋할 때까지 Inser SQL을 모음
(이렇게 하지 않으면 DB에 Insert Query를 날리기 위한 네트워크를 3번 타게 된다. )
2. JDBC BATCH SQL 기능을 사용해서 한번에 SQL전송
transaction.begin(); // [트랜잭션] 시작
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
// -- 여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
// 커밋하는 순간 데이터베이스에 INSERT SQL을 모아서 보낸다. --
/** 2. JDBC BATCH SQL 기능을 사용해서 한번에 SQL 전송 */
transaction.commit(); // [트랜잭션] 커밋
4)지연 로딩과 즉시 로딩
1. 지연로딩 (Lazy Loading) : 객체가 실제 사용될 때 로딩
2. 즉시 로딩 : JOIN SQL로 한번에 연관된 객체까지 미리 조회
'Framework > Spring' 카테고리의 다른 글
spring-JPA (0) | 2021.07.05 |
---|---|
Spring-JPA(환경설정) (0) | 2021.07.05 |
Lombok (0) | 2021.07.01 |
Spring - mybatis(Mapper XML) (0) | 2021.06.29 |
Spring-Mybatis (0) | 2021.06.29 |