글 검색

공개된 글의 제목과 본문을 검색합니다.

    닫기 Esc

    1. 들어가며#

    • 애플리케이션은 발전하며 그 내부의 복잡성이 점점 커진다.
      • 복잡성을 제어하지 못하면 결국 유지보수하기 어려운 애플리케이션이 된다.
    • 객체지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 시스템의 복잡성을 제어할 수 있는 다양한 장치들을 제공한다.
    • 비즈니스 요구사항을 정의한 도메인 모델도 객체로 모델링 하면 객체지향 언어가 가진 장점을 활용할 수 있다.
      • But. 저장이 필요한 객체라면 메모리가 아닌 어딘가에 영구 보관해야한다.
      • 자바는 이런 문제를 고려해 객체를 파일로 저장하는 직렬화 기능을 지원한다.
        • But. 보안상의 문제와 더불어 객체를 검색하기가 어렵다.
      • 현실적인 대안은 RDB를 사용하는 것이지만 이는 앞서 이야기한 객체지향적인 개념이 존재하지 않는다.
    • 객체지향과 RDB간의 패러다임 불일치를 개발자가 중간에서 해결해야 한다.

    2. 상속#

    객체의 상속 모델
    객체의 상속 모델
    RDB의 슈퍼타입과 서브타입 모델
    RDB의 슈퍼타입과 서브타입 모델
    java
    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;
    }
    객체 모델 코드
    • 객체는 상속이라는 기능을 가지고 있지만 테이블은 상속이라는 기능이 없다.
      • 그나마 유사한 모델링은 슈퍼타입과 서브타입 관계라고 말할 수 있다.
    • ITEM 테이블의 DTYPE 컬럼을 사용해 어떤 자식 테이블과 관계가 있는지 정의 했다.
    • JDBC API를 사용해 해당 코드를 완성하려면 ITEM용 INSERT SQL을 작성하고 자식 데이터만 커내 ALBUM용 INSERT SQL을 작성해야 하는데 작성해야 하는 코드량이 만만치 않다.
      • 물론 조회도 쉬운일이 아닌것이 ALBUM을 조회한다면 ITEM과 ALBUM테이블을 조인해 결과로 ALBUM 객체를 생성해야 한다.
    • 자바 컬렉션에 보관한다면 이런 고민없이 그냥 컬렉션에 보관하면 된다.
      java
      list.add(album);
      list.add(movie);
      
      Album album = list.get(albumId);
    • JPA는 상속과 관련된 패러다임 불일치 문제를 개발자 대신 해결해준다.
      • 개발자는 마치 자바 컬렉션에 객체를 저장하듯 JPA에게 객체를 저장하면 된다.
      • jpa.persist(album);

    2. 연관관계#

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