SQL 중심 개발의 문제점
- 무수히 반복되는 쿼리문 ➡️ 쿼리문 작성하는데 소요하는 시간이 길다.
- 객체 ➡️ SQL 변환 ➡️ RDB
- 상속의 어려움
- RDB에 상속관계의 데이터를 저장할 경우, 상위 객체와 하위 객체 데이터 모두 필요하기 때문에, join으로 각 객체들을 생성해야한다.
➡️상속 관계를 안쓰게 된다.
- RDB에 상속관계의 데이터를 저장할 경우, 상위 객체와 하위 객체 데이터 모두 필요하기 때문에, join으로 각 객체들을 생성해야한다.
- 개발 언어와 SQL 간 차이
- 객체 : 참조 (Member.getTeam())
- SQL 테이블 : 외래 키(JOIN ON M.TEAM_ID = T.TEAM_ID)
- 객체에서 getTeam()과 같은 자신과 연관된 객체를 테이블에 저장할 수 없고, 팀의 ID값을 저장 후 getTeamId와 같은 형식으로 개발하게 된다.(테이블에는 TEAM_ID 값으로 저장해야한다.)
- SQL의 탐색범위가 제한된다. (member.getTeam().getOrder() 같은 코드 작성 불가능)
➡️ 기존 SQL 중심적 개발에서는 자바를 자바답게 개발하기 어렵다.
JPA의 등장
위 SQL 중심 개발의 문제점을 해결하기 위해 JPA 등장
- 자바 애플리케이션 ↔️ (JPA 동작) ↔️JDBC
- 객체의 생성, 조회 코드에 대한 쿼리문을 JPA가 생성해준다.
- JPA의 표준 구현체 = 하이버네이트
JPA 사용 이점
- SQL 중심 ➡️ 객체 중심 개발
- 생산성과 유지보수 편의성 증가
- 패러다임 불일치 해결
- 객체의 상속 ↔️ Table의 슈퍼타입, 서브타입 관계 고민하지 않아도 됨.
- 같은 아이디값으로 조회해 생성한 객체의 동일성을 보장해준다
String memberid = '100'
Member member1 = jpa.find(member.class, memberId)
Member member2 = jpa.find(member.class, memberId)
member1 == member2; ➡️ True
- 성능 최적화 기능
- 지연 로딩
- 1차 캐시와 동일성 보장
- 위 코드에서 member1 조회 후 캐시에 데이터 저장됨➡️member2는 캐시에서 바로 가져옴
- 트랜잭션을 지원하는 쓰기 지연
- 트랜잭션을 커밋할 때까지 SQL을 모아서 한번에 처리
- 지연 로딩과 즉시 로딩
- 지연 로딩 : 객체가 실제로 사용될 때 로딩
- 즉시 로딩 : Join SQL로 한번에 연관된 객체까지 미리 조회
JPA의 CURD
- 저장 : JPA.persist(객체)
- 조회 : JPA.find(객체의 id)
- 수정 : 객체.setName("new Name")
- 삭제 : JPA.remove(객체)
위와 같이 객체를 활용해서 개발이 가능하다.
강의 출처
'JPA' 카테고리의 다른 글
JPA - 연관관계 주인(feat. mappedBy) (0) | 2023.05.19 |
---|---|
영속성 컨텍스트! (2) | 2023.05.11 |
자바의 트랜잭션 (0) | 2023.05.09 |
엔티티 매니저와 영속성 컨텍스트 정리 (0) | 2023.05.01 |
[JPA] N+1문제 (0) | 2023.04.18 |