[JPA] SQL 중심적인 개발의 문제점

19·2022년 9월 5일
0

JPA

목록 보기
1/18
post-custom-banner

객체를 관계형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 프로그래밍 - 기본편 - 김영한

profile
하나씩 차근차근
post-custom-banner

0개의 댓글