쌩로그

Jpa기본 01. JPA의 소개(인프런 + 자바 ORM 표준 JPA 프로그래밍) 본문

Spring/JPA

Jpa기본 01. JPA의 소개(인프런 + 자바 ORM 표준 JPA 프로그래밍)

.쌩수. 2023. 8. 20. 19:41
반응형

목록

  1. 포스팅 개요
  2. 본론
      2-1. SQL을 직접 다룰 때 발생할 수 있는 문제점
      2-2. JPA를 통해서 얻어지는 이점
      2-3. JPA란 무엇인가
  3. 요약

1. 포스팅 개요

해당 포스팅은 인프런에서 영한님의 JPA기본 강의에서 JPA 소개 파트와 해당 파트에 맞는 책의 챕터를 보고 학습한 내용을 요약 및 정리하는 포스팅입니다.

지양하지만, 요즘은 기록하면서 생각하다보니, 더 학습 효과를 불러오는 것 같습니다..
역시.. 생각을 해야되..

2. 본론

2-1. SQL을 직접 다룰 때 발생할 수 있는 문제점

  1. 진정한 의미의 계층 분할이 어렵습니다.

    - 객체지향의 특징인 캡슐화, 다형성, 추상화, 정보은닉, 상속 등의 특징을 이용해서 데이터 접근 객체(DAO)를 감췄다고 하더라도, DAO 내에 어떤 SQL이 실행되는지 확인해야합니다.

  2. 엔티티를 신뢰할 수 없습니다.

      - 회원이 어떤 그룹에 속해 있다고 가정하고, SQL을 통해 회원을 조회했습니다만, SQL에 그룹의 정보를 조회하는 내용이 포함되어있지 않다면, 회원이 어떤 그룹에 속해있음에도 불구하고, 회원이 속한 그룹을 조회할 수 없습니다. 이 역시 DAO 내에서 SQL을 직접 확인하거나, 회원이 속한 그룹을 함께 조회하는 메서드가 있는지 확인하여 호출해야 합니다.

  3. SQL에 의존적인 개발을 피하기 어렵습니다.

      - SQL을 일일이 확인해야하고, 작성된 SQL대로만 정보를 입력, 수정, 삭제, 조회되기 때문에 SQL에 의존적일 수 밖에 없습니다.

2-2. JPA를 통해서 얻어지는 이점

  1. 패러다임의 불일치를 해결해줍니다.

      - RDB와 OOP는 지향점이 다릅니다. 그래서 SQL과 OOP사이의 패러다임 차이를 개발자가 일일이 메꿔주어야했습니다. JPA를 도입하게되면, JPA가 패러다임의 일치를 극복시켜줍니다.

  2. 객체 그래프 탐색이 가능해집니다.

      - RDB는 외래키를 통해서 연관된 엔티티를 참조하지만, 객체는 참조를 통해서 연관된 객체를 참조합니다. 그리고, RDB는 처음 실행되는 SQL에 따라 참조할 수 있는 엔티티의 범위가 정해집니다. 범위가 커지면 커질수록 SQL도 길어집니다. 하지만, OOP는 참조를 통해서 객체를 계속해서 탐색할 수 있습니다. RDB와 OOP에는 이러한 차이가 있고, 이를 개발자가 직접 일일이 메꿔주어야했습니다만, 이 또한 JPA를 통해 해결할 수 있습니다. JPA는 연관된 객체가 필요한 시점에 객체를 조회하는 지연로딩을 이용하는데, 실제 객체를 조회를 데이터베이스 실행시점점까지 지연시킨다고 하여 지연로딩이라고 표현합니다.

  3. JPA는 동등성(==)과 동일성(equals())를 보합니다.

      - 동등성은 인스턴스 주소값이 같은지를, 동일성은 인스턴스의 내부 값이 같은지를 의미합니다. SQL매퍼를 이용해서 데이터를 조회할 때 코드를 보면, 다음과 같습니다.

  class MemberDao {
      public Member getMember(String memberId) {
          // 회원 조회
          ...
          Member member = new Member();  // 회원 객체 생성
          // member에 적절히 값을 세팅
          return member;
    }
}
public void 비교() {
    Member member1 = memberDat.getMember(memberId);
    Member member2 = memberDat.getMember(memberId);
    member1 == member2 ; // 다르다. 
}

위의 코드처럼 객체를 비교하면 당연히 다를 수 밖에 없습니다.
왜냐하면, new Member(); 를 통해서 객체가 새로 생성되는데, 새로 생성된 두 인스턴스 주소는 다르기 때문에, 동등성을 비교하면, 불일치한 결과가 나올 수 밖에 없습니다.
하지만, JPA를 통해서 객체를 조회하게 되면, 객체의 동등성을 보장해줍니다. 마치 자바 컬렉션에서 객체를 얻어와서 비교하면 같은 객체라는 결과를 주는 것처럼요.

