01. JPA 소개

가장 중요한 강의라 함

왜 이 기술이 나왔고, 어디에 필요한지 알아야함

SQL 중심적 개발의 문제점#

지금 시대는 객체를 관계형 DB로 관리하는 시대

문제점#

  • SQL 중심적 코드
    • SQL를 뺄 수 없어 SQL 중심적 코드를 작성할 수 밖에 없음
    • CRUD 코드를 만들 때 반복되는 쿼리
  • 패러다임의 불일치, 객체 vs 쿼리
    • 객체를 SQL 변환하여 RDB에 적재해야함
    • 개발자가 SQL 매퍼 역할을 해야함
    • (차이점) 객체 vs RDB
      • 상속
        • 테이블은 슈퍼타입, 서브타입 관계가 있음
        • 서브타입을 만들면 테이블이 나눠져 있어 두개의 쿼리나 조인 쿼리를 만들고....
      • 연관관계
        • 객체는 참조, 테이블은 외래키를 사용
        • 쿼리에 따라 객체 그래프 탐색에 대한 신뢰문제가 생김
        • 계층형 아키텍처의 진정한 의미를 지키기 힘듦
      • 데이터 타입
      • 데이터 식별 방법
    • 객체 지향적으로 작업할수록 매핑 작업만 늘어남

문제점에 대한 결론#

  • 객체를 자바 컬렉션에 저장하듯이 DB에 저장할 수 없을까?
  • 그 결과가 JPA

JPA 소개#

  • JPA: Java Persistence API
  • JAVA 진영의 ORM 기술 표준
    • ORM: Object-relational Mapping
    • 객체는 객체대로 설계
    • 테이블은 테이블 대로 설계
    • 중간에 차이들은 ORM 프레임워크가 해결해준다는 것
  • JPA는 jdbc 를 사용해서 쿼리를 직접 생성해 DB와 통신
  • 객체와 관계형 테이블의 페러다임 불일치를 해결

역사#

  • EJB: 엔터티 빈 (자바 표준)
    • 너무 아마추어적인 기술.. 속도도 느림.. 기능도 잘 안됨...
  • 하이버네이트
    • 오픈소스
  • JPA (자바 표준)
    • 하이버네이트를 복사 붙여넣기 하다시피 만든 ORM 표준: JPA
    • 표준 스펙으로 만들다보니 깔끔함
    • 인터페이스(껍데기)의 모음
    • 구현체는
      • Hibernate (메인)
      • EclipseLink
      • DataNucleus

왜 JPA를 사용해야하는가#

  • SQL 중심적인 개발에서 객체 중심으로 개발 전환 가능
  • 생산성
    • java collection 같이
    • C: jpa.persist(member)
    • R: Member member = jpa.find(memberId)
    • U: member.setName("other name")
    • D: jpa.remove(member)
  • 유지보수
    • 기존 SQL 중심에서는 관련된 객체의 모든 쿼리를 수정해야함
    • JPA 를 사용하면 클래스에 필드하나 추가하면 됨
  • 페러다임 불일치 해결
    • 객체 상속관계는 알아서 insert 쿼리 두개 만듦
    • 조회도 알아서 조인 쿼리 만들어줌
  • 연관관계, 객체 그래프 탐색 해결
    • 신뢰할 수 있는 엔터티, 계층
    • 지연 로딩으로 객체를 사용하는 시점에 쿼리를 날려 객체를 가져옴
  • 비교하기
    • 동일한 트랙잭션에서 가져오는 엔터티는 같음을 보장
  • 성능 최적화 기능
    • 1차 캐시와 동일성 보장
    • 트랜잭션을 지원하는 쓰기 지원 (transactional write-behind)
      • 커밋 시점에 쿼리를 한꺼번에 보내줌
    • 지연로딩 (lazy-loading)
      • 옵션으로 지연로딩/즉시로딩을 왔다갔다 할 수 있음
// 지연 로딩
Member member = memberDao.find(memberId); // SELECT * FROM MEMBER
Team team = member.getTeam();
String teamName = team.getName(); // SELECT * FROM TEAM
// 즉시 로딩
Member member = memberDao.find(memberId); // SELECT M.*, T.* FROM MEMBER JOIN TEAM
Team team = member.getTeam();
String teamName = team.getName();

ORM#

ORM은 결국 객체와 RDB 두 기둥위에 있는 기술

  • 객체, RDB 둘다 중요하지만
  • 보통 RDB의 데이터가 객체 구현보다 더 오래 살아남음
Last updated on