Back-End/JPA

1. JPA 소개 - 패러다임의 불일치

wisdom11 2022. 3. 30. 15:29

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

  • 지향하는 목적이 서로 달라서, 둘의 기능과 표현 방법이 다르다.
  • 객체 구조를 테이블 구조에 저장하는 데는 한계가 존재한다.
  • 둘 사이의 패러다임 불일치 문제를 해결하기 위해 개발자는 많은 시간과 코드를 소비하게 된다.

 

이제, 객체와 관계형 데이터베이스 간의 패러다임의 불일치로 발생하는 문제점 4가지를 살펴보자.

 

1. 상속

문제점(차이점)

  • 객체에는 상속 개념 존재하지만, 관계형 데이터베이스에는 존재하지 않는다.
  • 객체 저장 시, 부모 객체를 위한 INSERT SQL과 자식 객체를 위한 INSERT SQL을 모두 작성해야 한다.
    INSERT INTO ITEM ... INSERT INTO ALBUM ...
  • 객체 조회 시, 부모 테이블과 자식 테이블을 조인해서 조회하여야 한다.
    SELECT I.*, A.* FROM ITEM I JOIN ALBUM A ON I.ITEM_ID = A.ITEM_ID;

 

JPA 해결

  • 객체 저장
    jpa.persist(album)
  • 객체 조회
    Album album = jpa.find(Album.class, albumId);

 

2. 연관관계

문제점(차이점)

  • 객체는 참조 vs. 테이블은 외래 키
  • 객체: 참조가 있는 방향으로만 조회 가능
  • 테이블: 어느 방향이든 조인 가능
  • 테이블에 맞추어 객체를 모델링 → 객체지향의 특징을 잃어버린다.
  • 객체 지향 모델링 → 객체와 테이블 사이의 변환 작업이 필요하다
    • 저장 시, 외래 키 값을 찾아서 넣어줘야 한다.
    • 조회 시, 외래 키 값을 참조 변수로 변환해주어야 한다. (데이터베이스에서 조회하여 모든 정보를 입력해야 한다.)

 

JPA 해결

  • 저장: 연관관계 설정 후 객체를 저장하면 된다.
    member.setTeam(team); 
    Team team = member.getTeam();
  • 조회: 외래 키를 참조로 변환하는 작업을 JPA가 대신 해준다.
    Member member = jpa.find(Member.class, memberId); 
    Team team = member.getTeam();

 

3. 객체 그래프 탐색

문제점(차이점)

  • 객체는 마음껏 객체 그래프를 탐색할 수 있어야 한다. 그러나 SQL을 직접 다루면 처음 실행하는 SQL에 따라 객체 그래프를 어디까지 탐색할 수 있는지 정해지는 큰 제약이 발생한다.
  • 그렇다고 객체와 관련된 모든 객체 그래프를 데이터베이스에서 조회해서 애플리케이션 메모리에 올려두는 것은 현실성이 없다.

JPA 해결

객체 그래프를 마음껏 탐색할 수 있다.

→ 연관된 객체를 사용하는 시점에 적절한 쿼리를 실행하여 연관된 객체를 마음껏 조회할 수 있다.

 지연 로딩 덕분!

→ 즉시 조회 / 지연 로딩 은 간단한 설정으로 정의 가능

 

 

4. 비교

문제점(차이점)

  • 데이터베이스는 기본 키의 값으로 row를 구분한다. 객체는 동일성 비교 (==, 객체 주소 값 비교)와 동등성 비교 (equals, 객체 내부 값 비교)가 존재한다.
  • 같은 row를 조회했더라도, 객체 인스턴스가 다르면 다르다고 인식된다.

JPA 해결

  • JPA는 같은 트랜잭션일 때, 같은 객체가 조회되는 것을 보장한다.

 

 

 

 

728x90