객체를 관계형DB에 저장해서 관리하는 형태에서 객체지향적으로 개발을 해도, 결국엔 DB가 SQL만 알아듣기 때문에 SQL 중심적인 개발이 된다
문제점
무한반복, 지루한 코드
- CRUD 쿼리, 자바 객체 -> SQL, SQL -> 자바 객체
- 필드가 변경되면, 그에 맞게 관련 SQL을 전부 수정해야 한다
- 개발자가 직접 작성하기 때문에, 일부 SQL에서 변경이 누락되는 등 문제가 발생한다
객체지향과 관계형 DB의 패러다임 불일치 문제
객체지향과 관계형 DB의 사상이 다르다
관계형 DB는 데이터를 잘 정규화해서 보관하는 것이 목표
객체는 속성과 기능을 캡슐화해서 잘 쓰는것이 목표
객체를 관계형 DB에 넣으려고 해서 문제가 발생
- 객체를 DB에 저장하기 위해서는 SQL로 변환을 해야 한다.
- 개발자가 SQL 작성에 거의 모든 시간을 쏟아야 하는 문제점이 있다..
- 객체를 관계형 DB에서 넣고 뺄 때, SQL 매핑작업을 개발자가 해주어야 한다
객체와 관계형 DB의 차이
객체와 관계형 DB간 차이가 있다.
EX) 객체에서 상속이 있는데, 관계형 DB에선 없다. 그럼 이를 어떻게 DB에 저장할 것인지?
- 상속
- 객체는 상속이 있지만 테이블은 상속이 없다. 그나마 유사한 슈퍼타입-서브타입이 존재
- JDBC에서 상속 객체를 저장하기 위해서는 부모 객체용 INSERT와 자식 객체용 INSERT를 따로 작성해야 하고, 조회도 JOIN을 통해 결과를 얻어 객체를 생성하는 모든 코드를 작성해야 한다는 불편함이 존재한다.
- 연관관계
- 객체는 참조를 통해 연관관계를 가지고 참조에 접근해 연관된 객체를 조회
- 참조가 있는 방향으로만의 참조가 가능(단방향)
- 테이블은 외래키를 사용해 다른 테이블과 연관관계를 가지고 조인을 통해 테이블을 조회
- 객체 그래프 탐색
- 객체는 자유롭게 객체 그래프를 탐색할 수 있어야 하지만 SQL을 이용해 조회를 했다면 실행된 처음 SQL에 따라 탐색의 범위가 저장되기 때문에 제약이 발생한다.
- 따라서 개발자는 어디까지 탐색이 가능한지 모르게 되고, DAO를 통해 실행된 SQL을 직접 확인해야만 탐색이 가능하다.
- 데이터 비교
- 데이터베이스는 기본키의 값으로 구분하지만 객체는 동일성 비교(==)와 동등성 비교(equals())의 두가지 방법이 존재한다.
- SQL을 통해 기본키가 같은 객체를 불러와 매핑하면 동일성을 비교할 때 false가 반환된다. 같은 로우지만 객체로 볼 때 다른 인스턴스이기 때문이다.
객체답게 모델링 할수록 SQL 매핑 작업만 늘어나는 문제가 발생한다.
그래서 객체를 자바 컬렉션에 저장하듯이 DB에 저장하는 방법을 탐구
-> JPA
참고
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 김영한