객체와 RDBMS의 패러다임 불일치

옹심이·2024년 12월 12일
0

시작하며

데이터베이스를 객체답게 모델링하려고 할 수 록 매핑 작업이 늘어나서 번거로워진다.
어떤 점에서 개발에 번거로움이 생기는지에 대해 다룰 것이다.
JPA가 다 해결해주겠죠?

상속

데이터베이스 테이블에는 상속 관계가 존재하지 않는다. 대신 슈퍼타입과 서브타입 관계를 사용할 수 있다.

앨범 객체를 DB에 저장하고자 한다면 ITEM 테이블과 ALBUM테이블에 매핑되는 정보를 각각 INSERT해야하기 때문에 앨범 객체에서 두 테이블의 정보에 해당하는 속성을 추출해야한다.

앨범 객체를 DB에서 조회하고자 한다면, ALBUM 테이블과 ITEM 테이블을 조인 후 각각의 객체를 생성해야하는 복잡한 과정을 거친다.

만약 무비 객체를 조회하고자 한다면, MOVIE 테이블과 ITEM 테이블에 대해서도 같은 과정을 거쳐야 하기 때문에 너무 복잡해진다.

그런데 자바 컬렉션에 조회한다면?

Album album = list.get(albumId)

코드 한 줄로 실행할 수 있다.

연관 관계

객체는 참조를 사용하지만 테이블은 외래키를 사용하기 때문에 조인 해야하는 번거로움이 있다.

객체 답게 모델링을 하게 되면 INSERT하기 아주 어렵다 MEMBER 클래스에는 TEAM에 대한 참조만 존재할 뿐 TEAM의 ID가 없기 때문이다.

또한 조회의 경우, memberId에 해당하는 MEMBER를 조회하여 객체화 시키기 위해서는 MEMBER와 TEAM 테이블을 조인한 후 Member객체와 Team객체에 조인한 정보를 매핑하여 입력해주고 Member 객체에서 setter를 통해 team을 등록해줘야한다.

그런데 자바 컬렉션으로 관리한다면?

list.add(member);
Member member = list.get(memberId);
Team team = member.gerTeam();

이렇게 간단하게 처리할 수 있다.

객체 그래프 탐색

객체는 참조를 통해 자유롭게 객체의 그래프를 탐색할 수 있어야한다.

하지만 위처럼 처음 실행하는 SQL에 따라서 객체의 탐색 범위가 결정된다.

예를 들면 MEMBER테이블과 TEAM테이블을 조인을 한 결과에 대해서는 ORDER에 대한 데이터는 접근을 할 수 없다.

이런 경우는 엔티티에 대한 신뢰 문제가 발생한다.

member 는 memberDAO가 알려주는 Member 객체이다. 그렇기 때문에 memberDAO에서 어떤 쿼리를 실행했는지에 따라서 결과가 달라지므로 이에 대해 신뢰 문제가 발생할 수 있다.

비교하기

DAO를 통해 테이블에서 100번 id에 해당하는 MEMBER의 데이터를 추출한 후 새로운 Member 객체를 생성하는 경우 비교 연산자를 실행 했을 때 다를 수 밖에 없다.

하지만 자바 컬렉션에서 조회하는 경우에는 같은 인스턴스이기 때문에 비교 연산자 실행 결과는 TRUE이다.

0개의 댓글