[JPA] 패러다임의 불일치

1

JPA

목록 보기
2/16
post-thumbnail

객체와 관계형 데이터베이스

객체지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 위에서 말한 복잡성을 제어할 수 있는 다양한 장치들을 제공한다. 하지만 문제는 이렇게 무언가를 저장할 때 발생한다. 어떠한 객체를 저장하려면 단순히 메모리가 아닌 어딘가에 영구적으로 보관해야 한다.

객체는 속성(field), 기능(method)을 가진다. 이렇게 객체지향에서는 추상화, 상속, 다형성같은 개념이 있지만 데이터베이스에서는 추상화, 상속, 다형성같은 개념들이 없기 때문에 서로가 지향하는 목적이 다르므로 둘의 기능과 표현 방법도 다르다. 이것을 객체와 관계형 데이터베이스의 패러다임 불일치 문제라 한다.

패러다임 불일치 문제는 개발자가 중간에서 해결해야 하는데 문제는 이런 객체와 관계형 데이터베이스 사이의 패러다임 불일치 문제를 해결하는데 너무 많은 시간과 코드를 소비하는 것이다.

다음 사진으로 더 자세히 알아보자.


객체 상속 모델


출처

그림처럼 객체는 상속이라는 기능(method)를 가지고 있지만 테이블은 상속이라는 기능이 없다.


테이블 모델


출처

ITEM테이블의 DTYPE 컬럼을 사용해서 어떤 자식 테이블과 관계가 있는지 정의했다.
ex) DTYPE의 값이 MOVIE이면 영화 테이블과 관계가 있다.


이제 모델들을 코드로 구현한 것을 보자

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;
}

Album 객체를 저장하려면 이 객체를 분해해서 두 문장의 SQL을 만들어야 한다.

  • INSERT INTO ITEM ...
  • INSERT INTO ALBUM ...

Movie 객체도 마찬가지이다.

  • INSERT INTO ITEM ...
  • INSERT INTO MOVIE ...

JDBC API를 사용해서 이 코드를 완성하려면 부모 객체에서 부모 데이터만 꺼내 ITEM용 INSERT SQL을 작성하고 자식 객체에서 자식 데이터만 꺼내서 ALBUM SQL을 작성해야하므로 개발자가 직접 작성해야할 코드량이 많다. 이것은 모두 패러다임의 불일치를 해결하기 위해 개발자가 소모하는 비용이다.


JPA와 상속

JPA는 패러다임의 불일치 문제를 개발자 대신 해결해준다. 개발자는 그냥 자바 컬렉션에 객체를 저장하듯이 JPA에게 객체를 저장하면 된다.

Item을 상속한 Album 객체를 JPA를 사용하여 저장해보자.
-> 저장하기 전 JPA의 CRUD 기능을 알려주겠다.


  • 저장기능 - persist()

ex)

jpa.persist(member); //저장

  • 조회 기능 - find()

ex)

String memberId = "helloId";
Member member = jpa.find(Member.class, memberId); //조회

  • 수정 기능 - X
    놀랍게도 JPA는 별도의 수정 method를 제공하지 않는다. 대신 객체를 조회해서 값을 변경하면 트랜잭션을 커밋할 때 데이터베이스에 적절한 업데이트 SQL이 전달된다.

ex)

Member member = jpa.find(Member.class, memberId);
member.setName("이름변경"); // 수정

  • 삭제 기능 - delete()

ex)

jpa.delete(member)

위에서 설명한대로 persist() method를 사용해서 객체를 저장, 조회해보자

Album 객체 저장

jpa.persist(album);

Album 객체 조회

String albunId = "id100";
Album album = jpa.find(Album.class, albumId);

마치며 ...

애플리케이션이 발전함에 따라 내부 코드의 복잡성도 점점 커진다. 지속 가능한 애플리케이션을 개발하는 일은 끊임 없이 증가하는 복잡성과의 싸움이다. 이러한 복잡성을 제어하지 못하면 결국 유지보수하기가 쉽지 않은 애플리케이션이 된다.

0개의 댓글