자바 ORM 표준 JPA 프로그래밍(책),
자바 ORM 표준 JPA 프로그래밍 - 기본편(인프런강의)
을 공부하면서 정리하는 글입니다.
객체 지향 프로그래밍은 추상화, 캡슐화, 정보은닉, 상속, 다형성 등 다양한 장치들을 통해 어플리케이션의 복잡도를 낮춘다. 반면 관계형 데이터 베이스는 위 장치와 같은 개념이 없고, 테이블, 열, 행, 속성 등을 통해 데이터를 저장할 뿐이다. 이렇게 객체와 관계형 데이터 베이스는 각각 완전히 다른 목적과 장점을 지닌 패러다임을 기반으로 등장했기 때문에, 그 중간에서 개발자들은 이러한 불일치 문제를 해결하기 위해 많은 노력을 했다.
그 가운데 JPA는 이러한 창의적인 발상으로부터 등장하였다. '자바 컬렉션 예를 들어, 리스트에 값을 추가, 탐색, 삭제하는 것처럼 그렇게 쉽고 자연스럽게 데이터의 CRUD를 실행할 수 있다면 얼마나 좋을까?' 그리고 JPA는 객체지향 프로그래밍 패러다임에 기반한 엔티티 객체와 관계형 데이터 베이스의 테이블 간의 간극을 자바 컬렉션에 데이터를 저장하는 방식을 차용하여 해결했다.
이를 구체적인 문제와 해결방법을 통해 알아보자.
그렇기 때문에 Item이라는 클래스를 상속받은 Book이 있다고 했을 때, Book 객체를 저장하기 위해서는 Item 과 Book 테이블 각각에 해당 인스턴스를 저장해야 한다. 즉 개발자 입장에서는 두 줄의 코드를 작성해야 하는 것이다.
JPA의 문제해결방식 : 아래 코드 참고
jpa.persist(book);
→ INSERT INTO BOOK
, INSERT INTO ITEM
jpa.find(Book.class, book.getId);
→ SELECT I.*, B.* FROM ITEM I JOIN BOOK B ON I.ITEM_ID = B.ITEM_ID
하지만 테이블은 외래키를 통해 다른 테이블과 연관관계를 가지고 조인을 사용해서 연관된 테이블을 조회한다. 그래서 동작하는 방식이 완전히 다른 것이, 외래키만 있으면 'on Foreign key' SQL 문을 추가해서 다른 테이블 조회가 가능하지만 객체는 참조가 있는 방향으로만 참조가 가능하고 그 반대는 불가능하다.(양방향 매핑은 결국 2개의 단방향 매핑이다. 라는 말과 관련이 있다.)
JPA의 문제해결방식 : 연관관계 매핑 후 해당 객체를 영속화
객체를 테이블이 데이터를 저장하는 방식에 맞추어 외래키처럼 특정 값 필드만 가지도록 설계를 해두면, 연관된 객체를 찾을 수가 없어 객체 지향의 특징을 완전히 잃게 된다.
JPA의 문제해결방식 : 객체 그래프 탐색
객체와 RDB는 처음부터 그 탄생 이유가 다르다. 하지만 JPA를 쓰면 그 간극을 메워줄 수 있다. 개발자로 하여금 SQL문을 반복적으로 작성하는 단순 노동이 아니라 그 시간에 설계, 테스트 코드 작성, 더 나은 코드 작성을 위한 고민을 할 수 있게 해준 JPA에 감사하며 JPA 숙련도를 높여 나가자.