오늘은 JPA를 본격적으로 공부하기전에 관계형 데이터베이스의 문제점에 대해서 알아보겠습니다.
관계형 데이터베이스의 문제점
현재 시점을 기준으로 우리는 객체지향 프로그래밍을 하고 이 객체를 관계형 데이터베이스에서 관리하고 있습니다. 데이터베이스를 제어하기 위해서 우리는 SQL문을 사용합니다. 이 SQL 중심적인 개발의 문제점은 개발자가 CRUD라고 불리는 INSERT, UPDATE, SELECT, DELETE를 작성해서 객체를 관계형 데이터베이스에 넣어주는 작업을 한다는 것입니다. 즉, 자바 객체를 SQL로 SQL을 다시 자바 객체로 변환하는 작업을 해주는 것이죠. 이 작업은 사실상 반복적인 작업이고 지루한 작업입니다.
또한 객체와 관계형 데이터베이스의 패러다임의 불일치가 가장 큰 문제입니다. 관계형 데이터베이스가 나온 사상과 객체지향이 나온 사상이 다릅니다. 관계형 데이터베이스가 나온 사상은 데이터를 정규화해서 잘 보관하는게 목표입니다.
객체를 보관하는 다양한 저장 방법이 있지만 아직은 RDB가 주를 이룬다고 할 수 있습니다.
개발자는 객체를 SQL로 변환해서 RDB에 넣어주는 SQL 매퍼의 역할을하고 있는 것입니다.
예를들어 Item을 상속 받는 Album 객체를 저장하려면 객체를 분해하여 ITEM테이블에 넣고 ALBUM 테이블에도 넣어주어야합니다. 또한 Album을 조회하려면 각각의 테이블에 따른 조인 SQL을 작성하고 각각의 객체를 생성해야하고 상상만해도 복잡합니다. 그래서 DB에 저장할 객체에는 상속관계를 쓰지 않습니다.
또한 상황에 따라 동일한 회원 조회 메서드를 여러개 생성해야합니다.
memberDao.getMember(); //Member만 조회
memberDao.getMemberWithTeam(); //Member와 Team 조회
memberDao.getMemberWithOrderWithDelivery();
결국 물리적으로는 service와 dao로 나누어져있지만 논리적으로는 강결합이 되어있기 때문에 진정한 의미의 계층분할이 어렵습니다. 결국 객체답게 모델링 할수록 매핑 작업만 늘어나게됩니다.
이러한 문제 상황속에서 객체를 자바 컬렉션에 저장하듯이 DB에 저장할 수 없을까하는 고민을 하였습니다. 그리고 나온게 바로 JPA(Java Persistence API)입니다. 자바 진영의 ORM(Object Relational Mapping) 기술 표준입니다.
자바 컬렉션에 album객체를 저장한다고 생각해보면 다음 코드 한줄이면 끝납니다.
list.add(album);
객체를 조회할때도 마찬가지입니다.
Album album = list.get(albumId);
//부모 타입으로 조회 후 다형성 활용
Item item = list.get(albumId);
RDB를 사용할 경우 객체를 테이블에 맞추어 모델링을 합니다.
Class Member{
String id;
Long teamId;
String username;
}
class Team{
Long id;
String name;
}
위의 클래스는 객체다운 모델링이 아닙니다. Member가 Team 객체를 가지고 있으면 됩니다.
Class Member{
String id;
Team team;
String userName;
Team getTeam(){
return team;
}
}
class Team{
Long id;
String name;
}
그리고 데이터베이스에 저장할때는 Team이 가지고있는 teamId를 넣어주면 됩니다.
이러한 배경속에서 자바 ORM이라는 기술이 등장하였습니다.
REFERENCE
'JPA' 카테고리의 다른 글
[JPA] 연관 관계 매핑의 종류 (0) | 2020.04.19 |
---|---|
[JPA] 연관관계 매핑 기초 (0) | 2020.04.14 |
[JPA] 기본 키 매핑 (0) | 2020.04.10 |
[JPA] 객체와 테이블 매핑 (0) | 2020.04.10 |
[JPA] 영속성 콘텍스트 (0) | 2020.04.10 |