1. 들어가며
•
애플리케이션은 발전하며 그 내부의 복잡성이 점점 커진다.
◦
복잡성을 제어하지 못하면 결국 유지보수하기 어려운 애플리케이션이 된다.
•
객체지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공한다.
•
비즈니스 요구사항을 정의한 도메인 모델도 객체로 모델링 하면 객체지향 언어가 가진 장점을 활용할 수 있다.
◦
But. 저장이 필요한 객체라면 메모리가 아닌 어딘가에 영구 보관해야한다.
◦
자바는 이런 문제를 고려해 객체를 파일로 저장하는 직렬화 기능을 지원한다.
▪
But. 보안상의 문제와 더불어 객체를 검색하기가 어렵다.
◦
현실적인 대안은 RDB를 사용하는 것이지만 이는 앞서 이야기한 객체지향적인 개념이 존재하지 않는다.
•
객체지향과 RDB간의 패러다임 불일치를 개발자가 중간에서 해결해야 한다.
2. 상속
객체의 상속 모델
RDB의 슈퍼타입과 서브타입 모델
abstract class Item {
Long id;
String name;
int price;
}
class Album extends Item {
String artist;
}
class Movie extends Item {
String director;
String actor;
}
class Book extends Item {
String author;
String isbn;
}
Java
복사
객체 모델 코드
•
객체는 상속이라는 기능을 가지고 있지만 테이블은 상속이라는 기능이 없다.
◦
그나마 유사한 모델링은 슈퍼타입과 서브타입 관계라고 말할 수 있다.
•
ITEM 테이블의 DTYPE 컬럼을 사용해 어떤 자식 테이블과 관계가 있는지 정의 했다.
•
JDBC API를 사용해 해당 코드를 완성하려면 ITEM용 INSERT SQL을 작성하고 자식 데이터만 커내 ALBUM용 INSERT SQL을 작성해야 하는데 작성해야 하는 코드량이 만만치 않다.
◦
물론 조회도 쉬운일이 아닌것이 ALBUM을 조회한다면 ITEM과 ALBUM테이블을 조인해 결과로 ALBUM 객체를 생성해야 한다.
•
자바 컬렉션에 보관한다면 이런 고민없이 그냥 컬렉션에 보관하면 된다.
list.add(album);
list.add(movie);
Album album = list.get(albumId);
Java
복사
•
JPA는 상속과 관련된 패러다임 불일치 문제를 개발자 대신 해결해준다.
◦
개발자는 마치 자바 컬렉션에 객체를 저장하듯 JPA에게 객체를 저장하면 된다.
◦
jpa.persist(album);
2. 연관관계
•
객체는 참조를 사용해 다른 객체와 연관관계를 가지고 참조에 접근해 연관된 객체를 조회한다.
◦
반면 테이블은 외래 키를 사용해 테이블과 연관관계를 가지고 조인을 사용해 연관된 테이블을 조회한다.