Programming/Java

[JPA] 패러다임 불일치 - 우린 달라 달라

seandoesdev 2024. 2. 19. 00:12

자바는 객체지향 언어로 객체 중심적으로 개발하며, 데이터베이스는 데이터를 저장하기 위해 질의어인 SQL을 사용하여 테이블 형태로 데이터를 관리한다. 객체와 테이블은 듣기만 해도 서로 다른 느낌이 들지만 구체적으로 어떤 부분에서 차이가 나는지 설명을 못한다. 그래서 이번에는 이 두 사이의 패러다임 불일치에 대해 이야기하고 JPA를 왜 사용해야 하는지까지 정리해보고자 한다.

 

패러다임 불일치 - JPA에게 맡기자

▶️ 상속

Item 객체를 상속받는 Album, Movie, Book 객체를 도식화해서 관계를 나타내보았다.

 

 

데이터베이스에서도 Table 슈퍼타입 서브타입 관계로 테이블을 설계할 수 있다. 하지만 이는 객체 상속과 유사한 형태일 뿐이지 같다고 할 수 없다. ITEM은 DTYPE을 통해 앨범과 영화, 책과의 테이블 관계를 맺는다.

 

도식화한 객체를 코드로 옮겨보자.

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

 

JDBC API나 MyBatis로 Movie 데이터를 저장하려면, 아래와 같이 작성해줘야 한다.

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

부모 객체와 자식 객체에 대해 따로 작업을 해줘야 하는 번거로움이 있다. INSERT 외에도 조회, 삭제, 수정에서도 똑같은 일이 벌어진다.

 

JPA를 사용한다면..?

삽입을 예로 든다면 JPA에서는 persist() 메소드를 활용한다.

jpa.persist(moive);

persist() 메소드로 객체를 저장하는데, 알아서 JPA가 아래 두 쿼리를 생성해 두 테이블에 데이터를 저장한다.

persist는 정확한 용도는 따로 있지만, 우선은 데이터를 저장한다고만 알고 나중에 기록하겠다.

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

 

▶️ 연관관계

객체는 참조를 통해 다른 관계와의 연관관계를 갖고, 참조로 객체에 접근해서 조회한다. 반면, 테이블은 외래 키를 사용해 다른 테이블과 연관관계를 갖고, 조인으로 연관된 테이블을 조회한다.

 

객체 연관관계에서 Member는 팀의 정보를 얻기 위해 member.getTeam()으로 참조가 가능하다. 테이블은 Member 테이블에 TEAM_ID(FK)로 조인해서 TEAM을 조회할 수 있다. 문제는 이 반대는 객체에서 성립하지 않는다.
Team에서 Member 객체를 참조할 수 없다. 하지만 TEAM 테이블은 MEMBER 테이블을 조인으로 참조가 가능하다.