본문 바로가기
JPA/ORM 표준 JPA

01. JPA 소개

by clearinging 2021. 5. 19.
반응형

JDBC API의 문제점과 SQL의 문제점

문제점

  • 만약 crud 코드를 작성할 때 Conn -> STMT -> ResultSet 코드 반복이 많다
  • 요구사항 증가로 하나의 filed 값이 추가 -> 모든 sql문 수정이 필요함 -> 아니면 추가된 column에 대해 null 값 저장, 연관 객체는 더 까다로움 -> SQL에 의존적인 개발을 피하기 어렵다
  • 모든 것이 SQL에 의존적 -> Entity 를 신뢰 할 수 없다 -> SQL문을 하나씩 실행해서 결과를 봐야함 -> 계층 분할이 아님
  • 패러다임 불일치 : 객체와 다릴 데이터베이스는 추상화, 상속, 다형성 같은 개념이 없기 때문에 둘의 기능 표현 방법이 다르다.

JPA로 문제 해결

  • sql문을 JPA가 제공하는 interface 사용한다 -> JPA CRUD API 간단히 제공됨 (jpa.persist(member) -> insert sql 실행)
  • jpa 는 수정 메소드 따로 제공 하지 않는다 하지만 만약 find 해서 가져온 값을 set 함수로 변경하면 transaction이 끝나기 전에 update 함수를 호출해줌
  • 패러다임 불일치 해결
    • 상속
      • DB에 부모 자식 관계를 나타내야함 -> 이럴경우 반환 해줄 때 join 연산이 이뤄지게 되므로 많은 비용이 필요
      • 만약 객체를 저장 할 때 jpa 에 객체를 먼저 저장한다.(persist 메서드)
      • find method 를 사용하면 자동으로 2개의 부모 자식 entity를 join해서 반환
    • 연관 관계 : 객체는 참조를 사용해 참조에 접근해서 연관된 객체를 조회 -> 그래프 탐색하여서 참조한 것들을 조회 한다.
    • 같은 row를 조회 하더라도 객체 입장에서 다른 객체로 인지한다. -> JPA가 같은 Transaction일 때 같은 객체를 보장한다.
// class var : user, EntityManager : em
// 저장
em.persist(user);

// 조회
em.find(User.class, userId);

// 수정
User user = em.find(User.class, userId);
user.setName("변경된 이름"); // 수정 시점

// 연관관계 객체 조회
User user = em.find(User.class, userId);
Role role = user.getRole(); // 조회 시점

JPA란?

  • ORM : 객체를 관계형 데이터 베이스에 mapping 시키는 기술 -> 객체와 테이블 매핑 패러다임의 불일치 문제를 해결해준다.

  • 개발자는 ORM에게 어떻게 mapping시킬지를 알려주기만 하면된다.
  • 내부 ORM 프레임 워크 가여러개 있는데 주로 Hibernate가 주로 사용된다.(그외에 EclipseLink, DataNucleus가 있다.)
  • JPA는 ORM 기술에 대한 API표준 명세
  • JPA를 구현한 구현체
    • Hibernate(대부분 경우 이걸 사용합니다.)
    • EclipseLink
    • DataNucleus

JPA 사용하는 이유

  • 생산성
    • DDL문을 자동으로 생성 가능
    • 저장 코드와 같은 SQL문을 자동으로 생성
  • 유지보수
  • 패러다임 불일치 해결
    • 상속(DB에서 Super type, Sub type으로 분리)
    • 연관관계 : 연관 계체를 참조 형태로 조회 -> join으로 데이터 조회
    • 객체 그래프 탐색 -> 내부 참조 관계
    • 같은 row에 대해 객체 비교
  • 성능 : 최적화 기능 제공 -> 같은 조회 쿼리를 두번 실행하지 않고 한번 실행 후 캐싱 되어있는 것을 가져온다.
    • 이미 조회한 객체는 SQL을 날리지 않고 영속성 컨택스트가 관리하고 있는 객체를 반환
  • 데이터 접근 추상화와 벤더 독립성
    • 애플리케이션과 DB 사이에서 추상화
    • DB마다 Oracle Rownum, limit와 같은 방언들이 다 존재한다. 이런 방언까지 다 처리해준다.
  • ex) 페이징 처리 부분도 DB 마다 달라지는데 JPA로 고정해서 DB가 바껴도 자동으로 처리

객체 그래프 탐색

  • 정의 : 연관 객체를 찾는 것을 그래프 탐색하는 것
  • SQL를 직접 작성 : 그래프 탐색 범위를 설정할 수 있음
    • SQL 의 한계점 : SQL 문을 보지 않고 Service 객체에서 DAO코드만 봤을 때 join으로 가져온 데이터를 빠르게 식별하기 어려움
    • 예 : User, Role이 연관 관계일 때 user를 조회하는 코드만 보고 Role을 가져왔는지 안 가져왔는지 식별하기 어려움
  • JPA 그래프 탐색
    • 지연로딩
      • 영속성 컨택스트가 살아있는 레이어에서 참조된 객체를 사용할 때 DB에서 가져오도록 하는 JPA속성
    • 즉시 로딩
      • 처음에 하나의 데이터를 가져올 때 연결된 모든 Table의 정보를 한번에 가져오도록 하는 것
      • 성능 이슈가 발생할 수 있으므로 절대 사용하지 않는 것을 추천합니다.
    • JPA N + 1과 같은 문제가 발생하지 않게 성능 최적화는 필요합니다(지연 + 즉시 로딩 둘다 포함)

객체 비교

  • DB : Row를 비교 -> pk가 도일 동일하다고 간주
  • JAVA
    • 동일성 : 객체 자체(주소값) 자체가 같을 때(hashCode()가 동일)
    • 동등성 : equals 함수로 객체의 내포해 있는 정보가 같을 때
@Service
@RequiredArgsConstructor
public class UserService {
    private final UserDao userDao;

    public void equalUser(Long useId) {
        // ...
        User user1 = userDao.findUser(userId);
        User user2 = userDao.findUser(userId);
        // ..
    }
}
  • SQL 문 :user1과 user2이 동일, 동등하다는 것을 보장하기 위해서는 hashCode, equals을 구현해야한다,
  • JPA : user1을 조회하면 영속성 컨택스트가 관리하는 객체가된다. user2에서 동일한 row를 조회 하기 때문에 영속성 컨택스트가 관리하고 있는 user1객체를 user2에서 전달한다.
반응형

'JPA > ORM 표준 JPA' 카테고리의 다른 글

06 연관관계 Mapping 종류  (2) 2021.08.21
05 연관관계  (0) 2021.07.28
04 Entity  (3) 2021.07.08
03. 영속성  (0) 2021.06.30
02. JPA 요소들  (2) 2021.06.29