SQL 중심적인 개발의 문제
- 지금 시대는 객체를 관계형 DB에 관리
- CRUD, ... 무한 반복, 지루한 코드. 계속 쿼리를 작성해야
- 객체에는 상속 관계가 있지만, 데이터베이스에는 상속 관계가 없음.
- 슈퍼 타입, 서브 타입으로 설계해야함.
- 조회 시에도 조인해서 해야함. => 객체를 테이블에 맞춰서 설계해야함.
ORM (Object - relational mapping, 객체 관계 매핑)
- 객체는 객체대로 설계
- 관계형 데이터 베이스는 관계형 데이터베이스 대로 설계
- ORM 프레임워크가 중간에서 매핑
JPA를 왜 사용해야 하는가
- SQL 중심적인 개발에서 객체 중심으로 개발
- 생산성
- 유지보수
- 패러다임의 불일치 해결
- 성능
- 데이터 접근 추상화와 벤더 독립성
- 표준
저장: jpa.persist(member)
조회: Member member = jpa.find(memberId)
수정: member.setName("변경할 이름")
삭제: jpa.remove(member)
유지 보수 측면에서도 원래는 모든 쿼리를 변경해야 했지만, JPA는 필드만 추가하면 돼서 편하다.
상속 문제도 JPA가 알아서 처리해준다.
연관 관계도 알아서 처리해준다.
JPA의 성능 최적화 기능
- 1차 캐시와 동일성 보장
String memberId = "100"
Member m1 = jpa.find(Member.class, memberId); //SQL
Member m2 = jpa.find(Member.class, memberId); //캐시
- 트랜잭션을 지원하는 쓰기 지연
- 트랜잭션을 커밋할 때까지 insert문을 모아서 한번에 SQL 전송
- 지연 로딩
- 지연 로딩: 객체가 실제 사용될 때 로딩
- 연관된 것을 실제 사용될 때만 가져오기
- 즉시 로딩: JOIN SQL로 한번에 연관된 객체까지 미리 조회
- 지연 로딩: 객체가 실제 사용될 때 로딩
728x90
'Spring' 카테고리의 다른 글
[JPA 기본편] 영속성 관리 - 내부 동작 방식 (0) | 2024.06.15 |
---|---|
[JPA 기본편] JPA 기초 (1) | 2024.06.14 |
[Springboot & JPA 1] 웹 계층 개발 (2) | 2024.05.15 |
[Springboot & JPA 1] 주문 도메인 개발 (0) | 2024.05.04 |
[Springboot & JPA 1] 상품 도메인 개발 (0) | 2024.05.03 |