본문 바로가기
Spring

JPA란?

by 리승우 2022. 10. 5.

https://velog.io/@adam2/JPA%EB%8A%94-%EB%8F%84%EB%8D%B0%EC%B2%B4-%EB%AD%98%EA%B9%8C-orm-%EC%98%81%EC%86%8D%EC%84%B1-hibernate-spring-data-jpa

참조사이트

 

JPA는 도대체 뭘까? (orm, 영속성, hibernate, spring-data-jpa)

JPA는 도대체 무엇일까요? orm, jdbc, 영속성, hibernate, ... 관련 지식까지 모두 파해쳐봅니다.

velog.io

 

🌱 JPA

  JPA는 Java Persistence API의 약자로, 자바 ORM 기술에 대한 API 표준 명세이다. 즉, 인터페이스의 모음이다. 이러한 JPA 인터페이스를 구현한 대표적인 프레임워크가 하이버네이트(Hibernate)이다.JPA는 애플리케이션과 JDBC 사이에서 동작한다. 개발자가 JPA를 사용하면, JPA 내부에서 JDBC API를 사용하여 SQL을 호출하여 DB와 통신한다. 즉, 개발자가 직접 JDBC API를 쓸 필요가 없다.

 

🌱 Hibernate

 JPA를 구현한 프레임워크 중 사실상 표준이다. 오픈소스 소프트웨어이다. 여기서 주목해야할 점은 JPA 기술 스펙이고 하이버네이트는  기능을 구현하여 공급해주는 역할이다.

 

🌱 Spring Data JPA

 Spring framework에서 JPA를 편리하게 사용할 수 있도록 지원하는 프로젝트(모듈)이다. Spring Data JPA의 목적은 JPA를 사용할 때 필수적으로 생성해야하나, 예상가능하고 반복적인 코드들을 대신 작성해줘서 코드를 줄여주는 것이다. 이는 JPA를 한 단계 추상화시킨 Repository라는 인터페이스를 제공함으로써 이루어진다.

 Spring Data JPA는 JPA Provider이 아니다. 단지 데이터 계층 접근하기 위해 필요한 뻔한 코드들의 사용을 줄여주도록 하는 인터페이스이다. 여기서 반드시 기억해야할 점은 Spring Data JPA 항상 하이버네이트와 같은 JPA provider 필요하다는 것이다.

 

🌱 Spring Data JPA 예제 코드

* Entity 생성

@Entity
public class Product extends Timestamped {
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Id
    private Long id;
    private Long userId;
    private String title;
    private String image;
    private String link;
    private int lprice;
    private int myprice;
}

* Spring Data JPA) Repository 생성

public interface ProductRepository extends JpaRepository<Product, Long> {
}

 

* Spring Data JPA) Repository 기본 제공 기능

// 1. 상품 생성
Product product = new Product(...);
productRepository.save(product);

// 2. 상품 전체 조회
List<Product> products = productRepository.findAll();

// 3. 상품 전체 개수 조회
long count = productRepository.count();

// 4. 상품 삭제
productRepository.delete(product);

 

* Spring Data JPA) 추가기능은 interface 만 선언해 주면, 구현은 Spring Data JPA 가 대신한다.

public interface ProductRepository extends JpaRepository<Product, Long> {
  // (1) 회원 ID 로 등록된 상품들 조회
  List<Product> findAllByUserId(Long userId);

  // (2) 상품명이 title 인 관심상품 1개 조회
  Product findByTitle(String title);

  // (3) 상품명에 word 가 포함된 모든 상품들 조회
  List<Product> findAllByTitleContaining(String word);

  // (4) 최저가가 fromPrice ~ toPrice 인 모든 상품들을 조회
  List<Product> findAllByLpriceBetween(int fromPrice, int toPrice);
}

 

🙀JPA 동작 과정


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

insert


MemberDAO에서 객체를 저장하고 싶을 때 개발자는 JPA에 Member 객체를 넘긴다.

