-
1. JPA 소개 - 패러다임의 불일치Back-End/JPA 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'Back-End > JPA' 카테고리의 다른 글
6. 다양한 연관관계 매핑 (0) 2022.04.30 5. 연관관계 매핑 기초 (0) 2022.04.23 4. 엔티티 매핑 (0) 2022.04.17 3. 영속성 관리 (0) 2022.04.11 2. JPA 시작 (0) 2022.04.03