////
Search

2. 패러다임 불일치

태그
생성 일시
2023/04/04 14:39

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을 조회한다면 ITEMALBUM테이블을 조인해 결과로 ALBUM 객체를 생성해야 한다.
자바 컬렉션에 보관한다면 이런 고민없이 그냥 컬렉션에 보관하면 된다.
list.add(album); list.add(movie); Album album = list.get(albumId);
Java
복사
JPA는 상속과 관련된 패러다임 불일치 문제를 개발자 대신 해결해준다.
개발자는 마치 자바 컬렉션에 객체를 저장하듯 JPA에게 객체를 저장하면 된다.
jpa.persist(album);

2. 연관관계

객체는 참조를 사용해 다른 객체와 연관관계를 가지고 참조에 접근해 연관된 객체를 조회한다.
반면 테이블은 외래 키를 사용해 테이블과 연관관계를 가지고 조인을 사용해 연관된 테이블을 조회한다.