요즘 시대는 객체를 관계형 DB에 관리하며 애플리케이션 개발 시 객체지향의 프로그래밍 언어(Java)를 많이 씀.
여기서 관계형 DB란?
- 에드가 코드 박사가 제안
- 수학의 집합이론에 근거
- Oracle, MySql, Sql Lite등의 DBMS
- 데이터베이스의 논리적 구조가 2차원 테이블
1. 상속
이와 같이 테이블이 상속관계에 있다고 가정!
list.add(album);
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 ...
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