JPA는

  1. Member 엔티티를 분석한다.
  2. INSERT SQL을 생성한다.
  3. JDBC API를 사용하여 SQL을 DB에 날린다.

find


개발자는 member의 pk 값을 JPA에 넘긴다.

JPA는

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

JPA 특징

  1. 데이터를 객체지향적으로 관리할 수 있기 때문에 개발자는 비즈니스 로직에 집중할 수 있고 객체지향 개발이 가능하다.
  2. 자바 객체와 DB 테이블 사이의 매핑 설정을 통해 SQL을 생성한다.
  3. 객체를 통해 쿼리를 작성할 수 있는 JPQL(Java Persistence Query Language)를 지원
  4. JPA는 성능 향상을 위해 지연 로딩이나 즉시 로딩과 같은 몇가지 기법을 제공하는데 이것을 잘 활용하면 SQL을 직접 사용하는 것과 유사한 성능을 얻을 수 있다.

🔑JPA를 왜 사용해야 할까

  1. sql 중심적인 개발에서 객체 중심적인 개발이 가능하다.Object -> [SQL 변환] -> RDB에 저장
    [개발자 == SQL 매퍼] 라고 할만큼 SQL 작업을 너무 많이 하고 있다.
  2. sql 코드의 반복, 객체지향과 관계지향 데이터베이스의 페러다임 불일치
  3. 생산성이 증가
  4. 간단한 메소드로 CRUD가 가능하다
  5. 유지보수가 쉽다
    기존: 필드 변경 시 모든 SQL을 수정해야 한다.
    JPA: 필드만 추가하면 된다. SQL은 JPA가 처리하기 때문에 손댈 것이 없다.
  6. Object와 RDB 간의 패러다임 불일치 해결

 

🤔ORM이 뭐죠? SQL Mapper와 ORM

ORM 이란 Object-Relational Mapping 의 약자로, 이름 그대로 객체(Object)와 관계형 데이터(Relational data) 를 매핑하기 위한 기술이다. 이러한 매핑이 필요한 이유는 객체 지향 언어과 관계형 데이터베이스사이의 패러다임 불일치가 있기때문이다.  이 둘 간의 패러다임 불일치 때문에 개발자는 더 많은 코드를 작성해야 하며, 이는 반복적이고 실수하기 쉬운 작업이 된다. 그렇기 때문에 개발자는 객체지향적인 설계에 집중할 수 없게 된다. ORM이 바로 이러한 문제를 해결해 준다. 

 

  • ORM은 DB 테이블을 자바 객체로 매핑함으로써 객체간의 관계를 바탕으로 SQL을 자동으로 생성하지만 Mapper는 SQL을 명시해주어야 한다.
  • ORM은 RDB의 관계를 Object에 반영하는 것이 목적이라면, Mapper는 단순히 필드를 매핑시키는 것이 목적이라는 점에서 지향점의 차이가 있다.

SQL Mapper

  • SQL ←mapping→ Object 필드
  • SQL 문으로 직접 디비를 조작한다.
  • Mybatis, jdbcTemplate

ORM(Object-Relation Mapping/객체-관계 매핑)

  • DB 데이터 ←mapping→ Object 필드
    • 객체를 통해 간접적으로 디비 데이터를 다룬다.
  • 객체와 디비의 데이터를 자동으로 매핑해준다.
    • SQL 쿼리가 아니라 메서드로 데이터를 조작할 수 있다.
    • 객체간 관계를 바탕으로 sql을 자동으로 생성한다
  • Persistant API라고 할 수 있다.
  • JPA, Hibernate

'Spring' 카테고리의 다른 글

restAPI의 PUT / PATCH 차이점  (0) 2022.10.06
Spring Controller / Service / Repository란?  (0) 2022.10.05
getter / setter 사용이유  (0) 2022.08.15
앞으로 할 것들  (0) 2022.08.14
스프링 웹 개발 기초 (개발방식 3가지 part2)  (0) 2022.08.14

댓글