JPA 탄생 배경-1

Sungjin·2021년 6월 25일
0

JPA

목록 보기
1/10
post-thumbnail

요즘 시대는 객체를 관계형 DB에 관리하며 애플리케이션 개발 시 객체지향의 프로그래밍 언어(Java)를 많이 씀.

여기서 관계형 DB란?

  • 에드가 코드 박사가 제안
  • 수학의 집합이론에 근거
  • Oracle, MySql, Sql Lite등의 DBMS
  • 데이터베이스의 논리적 구조가 2차원 테이블

SQL 중심적인 개발의 문제점

  • 무한 반복, 지루한 코드 (흔히 불리는 CRUD)
  • SQL에 의존적으로 프로그래밍을 할 수 밖에 없음
    이는 객체 지향 프로그래밍을 할 시에 객체 지향의 특징인 추상화,캡슐화, 정보은닉, 상속, 다형성 등을 충분히 활용 못할 수 있음.
    관계형 데이터베이스를 사용하는 것이 현실적인 대안이 될 수 있음
    • 어떻게?
      객체를 SQL로 변환 후 관계형 데이터 베이스에 저장을 하는 것

객체와 관계형 데이터베이스의 차이

1. 상속

이와 같이 테이블이 상속관계에 있다고 가정!

  • Album에 데이터를 저장하기 위해서는
    1. 객체 분해
    2. Item 테이블에 관하여 Insert
    3. Album 테이블에 관하여 Insert
  • Album 조회
    1. 각각의 테이블에 Join Sql
    2. 각각의 객체를 생성
    3. 각각의 객체에 대하여 select문..
    • 엄청나게 복잡..
      관계형 DB에 상속관계 쓰지말자..
  • 만일 Table이 아니라 그냥 Java 컬렉션에서의 상속 관계라면?
    생각해보면 이런 식으로만 해도 될 것이다.
    • Java 컬렉션에 저장
      list.add(album);
    • Java 컬렉션에서 조회
      Album album=list.get(albumId);
      //혹은 다형성도 활용 가능
      Item item=list.get(albumId);

2. 연관관계

  • 객체는 참조를 사용
  • 테이블은 외래키를 사용
class Book{
    Long book_id; //PK
    Long item_id; //book_id FK컬럼을 위해
    String isbn;
}

이를 맞춰 테이블에 객체를 저장 하려면

INSERT INTO Book(book_id,item_id,price) VALUES ...

좀 더 객체다운 모델링을 해보자

class Book{
    Long Book_id; //PK
    Item item; //참조로 연관관계
    String isbn;
    
    //Getter
    Item getItem(){
    	return item;
    }
}

이를 맞춰 테이블에 객체를 저장 하려면

Book.getItem().getId(); //이를 활용하여 Item_id를 추출!
INSERT INTO Book(book_id,item_id,price) VALUES ...
  • 객체 모델링을 조회
    일단 SQL문으로 조회를 해오는 작업이 필요
SELECT B.*,I.* FROM Book B join Item I ON B.item_id=I.item_id 
public Book find(String book_id){
	//sql 문 실행
    Book book=new Book();
    //데이터베이스에서 조회한 책 관련 정보 모두 입력
    Item item=new Item();
    //데이터베이스에서 조회한 상품 관련 정보 모두 입력
    
    book.setItem(item);
    return book;
}

But, 이를 통하여 문제점을 볼 수 있습니다. 위의 코드를 보시면 Book 객체와 Item 객체를 조회한 후 Book 객체에다 따로 Item객체를 set해주고 있습니다. 복잡한거죠..
즉!

//SQL 문 실행 후 Book 객체만 생성시
Book book=bookDAO.find(book_id);
book.getItem(); //이와 같은 일이 불가!

book.getItem과 같은 일이 불가능하다는 결과가 나옵니다
또한!

//SQL문에서 조회
Book book1=bookDAO.getBook(100);
Book book2=bookDAO.getBook(100);
book1!=book2 
//물론 내용은 같은 데이터를 가져 오겠지만 Java내에서 객체를 또 처리하기 때문에 다름!

//Java 컬렉션에서 조회
Book book1=list.get(100);
Book book2=list.get(100);
book1==book2 //같다!

SQL문으로 데이터를 조회하는 것과 Java 컬렉션에서 조회하는 것과 미스매치!

이렇게 객체답게 모델링을 할 수록 처리해야하는 일이 더 많아지는 것을 보셨습니다..
이런 고민이 생기죠.. '객체를 자바에서 저장 하듯이 DB에도 저장하지 못하려나??'
이제 JPA - Java Persistence API가 등장할 시간입니다~!

이상으로 포스팅을 마치겠습니다. 감사합니다 :)

이 글은 인프런 김영한님의 '자바 ORM 표준 JPA 프로그래밍 - 기본편'을 수강하고 작성합니다.
출처:https://www.inflearn.com/course/ORM-JPA-Basic

profile
WEB STUDY & etc.. HELLO!

0개의 댓글