본문 바로가기
공부/Spring

JPA 소개

by JERO__ 2022. 6. 20.

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가 만들어진 과정

  1. EJB : 엔티티 빈(자바표준)
    • 성능 느림
  2. 하이버네이트 (오픈소스)
  3. JPA (자바 표준)
    • 하이버네이트와 비슷
    • 용어정리됨

JPA를 왜 사용해야 하는가?

  1. 생산성 : 자바 컬렉션을 사용하는 것 같다. + 만들어져 있다.
    • 저장 : persist
    • 조회 : find
    • 수정 : setName
    • 삭제 : remove
  2. 유지보수
    • 필드의 추가 삭제가 훨신 간편하다.
  3. JPA와 패러다임 불일치 해결
    • 상속
    • 연관관계
      • persist(albam)만 해주었을 뿐인데 Insert 쿼리가 두개가 나간다!
    • 신뢰할 수 있는 엔티티
      • 지연로딩 : 해당 SQL을 사용하는 시점에 값을 가져옴
      • 자유롭게 탐색
    • JPA와 비교하기
      • 동일한 트랜잭션에서 조회한 엔티티는 같음
      • member1 == member2
  4. JPA의 성능 최적화 기능
  • 1차 캐시와 동일성 보장
    • SQL 1번만 실행

  • 트랜잭션을 지원하는 쓰기 지연
  • transaction.begin(); // 트랜잭션 시작 em.persist(memberA); em.persist(memberB); em.persist(memberC); // 여기까지 insert 쿼리를 보내지 않음 transaction.commit(); // 커밋하는 순간 모아서 보냄 // commit 내부의 flush가 보내는 것임
  • 지연 로딩
    • 즉시로딩 : Join SQL로 한번에 연관 객체까지 미리 조회
    • 지연로딩 : 객체가 실제 사용될 때 로딩

 

댓글