1. JPA 소개

1.1 SQL을 직접 다룰 때 발생하는 문제점

1.1.1 반복, 반복 그리고 반복

  1. CRUD 기능 구현을 위한 SQL 작성
    SELECT id, name FROM member WHERE id = ?
    
  2. JDBC API를 사용해 SQL 실행
    ResultSet rs = stmt.executeQuery(sql);
    
  3. 조회결과를 객체로 매핑
    String id = rs.getString("id");
    String name = rs.getString("name");
    Member member = new Member();
    member.setId(id);
    member.setNam(name);
    

1.1.2 SQL에 의존적인 개발

: 테이블에 컬럼 추가 요구 -> 객체에 필드 추가, 관련 SQL 수정, 조회결과 추가 매핑...

  • 엔티티를 신뢰할 수 없다.
  • 진정한 의미의 계층 분할이 어렵다.
  • SQL에 의존적인 개발을 피하기 어렵다.

1.1.3 JPA와 문제 해결

: 개발자가 직접 SQL을 작성하는 것이 아니라 JPA가 제공하는 API를 사용하면 JPA가 적절한 SQL을 생성해 DB에 전달한다.

jpa.persist(member); // 저장

Member member = jpa.find(Member.class, id); // 조회

1.2 패러다임의 불일치

  • 관계형 데이터베이스는 데이터 중심으로 구조화되어 있고 객체지향 개념이 없다.
  • 개발자가 객체와 관계형 데이터베이스 사이의 패러다임 불일치 문제를 해결하는 데 많은 시간과 코드를 소비한다.

1.2.1 상속

  • 관계형 데이터베이스는 상속을 표현하기 난해하고, 그 것을 처리하기 위한 SQL 작성도 만만치 않다.
INSERT team INTO .. VALUES ..
INSERT member INTO .. VALUES ..

SELECT *
FROM team t
JOIN member m on t.team_id = m.team_id
  • JPA를 아래와 같이 사용하면 위와 동일한 SQL을 작성해 실행시켜준다.
jpa.persist(member);

Member member = jpa.find(Member.class, id);

1.2.2 연관관계

  • 객체는 참조에 접근해서 연관된 객체를 조회한다. 참조가 있는 방향으로만 접근 가능
  • 테이블은 외래키를 사용해 연관관계를 가지고, 조인을 사용해 연관된 테이블을 조회한다. 양방향 접근 가능
  • JPA는 참조를 외래키로 변환해 저장하고, 외래키를 참조로 변환해 조회한다.
member.setTeam(team);
jpa.persist(member);

Member member = jpa.find(Member.class, id);
Team team = member.getTeam();

1.2.3 객체 그래프 탐색

  • SQL을 직접 다루면 처음 실행하는 SQL에 따라 객체 그래프를 어디까지 탐색할 수 있는지 정해져 버린다.
  • JPA는 연관된 객체를 신뢰하고 마음껏 조회할 수 있다. 실제 객체를 사용하는 시점까지 DB 조회를 미룬다.(지연로딩)

1.2.4 비교

  • 같은 데이터베이스 로우에서 조회한 객체들은 각각 다르다.
Member m1 = memberDAO.getMember(id);
Member m2 = memberDAO.getMember(id);
m1 == m2 // false
  • JPA는 동일 트랜잭션 내 같은 객체가 조회 되는것을 보장한다.
Member m1 = jpa.find(Member.class, id);
Member m2 = jpa.find(Member.class, id);
m1 == m2 // true

1.2.5 정리

객체 관계형 데이터베이스
상속 상속 상속과 유사한 슈퍼타입과 서브타입
연관관계 참조 외래키를 통해 조인
객체그래프탐색 참조를 통해 탐색 SQL 조인 범위에 따른 범위 고정
비교 == 주소값 비교 / equals() 객체 내부값 비교 기본키 값으로 각 row 구분
모델링 객체 지향 모델링 데이터 중심 모델링

1.3 JPA란?

  • Java Persistence API
  • 자바 진영의 ORM 기술 표준

ORM ? Object-Relational Mapping
객체와 관계형 데이터베이스 테이블 사이의 매핑 처리를 하여
각각 객체모델링과 데이터모델링을 가능하게 한다

  • JPA 동작

1.3.1 JPA 사용 이유

  • 표준 | 다른 구현 기술로 변경이 쉽다.

  • 성능 | 동일 트랜잭션 내 데이터 중복 조회시 한 번만 DB에 전달한다.

  • 생산성 | 반복되는 SQL 작성과 JDBC API 사용을 처리해준다.

  • 유지보수 | 엔티티 필드 변경에 제약이 없다.

  • 패러다임 불일치 해결 | 상속, 연관관계, 객체 그래프 탐색, 비교 문제가 해결된다.

  • 데이터 접근 추상화와 벤더 독립성 | 특정 DB 기술에 종속되지 않는다.(DB Dialect)

results matching ""

    No results matching ""