computer_study

[JPA] 01. JPA 소개 본문

스터디/자바 ORM표준 JPA 프로그래밍

[JPA] 01. JPA 소개

knowable 2022. 6. 18. 02:27

1. SQL을 직접 다룰 때 발생하는 문제점

JDBC API와 SQL

반복이 많아진다

개발자는 SQL을 직접 다룬다면 아래 과정을 계속 반복해야 한다.

(데이터베이스는 객체 구조와 다른 구조를 가지므로 객체를 DB에 직접 조회나 저장을 할 수 없어 SQL과 JDBC API를 사용하여 변환 작업을 직접 해주어야 한다.)

1. SQL 작성

2. JDBC API 사용해서 실행

3. 결과 매핑

 

이렇게 되면 너무 많은 SQL과 JDBC API들을 코드로 작성해야 한다.

 

SQL에 의존적인 개발을 하게 된다.

  • 진정한 의미의 계층 분할이 어렵다.(SQL과 JDBC API를 접근 계층에 숨겨도, 수정 시 결국 DAO까지 다 까봐야 된다.)
  • 엔티티를 신뢰할 수 없다.(SQL에 너무 의존하면 사용하기 꺼려진다.)
  • SQL에 의존적인 개발을 피하기 어렵다. (필드 하나 추가하더라도 DAO의 CRUD 코드와 SQL 대부분을 변경해야 한다.)

JPA와 문제 해결

JPA를 사용하면 개발자가 SQL을 작성하지 않고 JPA가 제공하는 API를 사용한다.

JPA는 연관된 객체를 사용하는 시점에 적절한 SQL을 실행한다.

 

2. 패러다임의 불일치

객체 지향 언어와 관계형DB는 서로 지향하는 목적이 다르다.(관계형 DB는 데이터 중심으로 구조화(집합적 사고) / 객체지향은 추상화, 상속 다형성으로 사고)


상속

테이블은 상속의 기능이 없다.

DB 모델링을 통해 비슷하게 테이블 설계를 하더라도, 객체를 저장하려면 참조하고 있는 객체까지 함께 저장하도록 SQL을 작성해야한다. -> 코드 량이 많아진다.

조회 시에도 두 테이블을 조인한 후 객체를 생성해야 되는 경우가 생긴다.

 

JPA를 사용하면 객체를 저장하듯 JPA에 객체를 저장할 수 있다.

jpa.persist(album); 
// album이 item을 상속하고있다면 알아서 album, Item 테이블에 나누어 저장

Album album = jpa.find(Album.class, "id001");
// 조회도 간단

 

연관관계

참조를 사용하는 객체와, 외래키를 사용하는 관계형 DB는 패러다임이 많이 다르다.

  • 객체를 테이블에 맞추어 모델링
class Member{
    String id;
    Long teamId; // TEAM_ID FK 컬럼
    String username;
}

class Team{
    Long id; // TEAM_ID PK 컬럼
    String name;
}
// 각 요소가 column
// 저장하거나 조회 시 편리
// Team team = member.getTeam(); 처럼 참조를 통해 객체를 찾을 수 없다.
// 좋은 객체 모델링 기대 어렵
  • 객체지향 모델링
class Member{
    String id;
    Team team; // 참조로 연관관계
    String username;
    
    Tean getTeam(){
        return team;
    }
}

class Team{
    Long id;
    String name;
}
// Team team = member.getTeam(); 과 같이 회원과 연관된 팀 조회 가능
// 테이블은 외래키만, 객체 모델은 참조만 필요하기 때문에 저장 및 조회가 쉽지 않다.
// 저장, 조회를 위한 추가적인 비용을 소모해야 한다.
  • JPA와 연관관계
member.setTeam(team) // 회원과 팀 연관관계 설정
jpa.persist(member) // 회원과 연관관계 함께 저장
// 관계 설정 후 저장만 하면 된다.
// (참조를 외래키로, 외래키를 참조로 변환하는 것을 JPA가 다 해준다.)

 

객체 그래프 탐색

객체지향이라면 객체 그래프를 제약 없이 탐색할 수 있어야 한다.

SQL을 직접 다룬다면 처음 시작하는 SQL에 따라 어디까지 탐색할 수 있는지 정해진다.

 

JPA를 사용하면 적절한 SQL을 실행하기에 연관된 객체를 신뢰하고 조회할 수 있다.

(실제 객체를 사용하는 시점까지 데이터베이스 조회를 미루므로 가능하다./ 요구사항 다 보고 SQL 만들어서 실행)

 

비교

DB는 기본 키 값으로 각 row를 구분

객체는 identity와 equality 방법으로 비교

 

Member member1 = memberDao.getMember(memberId);
Member member2 = memberDao.getMember(memberId);

member1 == member2;  // 다름 (서로 다른 인스턴스이기에)

//-------------------------------------------------------------

Member member1 = jpa.find(Member.class, memberId);
Member member2 = jpa.find(Member.class, memberId);

member1 == member2; // 같다

 

3. JPA란 무엇인가

애플리케이션과 JDBC사이에서 동작

ORM(Object-Relation Mapping)

  • 객체와 관계형 DB를 매핑해준다
  • 객체를 ORM 프레임워크에 저장하면 ORM 프레임워크가 적절한 SQL을 생성해서 DB에 접근
  • 다양한 패러다임의 불일치 문제들도 해결해준다.
  • 객체는 객체대로 모델링, 관계형 DB는 그에 맞게 모델링 하면 매핑은 JPA가 알아서 해준다.
  • 하이버네이트(오픈소스 ORM 프레임워크)를 기반으로 한 자바 ORM기술 표준이 JPA이다.

 

JPA를 사용해야 하는 이유

  • 생산성이 좋다 (CRUD용 SQL을 직접 작성 할 필요가 없다.)
  • 유지보수가 편해진다. (SQL, JDBC API 코드를 JPA가 알아서 해주므로)
  • 패러다임의 불일치를 해결할 수 있다.
  • 성능이 좋다 (두 번 조회할 것을 한번 조회 후 객체를 사용하도록 바꿔줄 수 있다.)
  • 데이터 접근 추상화와 벤더 독립성(APP과 DB 사이에 추상화된 데이터 접근 계층을 제공하기에 특정 DB기술에 종속되지 않도록 해준다. 각 환경별로 다른 DB를 사용할 수도 있다.)
  • 표준(자바 ORM표준이므로 다른 구현 기술로 쉽게 변경 가능하다.)

'스터디 > 자바 ORM표준 JPA 프로그래밍' 카테고리의 다른 글

[JPA] 05. 연관관계 매핑 기초  (0) 2022.07.25
[JPA] 04. 엔티티 매핑  (0) 2022.07.11
[JPA] 03. 영속성 관리  (0) 2022.06.29
[JPA] 02. JPA 시작  (0) 2022.06.29
[JPA] 00.스터디 개요  (0) 2022.06.18
Comments