[Spring JPA #1] JPA 및 ORM 이란?

ORM (Object Relational Mapping)

  • ORM은 애플리케이션의 클래스와 SQL 데이터베이스의 테이블 사이의 맵핑 정보를 기술한 메타데이터를 사용하여, 자바 애플리케이션의 객체를 SQL 데이터베이스의 테이블에 자동으로 영속화 해주는 기술이다.
  • 객체는 객체대로 설계하고 관계형 데이터베이스는 관계형 데이터베이스대로 설계한다
  • ORM프레임워크가 중간에서 매핑해준다
  • ORM은 객체와 RDB 두 기둥 위에 있는 기술이다.

JPA(Java Persistent API)

  • JPA(Java Persistent API)는 자바의 영속성 관리와 ORM을 위한 표준 기술이다. 기존 EJB ORM이던 Entity Bean을 JPA라 바꿔 체계화한 기술이다.
  • ORM(Object Relational Mapping) 이란 RDB 테이블을 객체지향적으로 사용하기 위한 기술이다. 즉, 객체와 RDB의 테이블을 매핑하여 자바 프로그램 코드 상에서 RDB를 객체지향적으로 쓸 수 있게 고려한 기술이라고 생각하면 쉽다.
  • 이 JPA를 Spring에서 쓸수 있도록 한 것이 Spring Data JPA 이다.

JDBC 대신 도메인 모델을 사용하려는 이유는?

  • 객체 지향 프로그래밍의 장점을 활용하기 좋음
  • 코드 재사용
  • 각종 디자인 패턴
  • 비즈니스 로직 구현 및 테스트가 편함

ORM의 장점

  • 객체 지향적으로 데이터를 관리하기 때문에 비즈니스 로직에 집중할 수 있고, 객체지향 개발이 가능하다
  • 유지보수성
  • 벤더 독립성

ORM의 단점

  • 학습 비용이 많다. 어렵다.
  • 제대로 사용하지 않으면 성능 이슈가 발생하고 데이터 손실이 발생할 수 있다.

| JPA의 동작과정

  • JPA는 애플리케이션과 JDBC 사이에서 동작한다.
  • 개발자가 JPA를 사용하면 JPA내부에서 JDBC API를 사용하여 SQL을 호출하여 DB와 통신한다.
  • 개발자가 직접 JDBC API를 쓰는 것이 아니다.

저장과정

조회과정

  • JPA
    • 1)엔티티의 매핑 정보를 바탕으로 적절한 SELECT SQL을 생성
    • 2) JDBC API를 사용하여 SQL을 DB에 날린다.
    • 3) DB로부터 결과를 받는다.
    • 4) 결과를 객체에 모두 매핑한다.
  • 쿼리를 JPA가 만들어 주기 때문에 Object와 RDB간의 패러다임 불일치를 해결 할 수 있다.

JPA를 왜 사용하는가?

  1. SQL중심적인 개발에서 객체 중심으로 개발
  2. 생산성
    • JPA를 사용하는 것은 마치 Java Collection에서 데이터를 넣었다 빼는 것 처럼 사용할 수 있게 만든 것이다.
    • 간단한 CRUD
      • 저장 : jpa.persis(member)
      • 조회 : Member member - jpa.find(memberId)
      • 수정 : member.setName("변경내용")
      • 삭제 : jpa.remove(member)
      • 객체를 변경하면 그냥 알아서 DB에 UPDATE Query가 나간다.
  3. 유지보수
    • 기존 : 필드 변경 시 모든 SQL을 수정
    • JPA ; 필드만 추가하면 된다. 즉, SQL을 건들 것이 없다
  4. Object와 RDB 간의 패러다임 불일치 해결 [https://gmlwjd9405.github.io/2019/08/04/what-is-jpa.html]
  5. hibernate.dialect 속성 지정을 통해 다양한 데이터베이스 방언을 제공한다.
  • JPA는 데이터베이스에 종속적이지 않다. (데이터베이스 마다 SQL문법이 조금씩 다른데 JPA에서는 알아서 변한해 준다.)
  1. 성능
  • JPA는 애플리케이션과 데이터베이스 사이에서 작동한다. 이렇게 사이에 계층이 하나 더 있으면 최적화 관점에서 시도해 볼 수 있는 것들이 많다
    String memberId = "hello"
    Member member1 = jpa.find(memberId);
    Member member2 = jpa.find(memberId);
  • 이 소스를 JDBC API를 사용했다면 데이터베이스와 두 번 통신했을 것이다.
  • 근데 JPA를 사용하면 SELECT SQL을 한 번만 데이터베이스에 전달하고 두 번째는 재사용한다.

단점

  • JPA는 통계처리와 같이 복잡한 쿼리보다는 실시간 처리용 쿼리에 더 최적화되어 있다. 물론 Native Query를 사용할 수 있지만 미세하게 쿼리 작업을 필요하다면 Mybatis와 같은 Mapper 방식을 사용하는 것이 더 효율적일 수 있다.
  • 학습에 어려움이 있고 시간이 걸린다.

댓글

Designed by JB FACTORY