ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JPA] 등장 배경, 사용 이유, 간단 구동 방식
    Back-end/JPA 2022. 3. 31. 01:02

    스터디를 위해 인프런 강의를 들으면서 드디어 JPA에 대한 기본적인 이해를 하게 되었다.

    기존에 코드를 짜면서 '정말 데이터베이스에서 이렇게 가져오나..?'라는 의문이 들었던 이유는 JPA를 잘 몰랐기 때문이었다.

    이번 스터디를 하면서 제대로 공부해야겠다. 😃

     

    ✔️ JPA 등장 배경

    요즘 개발을 할 때 객체 지향 언어 & 관계형 데이터베이스의 조합을 많이 사용한다.

    객체를 관계형 데이터베이스에 저장하기 위해서는 아무래도 SQL이 필수적이다.

    ## SQL 의존적인 개발의 문제점

    - 객체 CRUD 혹은 필드 추가시 SQL문을 변경하기 번거롭고, 놓치는 부분이 발생할 수 있다.

    - 객체와 관계형 데이터베이스 간 패러다임의 불일치 (상속, 연관관계, 데이터 타입, 데이터 식별 방법) → 계속해서 작성해야하는 SQL문만 늘어남

    ## 개선 방안

    - 객체를 자바 컬렉션에 저장하듯이 데이터베이스에 저장하기 위해 나온 것이 JPA이다. 

     

    ✔️ JPA(Java Persistence API) 간단 개념

    - 자바 진영의 ORM(객체 관계 매핑) 기술 표준

    - Java 어플리케이션과 JDBC 사이에서 동작한다.

    - Entity 분석, SQL 생성, JDBC API 사용, 패러다임 불일치 해결하는 작업을 수행한다.

     

    - JPA는 인터페이스의 모음이다.

    - JPA 2.1 표준 명세를 구현한 위의 3가지 구현체 중 하나를 이용해 JPA를 사용한다. (주로 Hibernate를 사용함)

    - 데이터베이스에 종속적이지 않다.

     

    ✔️ JPA를 왜 사용해야 하는가

    1. 생산성

    //저장
    jpa.persist(member)
    
    //조회
    Member member = jpa.find(memberId)	//추가: 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장해줌
    
    //수정
    member.setName("이름")
    
    //삭제
    jpa.remove(member)

    - 구현되어 있는 메서드를 사용해 CRUD를 쉽게 할 수 있다.

     

    2. 유지보수 & 객체와 데이터베이스 간 패러다임 불일치 해결

    - 엔티티의 필드 변경시 등 필요한 SQL문은 JPA가 알아서 생성하여 처리해준다.

     

    3. JPA의 성능 최적화 기능

    # 1차 캐시와 동일성 보장

    String memberId = "100";
    Member m1 = jpa.find(Member.class, memberId); //SQL
    Member m2 = jpa.find(Member.class, memberId); //캐시
    
    println(m1 == m2) //true

    - 같은 트랜잭션 안에서는 동일한 엔티티를 반환한다. (약간의 조회 성능 향상)

    - 위의 코드에서는 SQL이 1번만 실행된다.

     

    # 지연 로딩(Lazy Loading)

    ▶️ 지연 로딩: 연관된 객체는 실제 코드에서 호출되어 사용될 때 로딩

    → 연관된 엔티티의 필드를 사용할 때가 되어서야 데이터베이스에 쿼리를 날려 가져온다.

     

    ▶️ 즉시 로딩: JOIN SQL로 한번에 연관된 객체까지 모두 미리 로딩

    → JOIN을 사용해 연관된 객체까지 한번에 가져온다.

     

    💡 추가 - 지연 로딩과 즉시 로딩 중 어떤 것으로 설정해야 할까?

    정답이 있는 것은 아니고, Entity간의 호출 빈도 관계에 따라 적절한 것으로 설정하면 된다. 

    만약 Member를 조회할 때 항상 Team을 같이 조회한다면, 즉시 로딩으로 설정해두는 것이 좋을 것이다.

     

    ✔️ JPA 구동 방식

    구현 환경: Java 11, Gradle, Hibernate, H2

    • EntityManagerFactory는 하나만 생성하여 어플리케이션 전체에서 공유해서 사용한다.
    • EntityManager는 사용자 요청마다 생성되므로, 쓰레드간에 공유하면 안된다. (사용 후 버려야 함)
    • JPA의 모든 데이터 변경은 트랜잭션 안에서만 실행된다.

     

    ✔️ JDBC(Java Database Connectivity)란

    자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다.

    데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다.

     

    # JDBC 아키텍쳐

    JDBC API와 JDBC Driver API 총 2개의 Layer로 구성되어 있다.

    JDBC API: Java Application과 JDBC Driver Manager 간의 연결을 제공한다.

    JDBC Driver API: JDBC Driver Manager와 JDBC Driver 간의 연결을 제공한다.

     

    # JDBC 구성 요소

    1. DriverManager 클래스

    - 데이터베이스 driver들의 목록을 관리한다.

    - Java 어플리케이션의 요청에 해당하는 적절한 데이터베이스 driver를 연결시켜준다.

    2. Driver 인터페이스

    - 데이터베이스 서버와의 연결을 관리한다.

    - 사용자가 직접 Driver Object와 통신하는 경우는 드물고, 대신 DriverManager Object를 사용한다.

    3. Connection 인터페이스

    - 데이터베이스와의 연결에 사용되는 모든 메서드를 포함하고 있다.

    - 해당 인터페이스의 Object는 데이터베이스와의 connection(session)을 나타내는 것으로, 해당 connection의 context 내에서 SQL문이 실행되고, 결과가 반환된다.

    4. Statement 인터페이스

    - 해당 인터페이스의 Object를 사용해 static SQL문을 실행하고, 생성된 결과를 반환한다.

    5. ResultSet 인터페이스

    - 해당 인터페이스의 Object는 Statement Object를 사용해 실행된 SQL 쿼리문에 의해 데이터베이스로부터 반환된 데이터들을 가지고 있다.

    6. SQLException 클래스

    - 데이터베이스와의 통신에서 발생하는 모든 에러에 대한 정보를 관리한다.

     

     

     

    😃 헷갈렸던 부분

    JPA는 마법이 아니다.

    객체와 데이터베이스를 쉽게 매핑하고, 객체를 쉽게 CRUD 할 수 있도록 도와주는 오픈소스 코드일 뿐이다.

    구현되어 있는 내용을 가져다 쓰는 것이다.

     

     

    참고)

    https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

    https://www.tutorialspoint.com/jdbc/jdbc-introduction.htm

    'Back-end > JPA' 카테고리의 다른 글

    [JPA] 값 타입  (0) 2022.04.28
    [JPA] 프록시와 연관관계 관리  (0) 2022.04.28
    [JPA] 상속관계 매핑과 @MappedSuperclass  (0) 2022.04.27
    [JPA] 연관관계 매핑  (0) 2022.04.14
    [JPA] 엔티티 매핑  (0) 2022.04.11

    댓글

Designed by Tistory.