동등성(==) 즉, 인스턴스의 주소 값이 같기 때문에, 동일성(equals())이 일치하는 것은 당연합니다.

2-3. JPA란 무엇인가

  • JPA는 자바 진영의 ORM(Object-Relational Mapping)기술의 API 표준 명세입니다.
    • API 표준 명세란, 인터페이스의 모음입니다.
    • ORM은 객체와 관계형 데이터배이스의 표준을 의미합니다.
  • JPA를 사용하면, OOP와 RDB의 패러다임 불일치를 해결하게 됨으로 개발자는 데이터 중심인 관계형 데이터베이스를 사용해도 객체 지향적으로 애플리케이션을 개발할 수 있습니다.

2-3-1. JPA를 사용할 때의 이점

  • 생산성이 높아집니다.
    • SQL을 JPA가 알아서 만들어주므로, 개발자가 SQL에 의존적인 개발을 피할 수 있습니다.
    • 자바의 컬렉션에서 객체를 저장하고, 조회하듯이 간결한 코드를 유지할 수 잇습니다.
  • 유지보수가 용이합니다.
    • 생산성이 높아지는 이유와 같은 맥락입니다.
  • 패러다임의 불일치를 해결해줍니다.
    • 앞서 봤던 것처럼 패러다임의 불일치로 RDB 중심 애플리케이션 개발에서 객체 지향의 특징과 장점을 살려 애플리케이션 개발이 가능해집니다.
  • 성능을 증가의 효과를 기대할 수 있습니다.
    • JPA는 RDB와 애플리케이션 사이에서 동작합니다.
      같은 트랜잭션 안에서 회원을 두 번 조회한다고 가정했을 때,
      JPA를 사용하지 않으면, 조회 쿼리를 두 번 날리지만,
      JPA한 번의 쿼리로 회원을 조회하고, 한 번 더 조회할 때는 조회된 데이터를 가져옵니다. 즉, 결과적으로 한 번의 쿼리를 실행하게 되는데, 이로써 성능이 증가되는 효과를 기대할 수 있습니다..
  • 데이터 접근 추상화와 벤더 독립성
    • 애플리케이션과 데이터베이스 사이에 추상화된 접근 계층을 제공하여, 특정 데이터베이스에 종속되지 않도록 합니다.
      • MySQL을 이용하다가 얼마든지 다른 RDBMS를 사용한다고, JPA에게 알려주면, JPA가 알아서 변경한 RDBMS의 문법에 맞게 SQL을 실행합니다.

3. 요약

OOP와 RDB의 패러다임 차이로 인해서 객체지향 프로그래밍의 장점을 살리지 못하고, 이 차이를 메꾸기 위해서 수많은 SQL 매핑 코드를 통해서 시간과 비용이 소모되었지만, 자바진영의 오랜 연구와 설계로 ORM 프레임워크JPA가 등장했습니다.
JPA가 등장하게 됨으로써, OOP와 RDB의 패러다임 차이로 발생했던 문제를 극복하고, 객체지향 프로그래밍의 장점을 살릴 수 있었습니다.

SQL의 지향적인 개발로 다음과 같은 문제점이 있었습니다.

  1. 엔티티를 신뢰하지 못한다.
  2. SQL에 의존적인 개발을 피하기 어렵다.
  3. 진정한 의미의 계층 분할이 이뤄지지 않는다.

이러한 문제점이 있었습니다만, JPA를 이용하면, 이를 모두 해결할 수 있습니다.
그리고 JPA를 이용하면 다음과 같은 이점을 얻을 수 있습니다.

  1. RDB와 OOP의 패러다임의 불일치를 해결해준다.
  2. 객체 그래프 탐색이 가능하다.
  3. 객체의 동등성(==)과 동일성(equal())을 보장한다.

JPA는 자바진영의 ORM 기술의 API 표준 명세입니다. 즉, 인터페이스의 모음입니다.
ORM이란, Object-Relational Mapping으로 객체와 관계형 데이터베이스의 매핑을 의미합니다.

JPA를 사용하게 되면 5가지의 이점을 얻을 수 있습니다.

  • 생산성
  • 유지보수
  • 패러다임의 불일치 해결
  • 성능
  • 데이터 베이스 추상화와 벤더 독립성
    • 특정한 DBMS에 종속되지 않습니다.
728x90
Comments