ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JPA를 사용해야 하는 이유
    JPA 2022. 3. 27. 02:54

    JPA를 왜 사용해야하는가?

    그 이유를 5가지 정도 알아보자

     

    1. SQL 중심적인 개발에서 객체 중심으로 개발

    JPA를 사용하면 마치 자바 컬렉션을 사용하는 것 처럼 데이터를 다룰 수 있다.

    2. 생산성

    JPA와 CRUD

    저장

    //Kotlin
    em.persist(member)

    조회

    val member = em.find(memberId)

    수정

    member.name = "변경할 이름"

     : 수정 시 엔티티의 프로퍼티를 변경하고 어딘가 등록(?) 해줘야 할 것 같은데 JPA는 마치 자바 컬렉션에 데이터를 넣었다 뺐다 하는 것처럼 할 수 있게 해주기 때문에해당 객체 프로퍼티면 변경하면 된다. (어떤 원리로 되는 지는 뒤에 자세히)

     

    삭제

    em.remove(member)

    => 굉장히 간단하다.

    3. 유지보수

    기존의 SQL은 필드가 변경되면 DDL로 처리해줘야하고 기존 쿼리에 변경을 많이 했어야 했다.

    기존 : 필드 변경 시 모든 SQL 수정

    JPA는 엔티티에 필드만 추가하면 된다.

    SQL은 JPA가 처리한다.

    4. 관계형 DB와 패러다임 불일치 해결

    예전 포스팅에서 관계형 DB와 객체지향 언어의 패러다임 불일치에 대해 알아보았다.

    https://soyangkim98.tistory.com/12?category=1015340 

     

    객체와 관계형 데이터베이스의 차이

    객체와 관계형 데이터베이스의 차이는 크게 4가지 정도 정리할 수 있다. 1. 상속, 2. 연관관계 3. 객체 그래프 탐색, 4. 비교하기 1. 상속 관계형 DB에서 객체의 상속 관계와 그나마 비슷한 것은 Table

    soyangkim98.tistory.com

    요약하면 객체와 RDB의 차이는 "필드와 메서드를 묶어 캡슐화 해서 쓰는 것이 목표"인 객체와 "데이터를 잘 정규화 해서 보관하는 것이 목표"인 관계형 데이터베이스의 패러다임 차이에서 오는 것이라고.

     

    그 패러다임 불일치 해결을 JPA가 해준다.

    4.1 상속)

    관계형 DB에서 객체의 상속 관계와 그나마 비슷한 것은 Table의 슈퍼타입 서브타입 논리모델이다.

    사용자가 객체 상속관계를 만들어 JPA를 통해 저장하면 JPA가 테이블을 나누어 쿼리를 날려준다.

    (물론 Annotation의 strategy 옵션을 지정해 저장 방식을 선택할 수 있다.)

    저장
    조회

     

    4.2 연관관계, 객체 그래프 탐색)

    Layered Architecture의 경우 다음 계층에서 그 위의 Layer를 신뢰해야 한다.

    연관관계를 저장하고 객체 그래프 탐색이 가능하다.

    신뢰할 수 있는 엔티티 계층을 만들어준다.

    여기서 중요하게 사용되는 기술이 '지연 로딩'이다.

    지연로딩 : 사용하는 시점에 SQL이 나가서 데이터 채워지는 기능.
    자세한 건 나중에 따로 프록시와 함께 올리도록 한다.

    4.3 비교하기)

    동일한 트랜잭션에서 조회한 엔티티는 같음을 보장한다.

    val memberId: String = "100"
    val member1 = em.find(Member::class.java, memberId)
    val member2 = em.find(Member::class.java, memberId)
    
    member1 == member2	//true

     

    5. JPA의 성능 최적화 기능

    5.1 1차 캐시와 동일성(identity) 보장)

    같은 트랜잭션 안 같은 엔티티를 반환하는 것은 약간의 조회 성능 향상에 도움을 준다.

    (사실 한 고객의 요청 사이에서의 동일성 보장하기 때문에 크게 도움은 안된다고 함.)

     

    DB Isolation Level이 Read Commit이어도 애플리케이션에서 Repeatable Read 보장

     -> DB Isolation Level을 한 단계 낮춰도 되는군.

    DB Isolation Level 트랜잭션 격리 수준
     : 데이터베이스 시스템이서 격리는 트랜잭션 무결성이 다른 사용자 및 시스템에 표시되는 방식을 결정한다.
    격리 수준이 낮으면 많은 사용자가 동시에 동일한 데이터에 액세스 할 수 있는 능력이 증가하지만 사용자가 겪을 수 있는 동시성 효과 수가 증가한다.
    [출처] 위키백과

    5.2 트랜잭션을 지원하는 쓰기 지연(transactional write-behind))

    [INSERT]

    트랜잭션을 커밋할 때 까지 INSERT SQL을 모음

    (좀 뒤에 영속성 컨텍스트와 함께 자세히 알아본다.)

    JDBC BATCH SQL 기능을 사용해서 한번에 SQL을 전송한다.

    5.3 지연 로딩 (Lazy Loading))

    지연 로딩 : 객체가 실제 사용될 때 로딩된다. 네트워크를 많이 타고 proxing 기술을 쓴다.
    즉시 로딩 : JOIN SQL로 한번에 연관된 객체까지 미리 조회한다.

    어떤 객체를 쓸 때 항상 프로퍼티를 쓴다고 하면 즉시로딩 방식을 쓰고

    프로퍼티를 가끔 쓴다고 하면 지연로딩을 쓰면 된다.

     

     

    ORM은 객체와 RDB 두 기술 위에 있는 기술이므로 균형을 잘 맞추어야 한다.

    JPA는 이 역할을 잘 해주고 있다.

     

    [출처]
    자바 ORM 표준 JPA 프로그래밍 - 기본편
    https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

    'JPA' 카테고리의 다른 글

    JPA 소개2  (0) 2022.03.27
    [JPA] JPA 소개1  (0) 2022.03.25
    객체와 관계형 데이터베이스의 차이  (0) 2022.03.24
    SQL 중심적인 개발의 문제점  (0) 2022.03.24
    자바 ORM 표준 JPA 프로그래밍 정리  (0) 2022.03.24
Designed by Tistory.