hyo_jung
[JPA] JPA 프로그래밍 기본기 다지기 1강 - JPA 소개 본문
JPA 소개
어플리케이션을 객체 지향 언어로 개발함 (Java, Scala....등)
데이터베이스 - 대부분 관계형 DB (Oracle, MySQL...)
지금 시대는 객체를 관계형 DB에 관리
관계형 DB는 SQL을 짜야 한다.
1. SQL 중심적인 개발의 문제점
- 무한 반복, 지루한 코드
- 객체 CRUD - 필드 추가 (모든 쿼리 다 수정해야 함)
- 엔티티 신뢰 문제 - memberDAO에서 memeber객체 가져오고 member.getTeam(); -> memberDAO안을 봐야 함
- 진정한 의미의 계층 분할이 어렵다.
- SQL에 의존적인 개발을 피하기 어렵다.
2. 패러다임의 불일치 : 객체 vs 관계형 데이터베이스
- 관계형 데이터베이스 - 데이터를 어떻게 잘 정규화해서 저장할까에만 집중
- 객체 - 어떻게 잘 추상화해서 관리를 잘할까에 집중
- 객체 지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공
- 객체를 관계형 데이터베이스에 저장 - 객체를 SQL로 바꿔야 함 (개발자가 하나하나)
- 개발자가 SQL 매퍼일을 많이 하게 됨
객체와 관계형 데이터베이스의 차이
1. 상속
- 객체 상속 관계 / Table 슈퍼타입 서브타입 관계 (판매하는 item : album, movie, book)
- 앨범 저장 - 객체 분해 -> DB에 저장할 때 insert into item -> insert into album
- 앨범 조회 - 아이템과 앨범 조인해서 가져옴 -> movie, book 가져올 땐 쿼리를 새로 짜야 함, 각각의 객체 생성 -> DB에 저장할 객체에는 상속 관계를 안씀, super itemDTO를 만듦
- 자바 컬렉션에 저장
List<Item> list = new ArrayList<>();
list.add(album);
- 자바 컬렉션에서 조회 - 부모 타입으로 조회 후 다형성 활용
Album album = list.get(albumId);
Item item = list.get(albumId);
2. 연관관계
- 객체는 참조를 사용: member.getTeam()
- 테이블은 외래 키를 사용: JOIN ON M.TEAM_ID = T.TEAM_ID
- 객체 - Member.getTeam()에서 Team으로 갈 수 있음, Team조회하고 Member로 갈 수 없음. (방향성O)
- 테이블 - Member조회하고 Team으로 갈 수 있음, Team조회하고 Member로 갈 수 있음. (방향성X)
3. 데이터 타입
- 객체를 테이블에 맞추어 모델링 - 객체지향적이지 않음
- insert into MEMBER(MEMBER_ID, TEAM_ID, USERNAME) values ... 로 쉽게 쿼리 짤 수 있음
class Member {
String id;
Long teamId;
String username;
}
class Team {
Long id;
String name;
}
- 객체다운 모델링
- member.getTeam().getId();로 insert
class Member {
String id;
Team team;
String username;
Team getTeam() {
return team;
}
}
class Team {
Long id;
String name;
}
- 객체 모델링 조회 - 코드가 길어지게 됨.
SELECT M.*, T.*;
FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID
public Member find(String memberId) {
//SQL 실행 ...
Member member = new Member(); //데이터베이스에서 조회한 회원 관련 정보를 모두 입력
Team team = new Team(); //데이터베이스에서 조회한 팀 관련 정보를 모두 입력
//회원과 팀 관계 설정
member.setTeam(team);
return member;
}
- 객체 모델링, 자바 컬렉션에 관리
list.add(member);
Member member = list.get(memberId);
Team team = member.getTeam();
- 객체 그래프 탐색 - 객체는 자유롭게 객체 그래프를 탐색할 수 있어야 한다.
- 그런데 이렇게 못함. 처음 실행하는 SQL에 따라 탐색 범위 결정 - 쿼리에서 데이터 세팅을 안해놓으면 null이 들어감
- 쿼리에서 데이터 세팅 해놓았는지 확인하려면 DAO계층을 확인해야 함
- 내가 DAO짜놓지 않음 - member.getTeam() 해야하는 지 아닌지 모름
- 상황에 따라 동일한 회원 조회 메서드를 여러벌 생성하면 됨 - 너무 많은 경우의 수
memberDAO.getMember(); //member만 조회
memberDAO.getMemberWithTeam(); //member와 team조회
memberDAO.getMemberWithOrderWithDelivery(); //member, order, delivery
4. 데이터 식별 방법
String memberId = "100";
Member member1 = memberDAO.getMember(memberId);
Member member2 = memberDAO.getMember(memberId);
member == member2; //다르다. 다른 인스턴스이기 때문
class MemberDAO {
public Member getMember(String memberId) {
String sql = "SELECT * FROM MEMBER WHERE MEMBER_ID = ?";
...
//JDBC API, SQL 실행
return new Member(...);
}
}
- 자바 컬렉션에서 조회
String memberId = "100";
Member member1 = list.get(memberId);
Member member2 = list.get(memberId);
member1 == member2; //같다.
- 객체답게 모델링 할수록 매핑 작업만 늘어난다.
- 객체를 자바 컬렉션에 저장하듯 DB에 저장할 수는 없을까?
JPA - Java Persistence API
JPA?
- 자바 진영의 ORM 기술 표준
ORM
- Object-relational mapping (객체 관계 매핑)
- 객체는 객체대로 설계
- 관계형 데이터베이스는 관계형 데이터베이스대로 설계
- ORM 프레임워크가 중간에서 매핑
- 대중적인 언어에는 대부분 ORM 기술이 존재
JPA는 어플리케이션과 JDBC 사이에서 동작
- 패러다임 불일치 해결
JPA를 왜 사용해야 하는가?
- SQL 중심적인 개발에서 객체 중심으로 개발
- 생산성
- 저장 : jpa.persist(member)
- 조회 : Member member = jpa.find(memberId)
- 수정 : member.setName("변경할 이름")
- 삭제 : jpa.remove(member)
- 유지보수
- 기존 : 필드 변경시 모든 SQL 수정해야 함
- JPA : 필드만 추가하면 됨, SQL은 JPA가 처리
- 패러다임의 불일치 해결
- 상속
- 연관관계 저장 - member 가져오고 바로 team 가져올 수 있음.
- 객체 그래프 탐색 - 자유로운 객체 그래프 탐색
- 신뢰할 수 있는 엔티티 계층
- 비교하기 - 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장함 (마치 자바 컬렉션)
- 성능
- 1차 캐시와 동일성 보장 - 같은 트랜잭션에서 조회한 엔티티는 같음
- -> 두 번 조회하면 두번째는 1차 캐시에서 가져옴. SQL 1번만 실행 (성능향상)
- 트랜잭션을 지원하는 쓰기 지연 - INSERT
- 트랜잭션 커밋할 때까지 INSERT SQL들을 모음
- JDBC BATCH SQL 기능을 사용해서 한 번에 SQL 전송
- 지연 로딩
- 지연 로딩 : 객체가 실제 사용될 때 로딩
- 즉시 로딩 : JOIN SQL로 한 번에 연관된 객체까지 미리 조회 (즉시 로딩으로도 바꿀 수 있음)
- 1차 캐시와 동일성 보장 - 같은 트랜잭션에서 조회한 엔티티는 같음
- 데이터 접근 추상화와 벤더 독립성
- 표준
ORM은 객체와 RDB 두 기둥 위에 있는 기술
출처 : [토크ON세미나] JPA 프로그래밍 기본기 다지기 1강 - JPA 소개 https://www.youtube.com/watch?v=WfrSN9Z7MiA
'개발 > Backend' 카테고리의 다른 글
| [JPA] Spring Data JPA (0) | 2022.01.22 |
|---|---|
| [Work Book] UMC 서버 8주차 (0) | 2021.11.28 |
| [Work Book] UMC 서버 7주차 (0) | 2021.11.28 |
| [Work Book] UMC 서버 6주차 (0) | 2021.11.28 |
| [Work Book] UMC 서버 5주차 (0) | 2021.11.07 |