SQL 중심적인 개발의 문제점
1. 무한반복, 지루한 코드
- CRUD
- UPDATE…
- SELECT…
2. 패러다임의 불일치
객체 VS 관계형 DB
객체 → SQL변환 → SQL → RDB
- 개발자 = SQL 매퍼
객체와 RDB의 차이
- 상속
- 연관관계
- 데이터 타입
- 데이터 식별 방법
3. 객체를 테이블에 맞추어 모델링
class Member {
String id;
Long teamId; // team이 아닌 team_id 사용
String username;
}
class Team {
Lond id;
String name;
}
4. 엔티티 신뢰 문제
Class MemberService {
public void process() {
Member member = memberDao.find(memberId);
member.getTeam(); // ???
member.getOrder().getDelivery(); // ???
}
}
- 반환된 member를 신뢰할 수 없음
- 내부를 직접 봐야 암
5. 값의 비교 (컬렉션과 SQL)
- 컬렉션 : List
- SQL : “SELECT * FROM MEMBER WHERE MEMBER_ID = ?”
// 컬렉션 member1 == member2 같다.
Member member1 = list.get(100);
Member member2 = list.get(100);
// SQL : member1 == member2 다르다.
Member member1 = memberDao.getMember(100);
Member member2 = memberDao.getMember(100);
결론
객체답게 모델링 할 수록 매핑이 늘어난다.
객체를 자바 컬렉션에 저장하듯이! -? JPA
JPA 소개
JPA
- Java Persistence API
- 자바 진영의 ORM 기술 표준
- ORM?
- Object-relational mapping(객체 관계 매핑)
- 객체는 객체대로 설계
- RDB는 RDB대로 설계
- ORM 프레임워크가 중간에서 매핑
- 대중적인 언어 대부분에는 ORM 기술이 존재
JPA의 동작
JAVA - JPA - JDBC API - DB
JPA의 동작
- SQL 생성
- JDBC API 사용
- ResultSet 매핑
- 패러다임 불일치 해결
JPA가 만들어진 과정
- EJB : 엔티티 빈(자바표준)
- 성능 느림
- 하이버네이트 (오픈소스)
- JPA (자바 표준)
- 하이버네이트와 비슷
- 용어정리됨
JPA를 왜 사용해야 하는가?
- 생산성 : 자바 컬렉션을 사용하는 것 같다. + 만들어져 있다.
- 저장 : persist
- 조회 : find
- 수정 : setName
- 삭제 : remove
- 유지보수
- 필드의 추가 삭제가 훨신 간편하다.
- JPA와 패러다임 불일치 해결
- 상속
- 연관관계
- persist(albam)만 해주었을 뿐인데 Insert 쿼리가 두개가 나간다!
- 신뢰할 수 있는 엔티티
- 지연로딩 : 해당 SQL을 사용하는 시점에 값을 가져옴
- 자유롭게 탐색
- JPA와 비교하기
- 동일한 트랜잭션에서 조회한 엔티티는 같음
- member1 == member2
- JPA의 성능 최적화 기능
- 1차 캐시와 동일성 보장
- SQL 1번만 실행
- 트랜잭션을 지원하는 쓰기 지연
- transaction.begin(); // 트랜잭션 시작 em.persist(memberA); em.persist(memberB); em.persist(memberC); // 여기까지 insert 쿼리를 보내지 않음 transaction.commit(); // 커밋하는 순간 모아서 보냄 // commit 내부의 flush가 보내는 것임
- 지연 로딩
- 즉시로딩 : Join SQL로 한번에 연관 객체까지 미리 조회
- 지연로딩 : 객체가 실제 사용될 때 로딩
'공부 > Spring' 카테고리의 다른 글
[JPA] 영속성 관리 - 내부 동작 방식 (0) | 2022.07.02 |
---|---|
JPA 시작하기 (0) | 2022.06.20 |
[chap17] 프로필과 프로퍼티 (0) | 2022.06.09 |
[chap16] JSON 응답과 용청 처리 (0) | 2022.06.09 |
[chap15] 간단한 웹 어플리케이션의 구조 (0) | 2022.06.09 |
댓글